Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a603a40

Browse files
Ch 14: Removed warning messages in my_tail.c
Adjusted buffer references to reflect correct usage of number of buffers loaded
1 parent 74ad90a commit a603a40

File tree

1 file changed

+38
-41
lines changed

1 file changed

+38
-41
lines changed

‎13_File_I_O_Buffering/my_tail.c‎

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /