~ubuntu-branches/ubuntu/vivid/macutils/vivid

« back to all changes in this revision

Viewing changes to macunpack/dir.c

  • Committer: Bazaar Package Importer
  • Author(s): Eric Sharkey
  • Date: 2001-10-27 15:22:18 UTC
  • Revision ID: james.westby@ubuntu.com-20011027152218-oikhfgiaja3hjf5f
Tags: upstream-2.0b3
ImportĀ upstreamĀ versionĀ 2.0b3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "globals.h"
 
2
#include "../fileio/machdr.h"
 
3
#include "../fileio/wrfile.h"
 
4
#include "../util/util.h"
 
5
#include "../util/masks.h"
 
6
 
 
7
extern char *malloc();
 
8
extern char *realloc();
 
9
 
 
10
static char *dir_stack;
 
11
static int dir_ptr = -64;
 
12
static int dir_max;
 
13
 
 
14
void dir(hdr)
 
15
char *hdr;
 
16
{
 
17
int doit;
 
18
 
 
19
    if((hdr[I_NAMEOFF] & BYTEMASK) == 0x80) {
 
20
        if(dir_skip) {
 
21
            dir_skip--;
 
22
            return;
 
23
        }
 
24
        indent--;
 
25
        if(list) {
 
26
            do_indent(indent);
 
27
            (void)fprintf(stderr, "leaving folder \"%s\"\n",
 
28
                    dir_stack + dir_ptr);
 
29
        }
 
30
        if(!info_only) {
 
31
            enddir();
 
32
        }
 
33
        dir_ptr -= 64;
 
34
        return;
 
35
    }
 
36
    if(dir_skip) {
 
37
        dir_skip++;
 
38
        return;
 
39
    }
 
40
    dir_ptr += 64;
 
41
    if(dir_ptr == dir_max) {
 
42
        if(dir_max == 0) {
 
43
            dir_stack = malloc(64);
 
44
        } else {
 
45
            dir_stack = realloc(dir_stack, (unsigned)dir_max + 64);
 
46
        }
 
47
        dir_max += 64;
 
48
        if(dir_stack == NULL) {
 
49
            (void)fprintf(stderr, "Insufficient memory\n");
 
50
            exit(1);
 
51
        }
 
52
    }
 
53
    transname(hdr + I_NAMEOFF + 1, dir_stack + dir_ptr,
 
54
              (int)(hdr[I_NAMEOFF] & 0x7f));
 
55
    doit = 1;
 
56
    if(list) {
 
57
        do_indent(indent);
 
58
        (void)fprintf(stderr, "folder=\"%s\"", dir_stack + dir_ptr);
 
59
        if(query) {
 
60
            doit = do_query();
 
61
        } else {
 
62
            (void)fputc('\n', stderr);
 
63
        }
 
64
    }
 
65
    if(!doit) {
 
66
        dir_ptr -= 64;
 
67
        dir_skip = 1;
 
68
        return;
 
69
    }
 
70
    if(!info_only) {
 
71
        do_mkdir(dir_stack + dir_ptr, hdr);
 
72
    }
 
73
    indent++;
 
74
}
 
75