root/NEWT0/trunk/src/main.c

Revision 135, 10.0 kB (checked in by matthiasm, 3 weeks ago)

Testing bilingual documentation for Doxygen comments.

Line 
1/*------------------------------------------------------------------------*/
2/**
3 * @file    main.c
4 * \~japanese @brief メイン関数(CUI コマンド)
5 * \~english  @brief the main function (CUI command)
6 * \~
7 *
8 * @author  M.Nukui
9 * @date    2003-11-07
10 *
11 * Copyright (C) 2003-2004 M.Nukui All rights reserved.
12 */
13
14
15/* ヘッダファイル */
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <unistd.h>
20
21#include "NewtCore.h"
22#include "NewtBC.h"
23#include "NewtVM.h"
24#include "NewtParser.h"
25#include "lookup_words.h"
26#include "yacc.h"
27#include "version.h"
28
29
30/* 定数 */
31
32/// オプション
33enum {
34    optNone         = 0,
35    optNos2,
36    optCopyright,
37    optVersion,
38    optStaff,
39};
40
41
42/* ローカル変数 */
43
44/// オプションキーワードのルックアップテーブル
45static keyword_t    reserved_words[] = {
46        // アルファベット順にソートしておくこと
47        {"copyright",   optCopyright},
48        {"newton",      optNos2},
49        {"nos2",        optNos2},
50        {"staff",       optStaff},
51        {"version",     optVersion},
52    };
53
54
55/// 作業ディレクトリ
56static const char *     newt_currdir;
57
58
59/* 関数プロトタイプ */
60#ifdef __cplusplus
61extern "C" {
62#endif
63
64
65int main (int argc, const char * argv[]);
66
67
68#ifdef __cplusplus
69}
70#endif
71
72
73static void     newt_result_message(newtRefArg r, newtErr err);
74
75static newtErr  newt_info(int argc, const char * argv[], int n);
76static newtErr  newt_interpret_str(int argc, const char * argv[], int n);
77static newtErr  newt_interpret_file(int argc, const char * argv[], int n);
78
79static void     newt_chdir(void);
80
81static void     newt_show_copyright(void);
82static void     newt_show_version(void);
83static void     newt_show_staff(void);
84static void     newt_show_usage(void);
85
86static void     newt_invalid_option(char c);
87static void     newt_option_switchs(const char * s);
88static void     newt_option(const char * s);
89static newtErr  newt_option_with_arg(char c, int argc, const char * argv[], int n);
90
91
92#if 0
93#pragma mark -
94#endif
95/*------------------------------------------------------------------------*/
96/**
97 * \~japanese
98 * 結果を表示
99 * @param r         [in] オブジェクト
100 * @param err       [in] エラーコード
101 * @return          なし
102 
103 * \~english
104 * Show message for this error code
105 * @param r [in] object
106 * @param err [in] error code
107 * @return no return value 
108 
109 * \~
110 */
111
112void newt_result_message(newtRefArg r, newtErr err)
113{
114    if (err != kNErrNone)
115        NewtErrMessage(err);
116    else if (NEWT_DEBUG)
117        NsPrint(kNewtRefNIL, r);
118}
119
120
121#if 0
122#pragma mark -
123#endif
124/*------------------------------------------------------------------------*/
125/** コマンドライン引数で指定された関数の情報を表示
126 *
127 * @param argc      [in] コマンドライン引数の数
128 * @param argv      [in] コマンドライン引数の配列
129 * @param n         [in] コマンドライン引数の位置
130 *
131 * @return          エラーコード
132 */
133
134newtErr newt_info(int argc, const char * argv[], int n)
135{
136    newtErr err = kNErrNone;
137    int     i;
138
139    NewtInit(argc, argv, argc);
140    newt_chdir();
141
142    if (n < argc)
143    {
144        for (i = n; i < argc; i++)
145        {
146            err = NVMInfo(argv[i]);
147            NewtErrMessage(err);
148        }
149    }
150    else
151    {   //引数がない場合は関数一覧を表示
152        err = NVMInfo(NULL);
153        NewtErrMessage(err);
154    }
155
156    NewtCleanup();
157
158    return err;
159}
160
161
162/*------------------------------------------------------------------------*/
163/** コマンドライン引数で指定された文字列をインタプリタ実行する
164 *
165 * @param argc      [in] コマンドライン引数の数
166 * @param argv      [in] コマンドライン引数の配列
167 * @param n         [in] コマンドライン引数の位置
168 *
169 * @return          エラーコード
170 */
171
172newtErr newt_interpret_str(int argc, const char * argv[], int n)
173{
174    newtRefVar  result;
175    newtErr err;
176
177    NewtInit(argc, argv, n + 1);
178    newt_chdir();
179    result = NVMInterpretStr(argv[n], &err);
180    newt_result_message(result, err);
181    NewtCleanup();
182
183    return err;
184}
185
186
187/*------------------------------------------------------------------------*/
188/** ファイルをインタプリタ実行する
189 *
190 * @param argc      [in] コマンドライン引数の数
191 * @param argv      [in] コマンドライン引数の配列
192 * @param n         [in] コマンドライン引数の位置
193 *
194 * @return          エラーコード
195 */
196
197newtErr newt_interpret_file(int argc, const char * argv[], int n)
198{
199    const char * path = NULL;
200    newtRefVar  result;
201    newtErr err;
202
203    if (n < argc)
204    {
205        path = argv[n];
206        n++;
207    }
208
209    NewtInit(argc, argv, n);
210    newt_chdir();
211    result = NVMInterpretFile(path, &err);
212    newt_result_message(result, err);
213    NewtCleanup();
214
215    return err;
216}
217
218
219#if 0
220#pragma mark -
221#endif
222/*------------------------------------------------------------------------*/
223/** 作業ディレクトリを変更 */
224void newt_chdir(void)
225{
226#ifdef HAVE_CHDIR 
227    if (newt_currdir != NULL)
228        chdir(newt_currdir);
229#endif /* HAVE_CHDIR */
230}
231
232
233#if 0
234#pragma mark -
235#endif
236/*------------------------------------------------------------------------*/
237/** コピーライトを表示 */
238void newt_show_copyright(void)
239{
240    fprintf(stderr, "%s - %s\n", NEWT_NAME, NEWT_COPYRIGHT);
241}
242
243
244/** バージョン情報を表示 */
245void newt_show_version(void)
246{
247    fprintf(stderr, "%s%s %s(%s)\n", NEWT_NAME, NEWT_PROTO,
248                NEWT_VERSION, NEWT_BUILD);
249}
250
251
252/** スタッフ情報を表示 */
253void newt_show_staff(void)
254{
255    fprintf(stderr, "%s%s %s\n\n%s\n", NEWT_NAME, NEWT_PROTO, NEWT_VERSION,
256                NEWT_STAFF);
257}
258
259
260/** 使用法を表示 */
261void newt_show_usage(void)
262{
263    fprintf(stderr, "Usage: %s %s\n%s", NEWT_NAME, NEWT_PARAMS, NEWT_USAGE);
264}
265
266
267#if 0
268#pragma mark -
269#endif
270/*------------------------------------------------------------------------*/
271/** オプションエラーを表示
272 *
273 * @param c         [in] オプション文字
274 *
275 * @return          なし
276 */
277
278void newt_invalid_option(char c)
279{
280    fprintf(stderr, "invalid option -%c (-h will show valid options)\n", c);
281}
282
283
284/*------------------------------------------------------------------------*/
285/** オプションスイッチの解析
286 *
287 * @param s         [in] オプションスイッチ
288 *
289 * @return          なし
290 */
291
292void newt_option_switchs(const char * s)
293{
294    while (*s)
295    {
296        switch (*s)
297        {
298            case 'd':
299                NEWT_DEBUG = true;
300                break;
301
302            case 't':
303                NEWT_TRACE = true;
304                break;
305
306            case 'l':
307                NEWT_DUMPLEX = true;
308                break;
309
310            case 's':
311                NEWT_DUMPSYNTAX = true;
312                break;
313
314            case 'b':
315                NEWT_DUMPBC = true;
316                break;
317
318            case 'I':
319                NEWT_INDENT = 1;
320                break;
321
322            case 'v':
323                newt_show_version();
324                exit(0);
325                break;
326
327            case 'h':
328                newt_show_usage();
329                exit(0);
330                break;
331
332            default:
333                newt_invalid_option(*s);
334                exit(0);
335                break;
336        }
337
338        s++;
339    }
340}
341
342
343/*------------------------------------------------------------------------*/
344/** オプション文字列の解析
345 *
346 * @param s         [in] オプション文字列
347 *
348 * @return          なし
349 */
350
351void newt_option(const char * s)
352{
353    int wlen;
354
355    wlen = sizeof(reserved_words) / sizeof(keyword_t);
356
357    switch (lookup_words(reserved_words, wlen, s))
358    {
359        // NOS2 コンパチブル
360        case optNos2:
361            NEWT_MODE_NOS2 = true;
362            break;
363
364        // コピーライト
365        case optCopyright:
366            newt_show_copyright();
367            exit(0);
368            break;
369
370        // バージョン
371        case optVersion:
372            newt_show_version();
373            exit(0);
374            break;
375
376        // スタッフロール
377        case optStaff:
378            newt_show_staff();
379            exit(0);
380            break;
381    }
382}
383
384
385/*------------------------------------------------------------------------*/
386/** オプションの引数を解析する
387 *
388 * @param c         [in] オプション文字
389 * @param argc      [in] コマンドライン引数の数
390 * @param argv      [in] コマンドライン引数の配列
391 * @param n         [in] コマンドライン引数の位置
392 *
393 * @return          エラーコード
394 */
395
396newtErr newt_option_with_arg(char c, int argc, const char * argv[], int n)
397{
398    newtErr err = kNErrNone;
399
400    switch (c)
401    {
402        case 'i':
403            err = newt_info(argc, argv, n);
404            break;
405
406        case 'e':
407            if (n < argc)
408                err = newt_interpret_str(argc, argv, n);
409            break;
410    }
411
412    return err;
413}
414
415
416#if 0
417#pragma mark -
418#endif
419/*------------------------------------------------------------------------*/
420/** main 関数(CUI コマンド)
421 *
422 * @brief NewtonScript インタプリタ
423 *
424 * @param argc      [in] コマンドライン引数の数
425 * @param argv      [in] コマンドライン引数の配列
426 *
427 * @return          エラーコード
428 */
429
430int main (int argc, const char * argv[])
431{
432    const char *    s;
433    newtErr err = kNErrNone;
434    int     i;
435
436    for (i = 1; i < argc; i++)
437    {
438        s = argv[i];
439
440        if (strlen(s) == 0) break;
441        if (*s != '-') break;
442
443        s++;
444
445        if (*s == '-')
446        {
447            newt_option(s + 1);
448            i++;
449            break;
450        }
451
452        switch (*s)
453        {
454            case 'C':
455                i++;
456                newt_currdir = argv[i];
457                break;
458
459            case 'i':
460            case 'e':
461                i++;
462                err = newt_option_with_arg(*s, argc, argv, i);
463                exit(err);
464                break;
465
466            default:
467                newt_option_switchs(s);
468                break;
469        }
470    }
471
472    err = newt_interpret_file(argc, argv, i);
473
474    return err;
475}
476
477
478/*------------------------------------------------------------------------*/
479/** パーサエラー
480 *
481 * @param s         [in] エラーメッセージ文字列
482 *
483 * @return          なし
484 */
485
486void yyerror(char * s)
487{
488    if (s[0] && s[1] == ':')
489        NPSErrorStr(*s, s + 2);
490    else
491        NPSErrorStr('E', s);
492}
Note: See TracBrowser for help on using the browser.