static int ll_module (lua_State *L) { const char* modname = luaL_checkstring(L, 1); int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ if (!lua_istable(L, -1)) { /* not found? */ lua_pop(L, 1); /* remove previous result */ /* try global variable (and create one if it does not exist) */ if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != nullptr) return luaL_error(L, "name conflict for module " LUA_QS, modname); lua_pushvalue(L, -1); lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ } /* check whether table already has a _NAME field */ lua_getfield(L, -1, "_NAME"); if (!lua_isnil(L, -1)) /* is table an initialized module? */ lua_pop(L, 1); else { /* no; initialize it */ lua_pop(L, 1); modinit(L, modname); } lua_pushvalue(L, -1); setfenv(L); dooptions(L, loaded - 1); return 0; }
static int ll_module (lua_State *L) { const char *modname = luaL_checkstring(L, 1); int lastarg = lua_gettop(L); /* last parameter */ luaL_pushmodule(L, modname, 1); /* get/create module table */ /* check whether table already has a _NAME field */ if (lua_getfield(L, -1, "_NAME") != LUA_TNIL) lua_pop(L, 1); /* table is an initialized module */ else { /* no; initialize it */ lua_pop(L, 1); modinit(L, modname); } lua_pushvalue(L, -1); set_env(L); dooptions(L, lastarg); return 1; }
static int lj_cf_package_module(lua_State *L) { const char *modname = luaL_checkstring(L, 1); int lastarg = (int)(L->top - L->base); luaL_pushmodule(L, modname, 1); lua_getfield(L, -1, "_NAME"); if (!lua_isnil(L, -1)) { /* Module already initialized? */ lua_pop(L, 1); } else { lua_pop(L, 1); modinit(L, modname); } lua_pushvalue(L, -1); setfenv(L); dooptions(L, lastarg); return LJ_52; }
int dooptions(int argc, char** argv) /* * dooptions is called to process command line arguments (-Detc). * It is called only at cpp startup. */ { register char *ap; register DEFBUF *dp; register int c; int i, j; char *arg; SIZES *sizp; /* For -S */ int size; /* For -S */ int isdatum; /* FALSE for -S* */ int endtest; /* For -S */ for (i = j = 1; i < argc; i++) { arg = ap = argv[i]; if (*ap++ != '-' || *ap == EOS) { argv[j++] = argv[i]; } else { c = *ap++; /* Option byte */ if (islower(c)) /* Normalize case */ c = toupper(c); switch (c) { /* Command character */ case 'C': /* Keep comments */ cflag = TRUE; keepcomments = TRUE; break; case 'D': /* Define symbol */ /* * If the option is just "-Dfoo", make it -Dfoo=1 */ while (*ap != EOS && *ap != '=') ap++; if (*ap == EOS) ap = "1"; else *ap++ = EOS; /* * Now, save the word and its definition. */ dp = defendel(argv[i] + 2, FALSE); dp->repl = savestring(ap); dp->nargs = DEF_NOARGS; break; case 'E': /* Ignore non-fatal */ eflag = TRUE; /* errors. */ break; case 'I': /* Include directory */ AddInclude( ap ); /* BP, 11.09.91 */ break; case 'N': /* No predefineds */ nflag++; /* Repeat to undefine */ break; /* __LINE__, etc. */ case 'S': sizp = size_table; if (0 != (isdatum = (*ap != '*'))) /* If it's just -S, */ endtest = T_FPTR; /* Stop here */ else { /* But if it's -S* */ ap++; /* Step over '*' */ endtest = 0; /* Stop at end marker */ } while (sizp->bits != endtest && *ap != EOS) { if (!isdigit(*ap)) { /* Skip to next digit */ ap++; continue; } size = 0; /* Compile the value */ while (isdigit(*ap)) { size *= 10; size += (*ap++ - '0'); } if (isdatum) sizp->size = size; /* Datum size */ else sizp->psize = size; /* Pointer size */ sizp++; } if (sizp->bits != endtest) cwarn("-S, too few values specified in %s", argv[i]); else if (*ap != EOS) cwarn("-S, too many values, \"%s\" unused", ap); break; case 'U': /* Undefine symbol */ if (defendel(ap, TRUE) == NULL) cwarn("\"%s\" wasn't defined", ap); break; #if OSL_DEBUG_LEVEL > 1 case 'X': /* Debug */ debug = (isdigit(*ap)) ? atoi(ap) : 1; #if (HOST == SYS_VMS || HOST == SYS_UNIX) signal(SIGINT, (void (*)(int)) abort); /* Trap "interrupt" */ #endif fprintf(stderr, "Debug set to %d\n", debug); break; #endif #if OSL_DEBUG_LEVEL > 1 case 'P': /* #define's dump */ bDumpDefs = 1; fprintf(stderr, "Dump #define's is on\n"); break; #endif default: /* What is this one? */ cwarn("Unknown option \"%s\"", arg); fprintf(stderr, "The following options are valid:\n\ -C\t\t\tWrite source file comments to output\n\ -Dsymbol=value\tDefine a symbol with the given (optional) value\n\ -Idirectory\t\tAdd a directory to the #include search list\n\ -N\t\t\tDon't predefine target-specific names\n\ -Stext\t\tSpecify sizes for #if sizeof\n\ -Usymbol\t\tUndefine symbol\n"); #if OSL_DEBUG_LEVEL > 1 fprintf(stderr, " -Xvalue\t\tSet internal debug flag\n"); fprintf(stderr, " -P\t\t\tdump #define's\n"); #endif break; } /* Switch on all options */ } /* If it's a -option */ } /* For all arguments */ #if OSL_DEBUG_LEVEL > 1 if ( (bDumpDefs ? j > 4 : j > 3) ) { #else if (j > 3) { #endif cerror( "Too many file arguments. Usage: cpp [input [output]]", NULLST); } return (j); /* Return new argc */ } int readoptions(char* filename, char*** pfargv) { FILE *fp; int c; int bInQuotes = 0; char optbuff[1024], *poptbuff; int fargc=0, back; char *fargv[PARALIMIT], **pfa; pfa=*pfargv=malloc(sizeof(fargv)); poptbuff=&optbuff[0]; filename++; if ((fp = fopen(filename, "r")) == NULL) { #if OSL_DEBUG_LEVEL > 1 if ( debug || !bDumpDefs ) perror(filename); #endif return (FALSE); } do { /* * #i27914# double ticks '"' now have a duplicate function: * 1. they define a string ( e.g. -DFOO="baz" ) * 2. a string can contain spaces, so -DFOO="baz zum" defines one * argument no two ! */ c=fgetc(fp); if ( c != ' ' && c != CR && c != NL && c != HT && c != EOF) { *poptbuff++=(char)c; if( c == '"' ) bInQuotes = ~bInQuotes; } else { if( c != EOF && bInQuotes ) *poptbuff++=(char)c; else { *poptbuff=EOS; if (strlen(optbuff)>0) { pfa[fargc+1]=malloc(strlen(optbuff)+1); strcpy(pfa[fargc+1],optbuff); fargc++; pfa[fargc+1]=0; poptbuff=&optbuff[0]; } } } } while ( c != EOF ); fclose(fp); back=dooptions(fargc+1,pfa); return (back); }
int readoptions(char* filename, char*** pfargv) { FILE* fp; int c; int bInQuotes = 0; char optbuff[1024]; char* poptbuff; int fargc=0; int back; char* fargv[PARALIMIT]; char** pfa; pfa = *pfargv = malloc(sizeof(fargv)); poptbuff = &optbuff[0]; filename++; if ((fp = fopen(filename, "r")) == NULL) { #if OSL_DEBUG_LEVEL > 1 if ( debug || !bDumpDefs ) perror(filename); #endif return (FALSE); } do { /* * #i27914# double ticks '"' now have a duplicate function: * 1. they define a string ( e.g. -DFOO="baz" ) * 2. a string can contain spaces, so -DFOO="baz zum" defines one * argument no two ! */ c = fgetc(fp); if ( c != ' ' && c != CR && c != NL && c != HT && c != EOF) { *poptbuff++ = (char)c; if( c == '"' ) bInQuotes = ~bInQuotes; } else { if( c != EOF && bInQuotes ) *poptbuff++ = (char)c; else { *poptbuff = EOS; if (strlen(optbuff)>0) { pfa[fargc + 1] = strdup(optbuff); fargc++; pfa[fargc + 1] = 0; poptbuff = &optbuff[0]; } } } } while ( c != EOF ); fclose(fp); back=dooptions(fargc+1,pfa); return (back); }
int MAIN(int argc, char** argv) { int i; char** useargv; char** pfargv; if( nRunde == 0 ) { pCppIn = stdin; pCppOut = stdout; } nRunde++; InitCpp1(); InitCpp2(); InitCpp3(); InitCpp4(); InitCpp5(); InitCpp6(); #if HOST == SYS_VMS argc = getredirection(argc, argv); /* vms >file and <file */ #endif initdefines(); /* O.S. specific def's */ if ( argv[argc-1][0] == '@' ) { i = readoptions( argv[1], &pfargv ); /* Command file */ useargv=pfargv; } else { i = dooptions(argc, argv); /* Command line -flags */ useargv=argv; } switch (i) { #if OSL_DEBUG_LEVEL > 1 case 4: if ( bDumpDefs ) { /* * Get defBase file, "-" means use stdout. */ if (!streq(useargv[3], "-")) { #if HOST == SYS_VMS /* * On vms, reopen stdout with "vanilla rms" attributes. */ if ((i = creat(useargv[3], 0, "rat=cr", "rfm=var")) == -1 || dup2(i, fileno(stdout)) == -1) #else pDefOut = fopen( useargv[3], "w" ); if( pDefOut == NULL ) #endif { perror(useargv[3]); cerror("Can't open output file \"%s\"", useargv[3]); exit(IO_ERROR); } } /* Continue by opening output */ } #endif case 3: /* * Get output file, "-" means use stdout. */ if (!streq(useargv[2], "-")) { #if HOST == SYS_VMS /* * On vms, reopen stdout with "vanilla rms" attributes. */ if ((i = creat(useargv[2], 0, "rat=cr", "rfm=var")) == -1 || dup2(i, fileno(stdout)) == -1) #else pCppOut = fopen( useargv[2], "w" ); if( pCppOut == NULL ) #endif { perror(useargv[2]); cerror("Can't open output file \"%s\"", useargv[2]); exit(IO_ERROR); } } /* Continue by opening input */ case 2: /* One file -> stdin */ /* * Open input file, "-" means use stdin. */ if (!streq(useargv[1], "-")) { pCppIn = fopen( useargv[1], "r" ); if( pCppIn == NULL) { perror(useargv[1]); cerror("Can't open input file \"%s\"", useargv[1]); exit(IO_ERROR); } strncpy(work, useargv[1], NWORK); /* Remember input filename */ break; } /* Else, just get stdin */ case 0: /* No args? */ case 1: /* No files, stdin -> stdout */ #if (HOST == SYS_UNIX) || (HOST == SYS_UNKNOWN) work[0] = EOS; /* Unix can't find stdin name */ #else fgetname(stdin, work); /* Vax-11C, Decus C know name */ #endif break; default: exit(IO_ERROR); /* Can't happen */ } setincdirs(); /* Setup -I include directories */ addfile( pCppIn, work); /* "open" main input file */ #if OSL_DEBUG_LEVEL > 1 if (debug > 0 || bDumpDefs) dumpdef("preset #define symbols"); #endif if( pCppIn != stdin ) rewind( pCppIn ); cppmain(); /* Process main file */ if ((i = (ifptr - &ifstack[0])) != 0) { #if OLD_PREPROCESSOR ciwarn("Inside #ifdef block at end of input, depth = %d", i); #else cierror("Inside #ifdef block at end of input, depth = %d", i); #endif } #if OSL_DEBUG_LEVEL > 1 if( pDefOut != stdout && pDefOut != stderr ) fclose( pDefOut ); #endif if( pCppOut != stdout && pCppOut != stderr ) fclose( pCppOut ); if (errors > 0) { fprintf(stderr, (errors == 1) ? "%d error in preprocessor\n" : "%d errors in preprocessor\n", errors); if (!eflag) exit(IO_ERROR); } #ifdef NOMAIN /* BP */ /* kein exit im der LIB-Version */ return( IO_NORMAL ); #else exit(IO_NORMAL); /* No errors or -E option set */ #endif }
int fppPreProcess(struct fppTag *tags) { int i=0; ReturnCode ret; /* cpp return code */ struct Global *global; global=(struct Global *)malloc(sizeof(struct Global)); if(!global) return(FPP_OUT_OF_MEMORY); memset(global, 0, sizeof(struct Global)); global->infile=NULL; global->line=0; global->wrongline=0; global->errors=0; global->recursion=0; global->rec_recover=TRUE; global->instring=FALSE; global->inmacro=FALSE; global->workp=NULL; global->keepcomments = FALSE; /* Write out comments flag */ global->cflag = FALSE; /* -C option (keep comments) */ global->eflag = FALSE; /* -E option (never fail) */ global->nflag = 0; /* -N option (no predefines) */ global->wflag = FALSE; /* -W option (write #defines) */ global->ifstack[0]=TRUE; /* #if information */ global->ifptr = global->ifstack; global->incend = global->incdir; /* names defined at cpp start */ global->preset[0]="frexxcpp"; /* This is the Frexx cpp program */ #if defined( unix ) global->preset[1]="unix"; global->preset[2]= NULL; #endif /* Note: order is important */ global->magic[0] = "__LINE__"; global->magic[1] = "__FILE__"; global->magic[2] = "__FUNCTION__"; global->magic[3] = "__FUNC_LINE__"; global->magic[4] = NULL; /* Must be last */ global->funcline = 0; global->cplusplus=1; global->sharpfilename=NULL; global->parmp=NULL; global->nargs=0; global->macro=NULL; global->evalue=0; global->error=NULL; global->first_file=NULL; global->linelines=TRUE; global->warnillegalcpp = FALSE; global->outputLINE = TRUE; global->warnnoinclude = TRUE; global->showversion = TRUE; global->showincluded = FALSE; global->showspace = FALSE; global->nestcomments = FALSE; global->warnnestcomments = FALSE; global->outputfile = TRUE; global->included = 0; global->comment = FALSE; global->rightconcat = FALSE; global->work[0] = '\0'; global->initialfunc = NULL; memset(global->symtab, 0, SBSIZE * sizeof(DEFBUF *)); ret=initdefines(global); /* O.S. specific def's */ if(ret) return(ret); dooptions(global, tags); /* Command line -flags */ ret=addfile(global, global->inputio, global->work); /* "open" main input file */ global->out = global->outputfile; if(!ret) ret=cppmain(global); /* Process main file */ if ((i = (int)(global->ifptr - global->ifstack)) != 0) { #if OLD_PREPROCESSOR cwarn(global, ERROR_IFDEF_DEPTH, i); #else cerror(global, ERROR_IFDEF_DEPTH, i); #endif } if (global->errors > 0 && !global->eflag) return(IO_ERROR); return(IO_NORMAL); /* No errors or -E option set */ }