00001 #include <iostream>
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include "xi-symbol.h"
00005 #include <string>
00006
00007 using std::cout;
00008 using std::endl;
00009
00010 extern FILE *yyin;
00011 extern void yyrestart ( FILE *input_file );
00012 extern int yyparse (void);
00013 extern int yyerror(char *);
00014
00015 extern xi::ModuleList *modlist;
00016
00017 namespace xi {
00018
00019 #include "xi-grammar.tab.h"
00020
00021
00022 class MacroDefinition {
00023 public:
00024 char *key;
00025 char *val;
00026 MacroDefinition(): key(NULL), val(NULL) {}
00027 MacroDefinition(char *k, char *v): key(k), val(v) {}
00028 MacroDefinition(char *str) {
00029
00030 char *equal = strchr(str, '=');
00031 if (equal) {
00032 *equal = 0;
00033 key = str;
00034 val = equal+1;
00035 }
00036 else {
00037 key = str;
00038 val = (char*)"";
00039 }
00040 }
00041 char *match(const char *k) { if (!strcmp(k, key)) return val; return NULL; }
00042 };
00043
00044 static TList<MacroDefinition *> macros;
00045
00046 int macroDefined(const char *str, int istrue)
00047 {
00048 MacroDefinition *def;
00049 for (def = macros.begin(); !macros.end(); def=macros.next()) {
00050 char *val = def->match(str);
00051 if (val) {
00052 if (!istrue) return 1;
00053 else return atoi(val);
00054 }
00055 }
00056 return 0;
00057 }
00058
00059
00060
00061
00062 void splitScopedName(const char* name, const char** scope, const char** basename) {
00063 const char* scopeEnd = strrchr(name, ':');
00064 if (!scopeEnd) {
00065 *scope = NULL;
00066 *basename = name;
00067 return;
00068 }
00069 *basename = scopeEnd+1;
00070 int len = scopeEnd-name+1;
00071 char *tmp = new char[len+1];
00072 strncpy(tmp, name, len);
00073 tmp[len]=0;
00074 *scope = tmp;
00075 }
00076
00077 FILE *openFile(char *interfacefile)
00078 {
00079 if (interfacefile == NULL) {
00080 cur_file = "STDIN";
00081 return stdin;
00082 }
00083 else {
00084 cur_file=interfacefile;
00085 FILE *fp = fopen (interfacefile, "r") ;
00086 if (fp == NULL) {
00087 cout << "ERROR : could not open " << interfacefile << endl;
00088 exit(1);
00089 }
00090 return fp;
00091 }
00092 return NULL;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 ModuleList *Parse(FILE *fp)
00113 {
00114 modlist = NULL;
00115 yyin = fp ;
00116 if(yyparse())
00117 exit(1);
00118 fclose(fp) ;
00119 return modlist;
00120 }
00121
00122
00123 void abortxi(char *name)
00124 {
00125 cout << "Usage : " << name << " [-ansi|-f90|-intrinsic|-M] module.ci" << endl;
00126 exit(1) ;
00127 }
00128
00129 }
00130
00131 using namespace xi;
00132
00133 int main(int argc, char *argv[])
00134 {
00135 char *fname=NULL;
00136 fortranMode = 0;
00137 internalMode = 0;
00138 bool dependsMode = false;
00139
00140 for (int i=1; i<argc; i++) {
00141 if (*argv[i]=='-') {
00142 if (strcmp(argv[i],"-ansi")==0);
00143 else if (strcmp(argv[i],"-f90")==0) fortranMode = 1;
00144 else if (strcmp(argv[i],"-intrinsic")==0) internalMode = 1;
00145 else if (strncmp(argv[i],"-D", 2)==0) macros.append(new MacroDefinition(argv[i]+2));
00146 else if (strncmp(argv[i], "-M", 2)==0) dependsMode = true;
00147 else abortxi(argv[0]);
00148 }
00149 else
00150 fname = argv[i];
00151 }
00152
00153
00154 ModuleList *m = Parse(openFile(fname)) ;
00155 if (!m) return 0;
00156 m->preprocess();
00157 if (dependsMode)
00158 {
00159 std::string ciFileBaseName = fname;
00160 size_t loc = ciFileBaseName.rfind('/');
00161 if(loc != std::string::npos)
00162 ciFileBaseName = ciFileBaseName.substr(loc+1);
00163 m->genDepends(ciFileBaseName);
00164 }
00165 else
00166 m->generate();
00167 return 0 ;
00168 }