summaryrefslogtreecommitdiff
path: root/apps/interpreters/bas/main.c
blob: 9c8176cd86864516fcb8b3b33d9e44a158dd38ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* #includes */ /*{{{C}}}*//*{{{*/
#undef  _POSIX_SOURCE
#define _POSIX_SOURCE   1
#undef  _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 2

#include "config.h"

#include <errno.h>
#include <fcntl.h>
#ifdef HAVE_GETTEXT
#include <libintl.h>
#define _(String) gettext(String)
#else
#define _(String) String
#endif
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifdef USE_DMALLOC
#include "dmalloc.h"
#endif

#include "getopt.h"
#include "bas.h"
/*}}}*/

#ifdef CONFIG_BUILD_KERNEL
int main(int argc, FAR char *argv[])
#else
int bas_main(int argc, char *argv[])
#endif
{
  /* variables */ /*{{{*/
  char *runFile=(char*)0;
  int usage=0,o;
  const char *lp="/dev/null";
  int backslash_colon=0;
  int uppercase=0;
  int restricted=0;
  int lpfd;
  static struct option lopts[]=
  {
    { "lp", required_argument, 0, 'l' },
    { "help", no_argument, 0, 'h' },
    { "restricted", no_argument, 0, 'r' },
    { "uppercase", no_argument, 0, 'u' },
    { "backslash-colon", no_argument, 0, 'b' },
    { "version", no_argument, 0, 'V' },
#if defined(__STDC__) && __STDC__
    { (const char*)0, 0, 0, '\0' }
#else
    { (char*)0, 0, 0, '\0' }
#endif
  };
  /*}}}*/

  setlocale(LC_MESSAGES,"");
  setlocale(LC_CTYPE,"");
#ifdef HAVE_GETTEXT
  bindtextdomain("bas",LOCALEDIR);
  textdomain("bas");
#endif
  /* parse arguments */ /*{{{*/
  while ((o=getopt_long(argc,argv,"+bl:ruVh?",lopts,(int*)0))!=EOF) switch (o)
  {
    case 'b': backslash_colon=1; break;
    case 'l': lp=optarg; break;
    case 'u': uppercase=1; break;
    case 'r': restricted=1; break;
    case 'V': printf("bas %s\n", VERSION); exit(0); break;
    case 'h': usage=2; break;
    default: usage=1; break;
  }
  if (optind<argc) runFile=argv[optind++];
  if (usage==1)
  {
    fputs(_("Usage: bas [-b] [-l file] [-r] [-u] [program [argument ...]]\n"),stderr);
    fputs(_("       bas [--backslash-colon] [--lp file] [--restricted] [--uppercase] [program [argument ...]]\n"),stderr);
    fputs(_("       bas -h|--help\n"),stderr);
    fputs(_("       bas --version\n"),stderr);
    fputs(  "\n",stderr);
    fputs(_("Try `bas -h' or `bas --help' for more information.\n"),stderr);
    exit(1);
  }
  if (usage==2)
  {
    fputs(_("Usage: bas [-b] [-l file] [-u] [program [argument ...]]\n"),stdout);
    fputs(_("       bas [--backslash-colon] [--lp file] [--restricted] [--uppercase] [program [argument ...]]\n"),stdout);
    fputs(_("       bas -h|--help\n"),stdout);
    fputs(_("       bas --version\n"),stdout);
    fputs("\n",stdout);
    fputs(_("BASIC interpreter.\n"),stdout);
    fputs("\n",stdout);
    fputs(_("-b, --backslash-colon  convert backslashs to colons\n"),stdout);
    fputs(_("-l, --lp               write LPRINT output to file\n"),stdout);
    fputs(_("-r, --restricted       forbid SHELL\n"),stdout);
    fputs(_("-u, --uppercase        output all tokens in uppercase\n"),stdout);
    fputs(_("-h, --help             display this help and exit\n"),stdout);
    fputs(_("    --version          output version information and exit\n"),stdout);
    fputs("\n",stdout);
    fputs(_("Report bugs to <michael@moria.de>.\n"),stdout);
    exit(0);
  }
  if ((lpfd=open(lp,O_WRONLY|O_CREAT|O_TRUNC,0666))==-1)
  {
    fprintf(stderr,_("bas: Opening `%s' for line printer output failed (%s).\n"),lp,strerror(errno));
    exit(2);
  }
  bas_argc=argc-optind;
  bas_argv=&argv[optind];
  bas_argv0=runFile;
  /*}}}*/
  bas_init(backslash_colon,restricted,uppercase,lpfd);
  if (runFile) bas_runFile(runFile);
  else bas_interpreter();
  bas_exit();
  return(0);
}
/*}}}*/