void opt_Pop(void) { if (pOptionStack) { struct sOptionStackEntry *pOpt; pOpt = pOptionStack; opt_SetCurrentOptions(&(pOpt->Options)); pOptionStack = pOpt->pNext; free(pOpt); } else fatalerror("No entries in the option stack"); }
void opt_Parse(char *s) { struct sOptions newopt; newopt = CurrentOptions; switch (s[0]) { case 'g': if (strlen(&s[1]) == 4) { newopt.gbgfx[0] = s[1]; newopt.gbgfx[1] = s[2]; newopt.gbgfx[2] = s[3]; newopt.gbgfx[3] = s[4]; } else { fprintf(stderr, "Must specify exactly 4 characters " "for option 'g'\n"); exit(1); } break; case 'b': if (strlen(&s[1]) == 2) { newopt.binary[0] = s[1]; newopt.binary[1] = s[2]; } else { fprintf(stderr, "Must specify exactly 2 characters " "for option 'b'\n"); exit(1); } break; case 'z': if (strlen(&s[1]) <= 2) { int result; result = sscanf(&s[1], "%lx", &newopt.fillchar); if (!((result == EOF) || (result == 1))) { fprintf(stderr, "Invalid argument for option 'z'\n"); exit(1); } } else { fprintf(stderr, "Invalid argument for option 'z'\n"); exit(1); } break; default: fatalerror("Unknown option"); break; } opt_SetCurrentOptions(&newopt); }
int main(int argc, char *argv[]) { char *tzMainfile; int argn = 1; argc -= 1; if (argc == 0) PrintUsage(); /* yydebug=1; */ DefaultOptions.endian = ASM_DEFAULT_ENDIAN; DefaultOptions.gbgfx[0] = '0'; DefaultOptions.gbgfx[1] = '1'; DefaultOptions.gbgfx[2] = '2'; DefaultOptions.gbgfx[3] = '3'; DefaultOptions.binary[0] = '0'; DefaultOptions.binary[1] = '1'; DefaultOptions.fillchar = -1; // fill uninitialised data with random values opt_SetCurrentOptions(&DefaultOptions); while (argv[argn][0] == '-' && argc) { switch (argv[argn][1]) { case 'h': PrintUsage(); break; case 'i': fstk_AddIncludePath(&(argv[argn][2])); break; case 'o': out_SetFileName(&(argv[argn][2])); break; case 'e': case 'g': case 'b': case 'z': opt_Parse(&argv[argn][1]); break; default: printf("*ERROR*\t :\n\tUnknown option '%c'\n", argv[argn][1]); exit(5); break; } argn += 1; argc -= 1; } DefaultOptions = CurrentOptions; /*tzMainfile=argv[argn++]; * argc-=1; */ tzMainfile = argv[argn]; setuplex(); printf("Assembling %s\n", tzMainfile); nStartClock = clock(); nLineNo = 1; nTotalLines = 0; nIFDepth = 0; nPC = 0; nPass = 1; nErrors = 0; sym_PrepPass1(); if (fstk_Init(tzMainfile)) { printf("Pass 1...\n"); yy_set_state(LEX_STATE_NORMAL); opt_SetCurrentOptions(&DefaultOptions); if (yyparse() == 0 && nErrors == 0) { if (nIFDepth == 0) { nTotalLines = 0; nLineNo = 1; nIFDepth = 0; nPC = 0; nPass = 2; nErrors = 0; sym_PrepPass2(); out_PrepPass2(); fstk_Init(tzMainfile); yy_set_state(LEX_STATE_NORMAL); opt_SetCurrentOptions(&DefaultOptions); printf("Pass 2...\n"); if (yyparse() == 0 && nErrors == 0) { double timespent; nEndClock = clock(); timespent = ((double)(nEndClock - nStartClock)) / (double)CLOCKS_PER_SEC; printf ("Success! %ld lines in %d.%02d seconds ", nTotalLines, (int)timespent, ((int)(timespent * 100.0)) % 100); if (timespent == 0) printf ("(INFINITY lines/minute)\n"); else printf("(%d lines/minute)\n", (int)(60 / timespent * nTotalLines)); out_WriteObject(); } else { printf ("Assembly aborted in pass 2 (%ld errors)!\n", nErrors); //sym_PrintSymbolTable(); exit(5); } } else { printf ("*ERROR*\t:\tUnterminated IF construct (%ld levels)!\n", nIFDepth); exit(5); } } else { printf("Assembly aborted in pass 1 (%ld errors)!\n", nErrors); exit(5); } } else { printf("File '%s' not found\n", tzMainfile); exit(5); } return (0); }
void opt_Parse(char *s) { struct sOptions newopt; newopt = CurrentOptions; switch (s[0]) { case 'e': switch (s[1]) { case 'b': newopt.endian = ASM_BIG_ENDIAN; printf ("*WARNING*\t :\n\tEndianness forced to BIG for destination CPU\n"); break; case 'l': newopt.endian = ASM_LITTLE_ENDIAN; printf ("*WARNING*\t :\n\tEndianness forced to LITTLE for destination CPU\n"); break; default: printf ("*ERROR*\t :\n\tArgument to option -e must be 'b' or 'l'\n"); exit(5); } break; case 'g': if (strlen(&s[1]) == 4) { newopt.gbgfx[0] = s[1]; newopt.gbgfx[1] = s[2]; newopt.gbgfx[2] = s[3]; newopt.gbgfx[3] = s[4]; } else { printf ("*ERROR*\t :\n\tMust specify exactly 4 characters for option 'g'\n"); exit(5); } break; case 'b': if (strlen(&s[1]) == 2) { newopt.binary[0] = s[1]; newopt.binary[1] = s[2]; } else { printf ("*ERROR*\t :\n\tMust specify exactly 2 characters for option 'b'\n"); exit(5); } break; case 'z': if (strlen(&s[1]) <= 2) { if (strcmp(&s[1], "?") == 0) { newopt.fillchar = -1; } else { int result; result = sscanf(&s[1], "%lx", &newopt.fillchar); if (!((result == EOF) || (result == 1))) { printf ("*ERROR*\t :\n\tInvalid argument for option 'z'\n"); exit(5); } } } else { printf ("*ERROR*\t :\n\tInvalid argument for option 'z'\n"); exit(5); } break; default: fatalerror("Unknown option"); break; } opt_SetCurrentOptions(&newopt); }
int main(int argc, char *argv[]) { int ch; char *ep; struct sOptions newopt; char *tzMainfile; if (argc == 1) PrintUsage(); /* yydebug=1; */ DefaultOptions.gbgfx[0] = '0'; DefaultOptions.gbgfx[1] = '1'; DefaultOptions.gbgfx[2] = '2'; DefaultOptions.gbgfx[3] = '3'; DefaultOptions.binary[0] = '0'; DefaultOptions.binary[1] = '1'; DefaultOptions.fillchar = 0; opt_SetCurrentOptions(&DefaultOptions); newopt = CurrentOptions; while ((ch = getopt(argc, argv, "b:g:i:o:p:")) != -1) { switch (ch) { case 'b': if (strlen(optarg) == 2) { newopt.binary[0] = optarg[1]; newopt.binary[1] = optarg[2]; } else { fprintf(stderr, "Must specify exactly " "2 characters for option 'b'\n"); exit(1); } case 'g': if (strlen(optarg) == 4) { newopt.gbgfx[0] = optarg[1]; newopt.gbgfx[1] = optarg[2]; newopt.gbgfx[2] = optarg[3]; newopt.gbgfx[3] = optarg[4]; } else { fprintf(stderr, "Must specify exactly " "4 characters for option 'g'\n"); exit(1); } break; case 'i': fstk_AddIncludePath(optarg); break; case 'o': out_SetFileName(optarg); break; case 'p': newopt.fillchar = strtoul(optarg, &ep, 0); if (optarg[0] == '\0' || *ep != '\0') { fprintf(stderr, "Invalid argument for option 'p'\n"); exit(1); } if (newopt.fillchar < 0 || newopt.fillchar > 0xFF) { fprintf(stderr, "Argument for option 'p' " "must be between 0 and 0xFF\n"); exit(1); } break; default: PrintUsage(); } } argc -= optind; argv += optind; opt_SetCurrentOptions(&newopt); DefaultOptions = CurrentOptions; /* tzMainfile=argv[argn++]; argc-=1; */ tzMainfile = argv[argc - 1]; setuplex(); printf("Assembling %s\n", tzMainfile); nStartClock = clock(); nLineNo = 1; nTotalLines = 0; nIFDepth = 0; nPC = 0; nPass = 1; nErrors = 0; sym_PrepPass1(); if (fstk_Init(tzMainfile)) { printf("Pass 1...\n"); yy_set_state(LEX_STATE_NORMAL); opt_SetCurrentOptions(&DefaultOptions); if (yyparse() == 0 && nErrors == 0) { if (nIFDepth == 0) { nTotalLines = 0; nLineNo = 1; nIFDepth = 0; nPC = 0; nPass = 2; nErrors = 0; sym_PrepPass2(); out_PrepPass2(); fstk_Init(tzMainfile); yy_set_state(LEX_STATE_NORMAL); opt_SetCurrentOptions(&DefaultOptions); printf("Pass 2...\n"); if (yyparse() == 0 && nErrors == 0) { double timespent; nEndClock = clock(); timespent = ((double) (nEndClock - nStartClock)) / (double) CLOCKS_PER_SEC; printf ("Success! %ld lines in %d.%02d seconds ", nTotalLines, (int) timespent, ((int) (timespent * 100.0)) % 100); if (timespent == 0) printf ("(INFINITY lines/minute)\n"); else printf("(%d lines/minute)\n", (int) (60 / timespent * nTotalLines)); out_WriteObject(); } else { printf ("Assembly aborted in pass 2 (%ld errors)!\n", nErrors); //sym_PrintSymbolTable(); exit(5); } } else { fprintf(stderr, "Unterminated IF construct (%ld levels)!\n", nIFDepth); exit(1); } } else { fprintf(stderr, "Assembly aborted in pass 1 (%ld errors)!\n", nErrors); exit(1); } } else { printf("File '%s' not found\n", tzMainfile); exit(5); } return (0); }