📄 starteic.c
字号:
if(FREE_G_STRING)
EiC_xfreemark(eicgstring);
free_env_code();
EiC_remTempories();
if(EiC_ParseError) {
if(EiC_ENV->lsp != 0) {
EiC_messageDisplay("EiC::Reset Local Stack Pointer\n");
EiC_ENV->lsp = 0;
}
/*
if(EiC_ENV->ARgar.n)
xmark(EiC_ENV->ARgar.val,eicstay);
*/
EiCp_Reset(1);
/* Hawk start change */
// EiC_ParseError = 0;
/* Hawk change */
} else {
#ifndef NO_HISTORY
if(EiChist)
EiC_save_history(EiChist,hfrom);
#endif
}
if(EiC_memdumpON) {
EiC_marksyms(NON_LEAK);
if(EiC_verboseON)
printf("--- XMEM DUMP\n");
xdumpnonmark("eicxdump", NON_LEAK);
}
}
}
#define FORMAT1 "\n#ifdef _STDLIBH\nexit(main());\n"\
"#else\nmain();\n#endif\n"
#define FORMAT2 "\n"\
"#ifdef _STDLIBH\n"\
"exit(main(_Argc,_Argv));\n"\
"#else\n"\
"main(_Argc,_Argv);\n"\
"#endif\n"
/*
#define FORMAT3 "\n"\
"#ifdef _STDLIBH\n"\
"exit(main(_Argc,_Argv,_Envp));\n"\
"#else\n"\
"main(_Argc,_Argv,_Envp);\n"\
"#endif\n"
*/
int doEntry()
{
func_t *F;
symentry_t *sym;
sym = EiC_lookup(stand_tab,"main");
if(!sym) {
if(!ScriptMode)
EiC_messageDisplay("Error: Missing `main'\n");
return 0;
}
if(sym) {
if(EiC_gettype(sym->type) != t_func) {
EiC_messageDisplay("Error: `main' NOT DECLARED as a function\n");
return 0;
}
/* check return type of main */
if(EiC_gettype(nextType(sym->type)) != t_int) {
EiC_messageDisplay("Error: function `main' MUST return an `int' type\n");
return 0;
}
/* get number of arguments */
F = EiC_getInf(sym->type);
if(getFNp(F) <= 1) /* allow for void argument */
EiC_prolineString(FORMAT1);
else if(getFNp(F) <= 2)
EiC_prolineString(FORMAT2);
else
EiC_messageDisplay("Error: too many arguments being "
"passed to `main'\n");
/*EiC_prolineString(FORMAT3);*/
}
return 1;
}
char * doargs(int argc, char **argv)
{
int i,sz;
char buf[51];
char *p;
sprintf(buf,"int _Argc = %d;char *_Argv[] = {",argc);
/* get size of string needed */
sz = strlen(buf);
for(i=0;i<argc;++i)
sz += strlen(argv[i]) + 3; /* 3 comma + quotes */
/* needs to be NULL terminated */
sz += strlen("(void*)0};") + 2; /* 2 for NULL */
p = xmalloc(sz);
*p ='\0';
strcat(p,buf);
for(i=0;i<argc;++i) {
strcat(p,"\"");
strcat(p,argv[i]);
strcat(p,"\",");
}
strcat(p,"(void*)0};");
return p;
}
void EiC_parseString(char * fmt,...)
{
code_t code;
char *str;
int h = EiC_interActive;
int gs = FREE_G_STRING;
int len;
/* unsigned sp;*/
va_list args;
va_start(args,fmt);
FREE_G_STRING = 0;
len = 2 * strlen(fmt);
str = malloc(len > 256 ? len : 256);
vsprintf(str,fmt,args);
EiC_interActive = 0; /* turn off interactive mode */
EiC_prolineString(str);
code = EiC_ENV->CODE;
EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0;
EiC_ENV->CODE.inst = NULL;
EiC_ENV->CODE.prev = &code;
/* sp = EiC_ENV->sp;*/
runEiC();
/* rem: runEiC will call free_env_code */
EiC_ENV->CODE = code;
EiC_interActive = h;
free(str);
va_end(args);
FREE_G_STRING = gs;
}
void EiC_callBack(void *c)
{
code_t code;
int gs = FREE_G_STRING;
FREE_G_STRING = 0;
if(!c)
return;
code = EiC_ENV->CODE;
EiC_ENV->CODE = *(code_t*)c;
EiC_ENV->CODE.prev = &code; /* link */
EiC_interpret(EiC_ENV);
EiC_ENV->CODE.prev = NULL; /* unlink */
EiC_ENV->CODE = code;
FREE_G_STRING = gs;
}
void EiC_switches(char *switches)
{
if(switches) {
char *p,*c = malloc(strlen(switches)+2);
strcpy(c,switches);
p = strtok(c," \t\n");
while(p) {
if(*p == '-')
do_sw_commands(p+1);
p = strtok(NULL," \t\n");
}
free(c);
}
}
int EiC_run(int argc, char **argv)
{
char * n2 = doargs(argc,argv);
int h = EiC_interActive;
code_t code;
EiC_interActive = 0; /* turn off interactive mode */
code = EiC_ENV->CODE;
EiC_ENV->CODE.nextinst = EiC_ENV->CODE.binst = 0;
EiC_ENV->CODE.inst = NULL;
EiC_ENV->CODE.prev = &code;
/*sp = EiC_ENV->sp;*/
EiC_prolineString(n2);
runEiC();
if(!EiC_Include_file(argv[0],1))
return 0;
else
runEiC();
if(doEntry())
runEiC();
/* rem: runEiC will call free_env_code */
EiC_ENV->CODE.prev = NULL;
EiC_ENV->CODE = code;
/*EiC_ENV->sp = sp;*/
xfree(n2);
EiC_interActive = h;
return 1;
}
void EiC_getSwitchCommands(int *Argc, char ***Argv)
{
#ifndef NO_ARGV
int argc = *Argc;
char **argv = *Argv;
static int gotSwitches = 0;
if(gotSwitches)
return;
gotSwitches = 1;
if(argc-- > 0)
while(argv[1]) {
if(argv[1][0] == '-') {
if(!do_sw_commands(&argv[1][1])) {
EiC_error("Unknown switch command [%s]\n",
argv[1]);
usage();
}
} else
break;
argv++;
argc--;
}
if(argc-- >0) {
if(!EiC_run(argc+1,argv+1))
EiC_error("Failed to run %s\n",argv[1]);
exit(0);
}
*Argc = argc;
*Argv = argv;
#endif
}
void EiC_startEiC(int argc, char **argv)
{
extern int EiC_load_history(char *fname,int prompt);
#if defined(WIN32) || defined(_DJGPP)
signal(SIGABRT, EiC_bus_err);
#else
signal(SIGBUS, EiC_bus_err);
#endif
signal(SIGILL, EiC_ill_oper);
signal(SIGSEGV, EiC_stor_access);
signal(SIGFPE, EiC_float_err);
signal(SIGINT, EiC_term_int);
#if defined(WIN32) || defined(_DJGPP)
signal(SIGTERM, EiC_exit_call);
#else
signal(SIGUSR1, EiC_exit_call);
#endif
EiC_getSwitchCommands(&argc,&argv);
#ifndef NO_ARGV
if(argc-- >0) {
if(!EiC_run(argc+1,argv+1))
EiC_error("Error: Failed to run %s\n",argv[1]);
exit(0);
}
#endif
if(!silent) {
fputs(Version,stdout);
}
#ifndef NO_HISTORY
if(StartUpH)
EiC_setinfile("starteic.h");
if(HistoryFile) {
char * name = "EiChist.lst";
if(reStart) {
puts("Re Initiating EiC -- please wait.");
if(EiC_load_history(name,prompt)) {
runEiC(); /* ensure that startup files have
been loaded and compiled */
EiChist = fopen(name,"w");
EiC_save_history(EiChist,0);
fclose(EiChist);
EiChist=NULL;
EiC_Include_file(name,1);
runEiC();
EiChist = fopen(name,"a");
}else {
EiC_error("Error: unable to load history file\n");
HistoryFile = 0;
EiChist = NULL;
}
puts("Done.");
} else {
EiChist = fopen(name,"w");
if(!EiChist) {
EiC_messageDisplay("Failed to create EiChist.lst\n"
"Start No history file mode switch\n");
HistoryFile = 0;
}
}
if(HistoryFile)
setvbuf(EiChist,NULL,_IOLBF,0);
}
#endif
#ifdef PPCLIB
setvbuf(stdout,NULL,_IONBF,0);
setvbuf(stderr,NULL,_IONBF,0);
#endif
/* Hawk start change */
// while(1)
// runEiC();
/* Hawk change */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -