📄 main.c
字号:
if (ar>=argc) { error(ERROR,"no foreground colour specified " YABFORHELP); end_it(); } foreground=my_strdup(argv[ar]); } else if (equal("-bg",option,2) || equal("-background",option,2)) { ar++; if (ar>=argc) { error(ERROR,"no background colour specified (-h for help)"); end_it(); } background=my_strdup(argv[ar]); } else if (equal("-geometry",option,2)) { ar++; if (ar>=argc) { error(ERROR,"no geometry string specified (-h for help)"); end_it(); } geometry=my_strdup(argv[ar]); } else if (equal("-bind",option,3)) { ar++; if (ar>=argc) { error(ERROR,"name of bound program to be written is missing"); end_it(); } to_bind=my_strdup(argv[ar]); } else if (equal("-execute",option,2)) { ar++; if (ar>=argc) { error(ERROR,"no commands specified (-h for help)"); end_it(); } explicit=my_strdup(argv[ar]); } else if (equal("-librarypath",option,4)) { ar++; if (ar>=argc) { error(ERROR,"no library path specified (-h for help)"); end_it(); } strcpy(library_path,argv[ar]); } else if (equal("-display",option,3)) { ar++; if (ar>=argc) { error(ERROR,"no display name specified (-h for help)"); end_it(); } displayname=my_strdup(argv[ar]); } else if (equal("-font",option,4)) { ar++; if (ar>=argc) { error(ERROR,"no font specified (-h for help)"); end_it(); } font=my_strdup(argv[ar]); } else if (!print_docu && (!strcmp("-doc",option) || !strncmp("-doc_",option,5) || !strcmp("-docu",option) || !strncmp("-docu_",option,6))) { print_docu=TRUE; if (!strncmp("-doc_",option,5)) { ar--; hold_docu=TRUE; main_file_name=my_strdup(option+5); } else if (!strncmp("-docu_",option,6)) { ar--; hold_docu=TRUE; main_file_name=my_strdup(option+6); } else { if (ar>=argc-1) { error(ERROR,"no filename specified (-h for help)"); end_it(); } hold_docu=FALSE; main_file_name=my_strdup(argv[ar+1]); } } else if (!print_docu && *option=='-') { sprintf(string,"unknown or ambigous option '%s' " YABFORHELP,option); error(ERROR,string); end_it(); } else if (!is_bound && !inputfile && !explicit) { /* not an option */ if (!main_file_name) main_file_name=my_strdup(argv[ar]); inputfile=fopen(main_file_name,"r"); if (inputfile==NULL) { sprintf(string,"could not open '%s': %s",main_file_name,my_strerror(errno)); error(ERROR,string); endreason=erERROR; exitcode=1; end_it(); } else { progname=strrchr(main_file_name,'\\'); if (!progname) progname=strrchr(main_file_name,'/'); if (progname) progname++; else progname=main_file_name; if (!progname) progname="Yabasic"; } } else { /* option for yabasic program */ yabargv[yabargc]=my_strdup(argv[ar]); yabargc++; } } else { yabargv[yabargc]=my_strdup(argv[ar]); yabargc++; } } interactive=FALSE; #ifdef WINDOWS if (is_bound || !progname) { SetConsoleTitle(""); } else { SetConsoleTitle(progname); }#endif if (is_bound) { inputfile=bound_program; main_file_name=my_strdup(interpreter_path); } else if (!inputfile && !explicit) { interactive=TRUE; inputfile=stdin; main_file_name="standard input"; } if (explicit) main_file_name="command line"; /* open a flex buffer for the initial file */ open_main(inputfile,explicit,main_file_name); return;}void do_help(char *op) /* process help option */ { char *ooop=op; char *oop=op; if (op[0]=='-' && op[1]=='-') op++; oop=op; op=strchr(++op,'-'); if (!op) { if (equal("-version",oop,2)) { fprintf(stderr,"%s\n",BANNER_VERSION); } else if (equal("-license",oop,2) || equal("-licence",oop,2)) { fprintf(stderr,"\n%s\n",YABLICENSE); } else { fprintf(stderr,"%s",BANNER); fprintf(stderr,"For more help try one of these options:\n"); fprintf(stderr," -help-license : show license and conditions of copying\n"); fprintf(stderr," -help-usage : invoking yabasic and commandline options\n\n");#ifdef UNIX fprintf(stderr,"Type 'man yabasic' or see the file yabasic.htm for a description\n");#else fprintf(stderr,"See the file yabasic.htm (accessible from the start-menu) for a\ndescription");#endif fprintf(stderr,"of the language, or go to www.yabasic.de for the latest\n"); fprintf(stderr,"information and other yabasic resources.\n\n"); } } else if (equal("-license",op,2) || equal("-licence",op,2)) { fprintf(stderr,"\n%s\n",YABLICENSE); } else if (equal("-usage",op,2)) { fprintf(stderr,"\nUsage: yabasic [OPTIONS] [FILENAME [ARGUMENTS]]\n\n"); fprintf(stderr,"FILENAME : file, which contains the yabasic program; omit it to type\n"); fprintf(stderr," in your program on the fly (terminated by a double newline)\n"); fprintf(stderr,"ARGUMENTS : strings, that are available from within the yabasic program\n\n"); fprintf(stderr,"available OPTIONS:\n"); fprintf(stderr," -help : print help message and other help options\n"); fprintf(stderr," -version : show version of yabasic\n"); fprintf(stderr," -infolevel [dnwefb] : set infolevel to debug,note,warning,error or fatal\n"); fprintf(stderr," -execute COMMANDS : execute yabasic COMMANDS right away\n"); fprintf(stderr," -bind BOUND : bind interpreter with FILENAME into BOUND\n"); fprintf(stderr," -geometry x+y : position graphic window at x,y\n");#ifdef UNIX fprintf(stderr," -fg,-bg COL : specify fore/background color of graphic window\n"); fprintf(stderr," -display DISP : display, where window will show up\n"); fprintf(stderr," -font FONT : font for graphic window\n");#else fprintf(stderr," -font FONT : font for graphic, supply style (decorative,dontcare,\n"); fprintf(stderr," modern,roman,script or swiss) and size, e.g. swiss10\n");#endif fprintf(stderr," -docu NAME : print embedded docu of program or library\n"); fprintf(stderr," -check : check for possible compatibility problems\n"); fprintf(stderr," -- : pass any subsequent words as arguments to yabasic\n"); fprintf(stderr," -librarypath PATH : directory to search libraries not found in\n"); fprintf(stderr," current dir (default %s)\n",library_default); fprintf(stderr,"\n"); } else { sprintf(string,"unknown or ambigous option '%s' " YABFORHELP,ooop); error(ERROR,string); }}int equal(char *a,char *b,int min) /* helper for processing options */{ int len; if (b[0]=='-' && b[1]=='-' && b[2]) b++; if (min<0) { min=-min; len=min; } else { len=strlen(b); } return (!strncmp(a,b,len) && len>=min);}#ifdef WINDOWSstatic void chop_command(char *command,int *argc,char ***argv) /* chop the WIN95-commandline into seperate strings */{ int i,j,count; int quote; char c,last; char *curr; char **list; /* count, how many arguments */ count=i=0; last=' '; quote=FALSE; while((c=*(command+i))!='\0') { if (!quote && c!=' ' && last==' ') count++; if (c=='\"') quote=!quote; last=c; i++; } /* fill yabasic into argv[0] */ *argv=my_malloc((count+1)*sizeof(char *)); list=*argv; *argc=count+1; *list=my_strdup("yabasic"); /* fill in other strings */ i=0; count=1; last=' '; quote=FALSE; do { c=*(command+i); if (!quote && c!=' ' && last==' ') j=i; if (c=='\"') { quote=!quote; if (quote) j++; } if (((c==' ' && !quote) || c=='\0') && last!=' ') { *(list+count)=my_malloc((i-j+1)*sizeof(char)); strncpy(*(list+count),command+j,i-j); curr=*(list+count)+i-j; *curr='\0'; if (*(curr-1)=='\"') *(curr-1)='\0'; count++; } last=c; i++; } while(c!='\0');}#endifstatic void end_it(void) /* perform shutdown-operations */{ char l[2];#ifdef UNIX int status; if (winpid==0 || termpid==0 || backpid==0) exit(1); if (backpid>0) { kill(backpid,SIGTERM); waitpid(backpid,&status,0); backpid=-1; } if ((curinized || winopened) && endreason!=erREQUEST) {#else if (!Commandline && endreason!=erREQUEST) {#endif myswitch(STDIO_STREAM); onestring("---Program done, press RETURN---\n");#ifdef WINDOWS SetConsoleMode(ConsoleInput,InitialConsole & (~ENABLE_ECHO_INPUT)); FlushConsoleInputBuffer(ConsoleInput);#endif fgets(l,2,stdin);#ifdef WINDOWS if (wthandle!=INVALID_HANDLE_VALUE) TerminateThread(wthandle,0);#endif#ifdef UNIX }#else }#endif#ifdef UNIX if (curinized) endwin();#else if (printerfont) DeleteObject(printerfont); if (myfont) DeleteObject(myfont); if (printer) DeleteDC(printer);#endif exit(exitcode);}static void initialize(void) /* give correct values to pointers etc ... */{ struct symbol *s; struct stackentry *base; int i; /* install exception handler */ signal(SIGFPE,signal_handler); signal(SIGSEGV,signal_handler); signal(SIGINT,signal_handler);#ifdef SIGHUP signal(SIGHUP,signal_handler);#endif#ifdef SIGQUIT signal(SIGQUIT,signal_handler);#endif#ifdef SIGABRT signal(SIGABRT,signal_handler);#endif /* initialize error handling: no errors seen 'til now */ errorlevel=DEBUG; debug_count=0; note_count=0; warning_count=0; error_count=0; /* initialize stack of symbol lists */ pushsymlist(); /* initialize random number generator */ srand((unsigned)time(NULL)); /* initialize numeric stack */ /* create first : */ stackroot=(struct stackentry *)my_malloc(sizeof(struct stackentry)); stackroot->next=NULL; stackroot->prev=NULL; stackhead=stackroot; /* stack of double values */ /* initialize command stack */ /* create first: */ cmdroot=(struct command *)my_malloc(sizeof(struct command)); cmdroot->next=cmdroot->prev=NULL; /* initialize random number generator */ srand((unsigned int)time(NULL)); /* specify default text-alignement and window origin */ text_align=my_strdup("lb"); winorigin=my_strdup("lt"); /* initialize stack */ base=push(); base->type=stROOT; /* push nil, so that pop will not crash */ cmdhead=cmdroot; /* list of commands */; commandcount=0; /* add internal string variables */ s=get_sym("yabos$",sySTRING,amADD_GLOBAL); if (s->pointer) my_free(s->pointer);#ifdef UNIX s->pointer=my_strdup("unix");#else s->pointer=my_strdup("windows");#endif /* set default-scales for grafics */ fontheight=10; winheight=100; winwidth=100;#ifdef UNIX calc_psscale();#endif /* file stuff */ for(i=1;i<=9;i++) { streams[i]=NULL; stream_modes[i]=smCLOSED; } streams[0]=stdin; stream_modes[0]=smREAD | smWRITE;#ifdef UNIX printerfile=NULL; /* no ps-file yet */#endif /* array with explanation */ for(i=cFIRST_COMMAND;i<=cLAST_COMMAND;i++) explanation[i]="???"; explanation[cFIRST_COMMAND]="FIRST_COMMAND"; explanation[cFINDNOP]="FINDNOP"; explanation[cEXCEPTION]="EXCEPTION"; explanation[cLABEL]="LABEL"; explanation[cSUBLINK]="cSUBLINK"; explanation[cTOKEN]="TOKEN"; explanation[cTOKEN2]="TOKEN2"; explanation[cTOKENALT]="TOKENALT"; explanation[cTOKENALT2]="TOKENALT2"; explanation[cSPLIT]="SPLIT"; explanation[cSPLIT2]="SPLIT2"; explanation[cSPLITALT]="SPLITALT"; explanation[cSPLITALT2]="SPLITALT2"; explanation[cGOTO]="GOTO"; explanation[cQGOTO]="QGOTO"; explanation[cGOSUB]="GOSUB"; explanation[cQGOSUB]="QGOSUB"; explanation[cCALL]="CALL"; explanation[cQCALL]="QCALL"; explanation[cRETURN]="RETURN"; explanation[cRET_FROM_FUN]="RET_FROM_FUN"; explanation[cRETVAL]="RETVAL"; explanation[cSWAP]="SWAP"; explanation[cDECIDE]="DECIDE"; explanation[cANDSHORT]="ANDSHORT"; explanation[cORSHORT]="ORSHORT"; explanation[cSKIPPER]="SKIPPER"; explanation[cSKIPONCE]="SKIPONCE"; explanation[cRESETSKIPONCE]="RESETSKIPONCE"; explanation[cNOP]="NOP"; explanation[cEND_FUNCTION]="END_FUNCTION"; explanation[cDIM]="DIM"; explanation[cFUNCTION]="FUNCTION"; explanation[cDOARRAY]="DOARRAY"; explanation[cDBLADD]="DBLADD"; explanation[cDBLMIN]="DBLMIN"; explanation[cDBLMUL]="DBLMUL"; explanation[cDBLDIV]="DBLDIV"; explanation[cDBLPOW]="DBLPOW"; explanation[cNEGATE]="NEGATE"; explanation[cPUSHDBLSYM]="PUSHDBLSYM"; explanation[cREQUIRE]="REQUIRE"; explanation[cCLEARREFS]="CLEARREFS"; explanation[cPUSHSYMLIST]="PUSHSYMLIST"; explanation[cPOPSYMLIST]="POPSYMLIST"; explanation[cMAKELOCAL]="MAKELOCAL"; explanation[cNUMPARAM]="NUMPARAM"; explanation[cMAKESTATIC]="MAKESTATIC"; explanation[cARRAYLINK]="ARRAYLINK"; explanation[cPUSHARRAYREF]="PUSHARRAYREF"; explanation[cARDIM]="ARRAYDIMENSION"; explanation[cARSIZE]="ARRAYSIZE"; explanation[cUSER_FUNCTION]="USER_FUNCTION"; explanation[cFUNCTION_OR_ARRAY]="FUNCTION_OR_ARRAY"; explanation[cSTRINGFUNCTION_OR_ARRAY]="STRINGFUNCTION_OR_ARRAY"; explanation[cPUSHFREE]="PUSHFREE"; explanation[cPOPDBLSYM]="POPDBLSYM"; explanation[cPOP]="POP"; explanation[cPUSHDBL]="PUSHDBL"; explanation[cPOKE]="POKE"; explanation[cPOKEFILE]="POKEFILE"; explanation[cAND]="AND"; explanation[cOR]="OR"; explanation[cNOT]="NOT"; explanation[cLT]="LT"; explanation[cGT]="GT"; explanation[cLE]="LE"; explanation[cGE]="GE"; explanation[cEQ]="EQ"; explanation[cNE]="NE"; explanation[cSTREQ]="STREQ"; explanation[cSTRNE]="STRNE"; explanation[cPUSHSTRSYM]="PUSHSTRSYM"; explanation[cPOPSTRSYM]="POPSTRSYM";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -