@@ -27,6 +27,24 @@ static void usage_error(char *pgm_name, char *msg)
2727 exit (EXIT_FAILURE );
2828}
2929
30+ /* --------------------------------------------------------------------------
31+ | Free storage associated with dynamic data structures
32+ * -------------------------------------------------------------------------- */
33+ 34+ static void free_buffers (char * * buffers , int num_blocks )
35+ {
36+ if (buffers == NULL ) return ;
37+ 38+ for (int i = 0 ; i < num_blocks ; i ++ )
39+ {
40+ if (buffers [i ] != NULL )
41+ {
42+ free (buffers [i ]);
43+ }
44+ }
45+ free (buffers );
46+ }
47+ 3048/* --------------------------------------------------------------------------
3149 * Main program
3250 * -------------------------------------------------------------------------- */
@@ -159,57 +177,45 @@ int main(int argc, char *argv[])
159177 fprintf (stderr ,
160178 "failed to allocate I/O buffer: %m\n" );
161179 close (fd );
162- for (int i = 0 ; i < num_blocks ; i ++ )
163- {
164- if (buffers [i ] != NULL )
165- {
166- free (buffers [i ]);
167- }
168- }
169- free (buffers );
180+ free_buffers (buffers , num_blocks );
170181 exit (EXIT_FAILURE );
171182 }
183+ num_buffers_loaded ++ ;
172184
173185 if (verbosity > 0 ) fprintf (stderr , "Seeking offset #%ld\n" , blk_offset );
174186 if (lseek (fd , (off_t )blk_offset , SEEK_SET ) == (off_t )- 1 ) {
175187 fprintf (stderr ,
176188 "failed to lseek to offset %ld: %m\n" ,
177189 blk_offset );
178190 close (fd );
179- for (int i = 0 ; i < num_blocks ; i ++ )
180- {
181- if (buffers [i ] != NULL )
182- {
183- free (buffers [i ]);
184- }
185- }
186- free (buffers );
191+ free_buffers (buffers , num_blocks );
187192 exit (EXIT_FAILURE );
188193 }
189194
190- if (verbosity > 0 ) fprintf (stderr , "Reading block into buffer #%d at %p\n" , num_buffers_loaded , buffers [num_buffers_loaded ]);
191- ssize_t bytes_read = read (fd , (void * )(buffers [num_buffers_loaded ]), (size_t )block_size );
195+ if (verbosity > 0 )
196+ {
197+ fprintf (stderr ,
198+ "Reading block into buffer #%d at %p\n" ,
199+ num_buffers_loaded - 1 ,
200+ buffers [num_buffers_loaded - 1 ]);
201+ }
202+ ssize_t bytes_read = read (fd ,
203+ (void * )(buffers [num_buffers_loaded - 1 ]),
204+ (size_t )block_size );
192205
193206 if (bytes_read == -1 )
194207 {
195208 fprintf (stderr ,
196209 "failed to read from file: %m\n" );
197210 close (fd );
198- for (int i = 0 ; i < num_blocks ; i ++ )
199- {
200- if (buffers [i ] != NULL )
201- {
202- free (buffers [i ]);
203- }
204- }
205- free (buffers );
211+ free_buffers (buffers , num_blocks );
206212 exit (EXIT_FAILURE );
207213 }
208214
209- buffers [num_buffers_loaded ][bytes_read ] = '0円' ; /* Put in teminating null */
215+ buffers [num_buffers_loaded - 1 ][bytes_read ] = '0円' ; /* Put in teminating null */
210216
211- for (cp = buffers [num_buffers_loaded ] + bytes_read - 1 ;
212- cp >= buffers [num_buffers_loaded ];
217+ for (cp = buffers [num_buffers_loaded - 1 ] + bytes_read - 1 ;
218+ cp >= buffers [num_buffers_loaded - 1 ];
213219 cp -- )
214220 {
215221 if (* cp == '\n' ) num_lines_found ++ ;
@@ -222,8 +228,6 @@ int main(int argc, char *argv[])
222228 }
223229
224230 if (verbosity > 0 ) fprintf (stderr , "num_lines_found=%d\n" , num_lines_found );
225- 226- num_buffers_loaded ++ ;
227231
228232 if (num_lines_found == num_lines_required ) break ;
229233
@@ -234,23 +238,16 @@ int main(int argc, char *argv[])
234238 if (cp != NULL )
235239 {
236240 if (verbosity > 0 ) fprintf (stderr , "print partial buffer at %p\n" , cp );
237- printf (cp );
241+ printf ("%s" , cp );
238242 for (int i = num_buffers_loaded - 2 ; i >= 0 ; i -- )
239243 {
240244 if (verbosity > 0 ) fprintf (stderr , "print buffer #%d at %p\n" , i , buffers [i ]);
241- printf (buffers [i ]);
245+ printf ("%s" , buffers [i ]);
242246 }
243247 }
244248
245249 close (fd );
246- for (int i = 0 ; i < num_blocks ; i ++ )
247- {
248- if (buffers [i ] != NULL )
249- {
250- free (buffers [i ]);
251- }
252- }
253- free (buffers );
250+ free_buffers (buffers , num_blocks );
254251
255252 exit (EXIT_SUCCESS );
256253}
0 commit comments