|
Lines 29-51
Link Here
|
| 29 |
#include "error.h" |
29 |
#include "error.h" |
| 30 |
#include "stringclass.h" |
30 |
#include "stringclass.h" |
| 31 |
|
31 |
|
|
|
32 |
static int include_list_length; |
| 33 |
static char **include_list; |
| 34 |
|
| 32 |
int compatible_flag = 0; |
35 |
int compatible_flag = 0; |
| 33 |
|
36 |
|
| 34 |
extern int interpret_lf_args(const char *); |
37 |
extern int interpret_lf_args(const char *); |
| 35 |
|
38 |
|
| 36 |
int do_file(const char *filename); |
39 |
int do_file(const char *filename); |
| 37 |
|
40 |
|
|
|
41 |
|
| 42 |
static void |
| 43 |
include_path_append(char *path) |
| 44 |
{ |
| 45 |
++include_list_length; |
| 46 |
size_t nbytes = include_list_length * sizeof(include_list[0]); |
| 47 |
include_list = (char **)realloc((void *)include_list, nbytes); |
| 48 |
include_list[include_list_length - 1] = path; |
| 49 |
} |
| 50 |
|
| 51 |
|
| 38 |
void usage() |
52 |
void usage() |
| 39 |
{ |
53 |
{ |
| 40 |
fprintf(stderr, "usage: %s [ -vC ] [ files ]\n", program_name); |
54 |
fprintf(stderr, "usage: %s [ -vCI: ] [ files ]\n", program_name); |
| 41 |
exit(1); |
55 |
exit(1); |
| 42 |
} |
56 |
} |
| 43 |
|
57 |
|
| 44 |
int main(int argc, char **argv) |
58 |
int main(int argc, char **argv) |
| 45 |
{ |
59 |
{ |
| 46 |
program_name = argv[0]; |
60 |
program_name = argv[0]; |
|
|
61 |
include_path_append("."); |
| 47 |
int opt; |
62 |
int opt; |
| 48 |
while ((opt = getopt(argc, argv, "vC")) != EOF) |
63 |
while ((opt = getopt(argc, argv, "CI:v")) != EOF) |
| 49 |
switch (opt) { |
64 |
switch (opt) { |
| 50 |
case 'v': |
65 |
case 'v': |
| 51 |
{ |
66 |
{ |
|
Lines 57-62
Link Here
|
| 57 |
case 'C': |
72 |
case 'C': |
| 58 |
compatible_flag = 1; |
73 |
compatible_flag = 1; |
| 59 |
break; |
74 |
break; |
|
|
75 |
case 'I': |
| 76 |
include_path_append(optarg); |
| 77 |
break; |
| 60 |
case '?': |
78 |
case '?': |
| 61 |
usage(); |
79 |
usage(); |
| 62 |
break; |
80 |
break; |
|
Lines 125-141
Link Here
|
| 125 |
int do_file(const char *filename) |
143 |
int do_file(const char *filename) |
| 126 |
{ |
144 |
{ |
| 127 |
FILE *fp; |
145 |
FILE *fp; |
| 128 |
if (strcmp(filename, "-") == 0) |
146 |
string whole_filename; |
|
|
147 |
if (strcmp(filename, "-") == 0) { |
| 129 |
fp = stdin; |
148 |
fp = stdin; |
| 130 |
else { |
149 |
whole_filename = filename; |
|
|
150 |
whole_filename += '\0'; |
| 151 |
} |
| 152 |
else if (filename[0] == '/') { |
| 153 |
whole_filename = filename; |
| 154 |
whole_filename += '\0'; |
| 131 |
errno = 0; |
155 |
errno = 0; |
| 132 |
fp = fopen(filename, "r"); |
156 |
fp = fopen(filename, "r"); |
| 133 |
if (fp == 0) { |
157 |
if (fp == 0) { |
| 134 |
error("can't open `%1': %2", filename, strerror(errno)); |
158 |
error("can't open `%1': %2", filename, strerror(errno)); |
| 135 |
return 0; |
159 |
return 0; |
| 136 |
} |
160 |
} |
|
|
161 |
} |
| 162 |
else { |
| 163 |
size_t j; |
| 164 |
for (j = 0; j < include_list_length; ++j) |
| 165 |
{ |
| 166 |
char *path = include_list[j]; |
| 167 |
if (0 == strcmp(path, ".")) |
| 168 |
whole_filename = filename; |
| 169 |
else |
| 170 |
whole_filename = string(path) + "/" + filename; |
| 171 |
whole_filename += '\0'; |
| 172 |
errno = 0; |
| 173 |
fp = fopen(whole_filename.contents(), "r"); |
| 174 |
if (fp != 0) |
| 175 |
break; |
| 176 |
if (errno != ENOENT) { |
| 177 |
error("can't open `%1': %2", whole_filename.contents(), strerror(errno)); |
| 178 |
return 0; |
| 179 |
} |
| 180 |
} |
| 181 |
if (j >= include_list_length) |
| 182 |
{ |
| 183 |
errno = ENOENT; |
| 184 |
error("can't open `%1': %2", filename, strerror(errno)); |
| 185 |
return 0; |
| 186 |
} |
| 137 |
} |
187 |
} |
| 138 |
current_filename = filename; |
188 |
current_filename = whole_filename.contents(); |
| 139 |
current_lineno = 1; |
189 |
current_lineno = 1; |
| 140 |
set_location(); |
190 |
set_location(); |
| 141 |
enum { START, MIDDLE, HAD_DOT, HAD_s, HAD_so, HAD_l, HAD_lf } state = START; |
191 |
enum { START, MIDDLE, HAD_DOT, HAD_s, HAD_so, HAD_l, HAD_lf } state = START; |