af9f00118aba6a74c3ea0332fa26105e4cd6475b
6 #define die(s, as...) {fprintf(stderr, s, ## as); return EXIT_FAILURE;}
7 #define check_fail(v, s, f) if((v) == f) die("%s(): %s\n", s, strerror(errno))
8 #define check_null(v, s) check_fail(v, s, NULL)
10 #define INITIALBUFSIZE 2
17 int main(int argc
, char *argv
[])
19 size_t offset
, stacksize
, depth
;
21 struct nest
*temp
, *stack
;
25 die("Usage: %s PROGRAM\n", argv
[0]);
28 check_null(in
= fopen(argv
[1], "r"), "fopen");
29 check_null(buf
= calloc(stacksize
= INITIALBUFSIZE
, 1), "calloc");
36 check_fail(fclose(in
), "fclose", -1);
39 if(++ptr
>= buf
+stacksize
){
41 check_null(buf
= realloc(buf
, stacksize
*=2), "realloc");
43 memset(ptr
, 0, stacksize
/2);
48 die("There is no stack position -1\n");
66 check_null(stack
= malloc(sizeof(struct nest
)), "malloc");
68 check_fail(stack
->pos
= ftell(in
), "ftell", -1);
83 check_fail(fseek(in
, stack
->pos
-1, SEEK_SET
), "fseek", -1);