main.c

説明を見る。
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 /* HAVE_CHDIR */
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         // NOS2 コンパチブル
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 

NEWT/0に対してThu Nov 23 16:50:42 2006に生成されました。  doxygen 1.5.0