Merge nodehelper lib and example codes into charm
[charm.git] / src / xlat-i / xi-main.C
1 #include <iostream>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "xi-symbol.h"
5 #include <string>
6
7 using std::cout;
8 using std::endl;
9
10 extern FILE *yyin;
11 extern void yyrestart ( FILE *input_file );
12 extern int yyparse (void);
13 extern int yyerror(char *);
14
15 extern xi::ModuleList *modlist;
16
17 namespace xi {
18
19 #include "xi-grammar.tab.h"
20
21 /******************* Macro defines ****************/
22 class MacroDefinition {
23 public:
24   char *key;
25   char *val;
26   MacroDefinition(): key(NULL), val(NULL) {}
27   MacroDefinition(char *k, char *v): key(k), val(v) {}
28   MacroDefinition(char *str) {
29     // split by '='
30     char *equal = strchr(str, '=');
31     if (equal) {
32       *equal = 0;
33       key = str;
34       val = equal+1;
35     }
36     else {
37       key = str;
38       val = (char*)"";
39     }
40   }
41   char *match(const char *k) { if (!strcmp(k, key)) return val; return NULL; }
42 };
43
44 static TList<MacroDefinition *> macros;
45
46 int macroDefined(const char *str, int istrue)
47 {
48   MacroDefinition *def;
49   for (def = macros.begin(); !macros.end(); def=macros.next()) {
50     char *val = def->match(str);
51     if (val) {
52       if (!istrue) return 1;
53       else return atoi(val);
54     }
55   }
56   return 0;
57 }
58
59 // input: name
60 // output: basename (pointer somewhere inside name)
61 //         scope (null if name is unscoped, newly allocated string otherwise)
62 void splitScopedName(const char* name, const char** scope, const char** basename) {
63     const char* scopeEnd = strrchr(name, ':');
64     if (!scopeEnd) {
65         *scope = NULL;
66         *basename = name;
67         return;
68     }
69     *basename = scopeEnd+1;
70     int len = scopeEnd-name+1; /* valid characters to copy */
71     char *tmp = new char[len+1];
72     strncpy(tmp, name, len);
73     tmp[len]=0; /* gotta null-terminate C string */
74     *scope = tmp;
75 }
76
77 FILE *openFile(char *interfacefile)
78 {
79   if (interfacefile == NULL) {
80     cur_file = "STDIN";
81     return stdin;
82   }
83   else {
84     cur_file=interfacefile;
85     FILE *fp = fopen (interfacefile, "r") ;
86     if (fp == NULL) {
87       cout << "ERROR : could not open " << interfacefile << endl;
88       exit(1);
89     }
90     return fp;
91   }
92   return NULL;
93 }
94
95 /*
96 ModuleList *Parse(char *interfacefile)
97 {
98   cur_file=interfacefile;
99   FILE * fp = fopen (interfacefile, "r") ;
100   if (fp) {
101     yyin = fp ;
102     if(yyparse())
103       exit(1);
104     fclose(fp) ;
105   } else {
106     cout << "ERROR : could not open " << interfacefile << endl ;
107   }
108   return modlist;
109 }
110 */
111
112 ModuleList *Parse(FILE *fp)
113 {
114   modlist = NULL;
115   yyin = fp ;
116   if(yyparse())
117       exit(1);
118   fclose(fp) ;
119   return modlist;
120 }
121
122
123 void abortxi(char *name)
124 {
125   cout << "Usage : " << name << " [-ansi|-f90|-intrinsic|-M]  module.ci" << endl;
126   exit(1) ;
127 }
128
129 }
130
131 using namespace xi;
132
133 int main(int argc, char *argv[])
134 {
135   char *fname=NULL;
136   fortranMode = 0;
137   internalMode = 0;
138   bool dependsMode = false;
139
140   for (int i=1; i<argc; i++) {
141     if (*argv[i]=='-') {
142       if (strcmp(argv[i],"-ansi")==0);
143       else if (strcmp(argv[i],"-f90")==0)  fortranMode = 1;
144       else if (strcmp(argv[i],"-intrinsic")==0)  internalMode = 1;
145       else if (strncmp(argv[i],"-D", 2)==0)  macros.append(new MacroDefinition(argv[i]+2));
146       else if (strncmp(argv[i], "-M", 2)==0) dependsMode = true;
147       else abortxi(argv[0]);
148     }
149     else
150       fname = argv[i];
151   }
152   //if (fname==NULL) abortxi(argv[0]);
153
154   ModuleList *m = Parse(openFile(fname)) ;
155   if (!m) return 0;
156   m->preprocess();
157   if (dependsMode)
158   {
159       std::string ciFileBaseName = fname;
160       size_t loc = ciFileBaseName.rfind('/');
161       if(loc != std::string::npos)
162           ciFileBaseName = ciFileBaseName.substr(loc+1);
163       m->genDepends(ciFileBaseName);
164   }
165   else
166       m->generate();
167   return 0 ;
168 }