00001
00013
00014 #include <stdio.h>
00015 #include <stdlib.h>
00016 #include <string.h>
00017 #include <unistd.h>
00018
00019 #include "NewtCore.h"
00020 #include "NewtBC.h"
00021 #include "NewtVM.h"
00022 #include "NewtParser.h"
00023 #include "lookup_words.h"
00024 #include "yacc.h"
00025 #include "version.h"
00026
00027
00028
00029
00031 enum {
00032 optNone = 0,
00033 optNos2,
00034 optCopyright,
00035 optVersion,
00036 optStaff,
00037 };
00038
00039
00040
00041
00043 static keyword_t reserved_words[] = {
00044
00045 {"copyright", optCopyright},
00046 {"newton", optNos2},
00047 {"nos2", optNos2},
00048 {"staff", optStaff},
00049 {"version", optVersion},
00050 };
00051
00052
00054 static const char * newt_currdir;
00055
00056
00057
00058 #ifdef __cplusplus
00059 extern "C" {
00060 #endif
00061
00062
00063 int main (int argc, const char * argv[]);
00064
00065
00066 #ifdef __cplusplus
00067 }
00068 #endif
00069
00070
00071 static void newt_result_message(newtRefArg r, newtErr err);
00072
00073 static newtErr newt_info(int argc, const char * argv[], int n);
00074 static newtErr newt_interpret_str(int argc, const char * argv[], int n);
00075 static newtErr newt_interpret_file(int argc, const char * argv[], int n);
00076
00077 static void newt_chdir(void);
00078
00079 static void newt_show_copyright(void);
00080 static void newt_show_version(void);
00081 static void newt_show_staff(void);
00082 static void newt_show_usage(void);
00083
00084 static void newt_invalid_option(char c);
00085 static void newt_option_switchs(const char * s);
00086 static void newt_option(const char * s);
00087 static newtErr newt_option_with_arg(char c, int argc, const char * argv[], int n);
00088
00089
00090 #pragma mark -
00091
00100 void newt_result_message(newtRefArg r, newtErr err)
00101 {
00102 if (err != kNErrNone)
00103 NewtErrMessage(err);
00104 else if (NEWT_DEBUG)
00105 NsPrint(kNewtRefNIL, r);
00106 }
00107
00108
00109 #pragma mark -
00110
00120 newtErr newt_info(int argc, const char * argv[], int n)
00121 {
00122 newtErr err = kNErrNone;
00123 int i;
00124
00125 NewtInit(argc, argv, argc);
00126 newt_chdir();
00127
00128 if (n < argc)
00129 {
00130 for (i = n; i < argc; i++)
00131 {
00132 err = NVMInfo(argv[i]);
00133 NewtErrMessage(err);
00134 }
00135 }
00136 else
00137 {
00138 err = NVMInfo(NULL);
00139 NewtErrMessage(err);
00140 }
00141
00142 NewtCleanup();
00143
00144 return err;
00145 }
00146
00147
00148
00158 newtErr newt_interpret_str(int argc, const char * argv[], int n)
00159 {
00160 newtRefVar result;
00161 newtErr err;
00162
00163 NewtInit(argc, argv, n + 1);
00164 newt_chdir();
00165 result = NVMInterpretStr(argv[n], &err);
00166 newt_result_message(result, err);
00167 NewtCleanup();
00168
00169 return err;
00170 }
00171
00172
00173
00183 newtErr newt_interpret_file(int argc, const char * argv[], int n)
00184 {
00185 const char * path = NULL;
00186 newtRefVar result;
00187 newtErr err;
00188
00189 if (n < argc)
00190 {
00191 path = argv[n];
00192 n++;
00193 }
00194
00195 NewtInit(argc, argv, n);
00196 newt_chdir();
00197 result = NVMInterpretFile(path, &err);
00198 newt_result_message(result, err);
00199 NewtCleanup();
00200
00201 return err;
00202 }
00203
00204
00205 #pragma mark -
00206
00208 void newt_chdir(void)
00209 {
00210 #ifdef HAVE_CHDIR
00211 if (newt_currdir != NULL)
00212 chdir(newt_currdir);
00213 #endif
00214 }
00215
00216
00217 #pragma mark -
00218
00220 void newt_show_copyright(void)
00221 {
00222 fprintf(stderr, "%s - %sn", NEWT_NAME, NEWT_COPYRIGHT);
00223 }
00224
00225
00227 void newt_show_version(void)
00228 {
00229 fprintf(stderr, "%s%s %s(%s)n", NEWT_NAME, NEWT_PROTO,
00230 NEWT_VERSION, NEWT_BUILD);
00231 }
00232
00233
00235 void newt_show_staff(void)
00236 {
00237 fprintf(stderr, "%s%s %snn%sn", NEWT_NAME, NEWT_PROTO, NEWT_VERSION,
00238 NEWT_STAFF);
00239 }
00240
00241
00243 void newt_show_usage(void)
00244 {
00245 fprintf(stderr, "Usage: %s %sn%s", NEWT_NAME, NEWT_PARAMS, NEWT_USAGE);
00246 }
00247
00248
00249 #pragma mark -
00250
00258 void newt_invalid_option(char c)
00259 {
00260 fprintf(stderr, "invalid option -%c (-h will show valid options)n", c);
00261 }
00262
00263
00264
00272 void newt_option_switchs(const char * s)
00273 {
00274 while (*s)
00275 {
00276 switch (*s)
00277 {
00278 case 'd':
00279 NEWT_DEBUG = true;
00280 break;
00281
00282 case 't':
00283 NEWT_TRACE = true;
00284 break;
00285
00286 case 'l':
00287 NEWT_DUMPLEX = true;
00288 break;
00289
00290 case 's':
00291 NEWT_DUMPSYNTAX = true;
00292 break;
00293
00294 case 'b':
00295 NEWT_DUMPBC = true;
00296 break;
00297
00298 case 'v':
00299 newt_show_version();
00300 exit(0);
00301 break;
00302
00303 case 'h':
00304 newt_show_usage();
00305 exit(0);
00306 break;
00307
00308 default:
00309 newt_invalid_option(*s);
00310 exit(0);
00311 break;
00312 }
00313
00314 s++;
00315 }
00316 }
00317
00318
00319
00327 void newt_option(const char * s)
00328 {
00329 int wlen;
00330
00331 wlen = sizeof(reserved_words) / sizeof(keyword_t);
00332
00333 switch (lookup_words(reserved_words, wlen, s))
00334 {
00335
00336 case optNos2:
00337 NEWT_MODE_NOS2 = true;
00338 break;
00339
00340
00341 case optCopyright:
00342 newt_show_copyright();
00343 exit(0);
00344 break;
00345
00346
00347 case optVersion:
00348 newt_show_version();
00349 exit(0);
00350 break;
00351
00352
00353 case optStaff:
00354 newt_show_staff();
00355 exit(0);
00356 break;
00357 }
00358 }
00359
00360
00361
00372 newtErr newt_option_with_arg(char c, int argc, const char * argv[], int n)
00373 {
00374 newtErr err = kNErrNone;
00375
00376 switch (c)
00377 {
00378 case 'i':
00379 err = newt_info(argc, argv, n);
00380 break;
00381
00382 case 'e':
00383 if (n < argc)
00384 err = newt_interpret_str(argc, argv, n);
00385 break;
00386 }
00387
00388 return err;
00389 }
00390
00391
00392 #pragma mark -
00393
00404 int main (int argc, const char * argv[])
00405 {
00406 const char * s;
00407 newtErr err = kNErrNone;
00408 int i;
00409
00410 for (i = 1; i < argc; i++)
00411 {
00412 s = argv[i];
00413
00414 if (strlen(s) == 0) break;
00415 if (*s != '-') break;
00416
00417 s++;
00418
00419 if (*s == '-')
00420 {
00421 newt_option(s + 1);
00422 i++;
00423 break;
00424 }
00425
00426 switch (*s)
00427 {
00428 case 'C':
00429 i++;
00430 newt_currdir = argv[i];
00431 break;
00432
00433 case 'i':
00434 case 'e':
00435 i++;
00436 err = newt_option_with_arg(*s, argc, argv, i);
00437 exit(err);
00438 break;
00439
00440 default:
00441 newt_option_switchs(s);
00442 break;
00443 }
00444 }
00445
00446 err = newt_interpret_file(argc, argv, i);
00447
00448 return err;
00449 }
00450
00451
00452
00460 void yyerror(char * s)
00461 {
00462 if (s[0] && s[1] == ':')
00463 NPSErrorStr(*s, s + 2);
00464 else
00465 NPSErrorStr('E', s);
00466 }
00467