void sect_OutputBinaryFile(string* pFile) { /* TODO: Handle minimum word size. * Pad file if necessary. * Read words and output in chosen endianness */ FILE* f; if((pFile = fstk_FindFile(pFile)) != NULL && (f = fopen(str_String(pFile), "rb")) != NULL) { uint32_t size; fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); if(sect_CheckAvailableSpace(size)) { switch(sect_GetCurrentType()) { case GROUP_TEXT: { size_t read; read = fread(&pCurrentSection->pData[pCurrentSection->UsedSpace], sizeof(uint8_t), size, f); pCurrentSection->FreeSpace -= size; pCurrentSection->UsedSpace += size; pCurrentSection->PC += size / g_pConfiguration->eMinimumWordSize; if(read != size) { prj_Fail(ERROR_READ); } break; } case GROUP_BSS: { prj_Error(ERROR_SECTION_DATA); break; } default: { internalerror("Unknown GROUP type"); break; } } } fclose(f); } else { prj_Fail(ERROR_NO_FILE); } str_Free(pFile); }
static size_t appendAndFreeString(char* destination, string* str) { if (str != NULL) { size_t length = str_Length(str); memcpy(destination, str_String(str), length); str_Free(str); return length; } return 0; }
void locsym_Init(void) { string* pName; pName = str_Create("CODE"); sym_CreateGROUP(pName, GROUP_TEXT); str_Free(pName); pName = str_Create("DATA"); sym_CreateGROUP(pName, GROUP_TEXT)->nFlags |= SYMF_DATA; str_Free(pName); pName = str_Create("BSS"); sym_CreateGROUP(pName, GROUP_BSS); str_Free(pName); pName = str_Create("CODE_C"); sym_CreateGROUP(pName, GROUP_TEXT)->nFlags |= SYMF_CHIP; str_Free(pName); pName = str_Create("DATA_C"); sym_CreateGROUP(pName, GROUP_TEXT)->nFlags |= SYMF_DATA | SYMF_CHIP; str_Free(pName); pName = str_Create("BSS_C"); sym_CreateGROUP(pName, GROUP_BSS)->nFlags |= SYMF_CHIP; str_Free(pName); }
static bool handleMacroInvocation(void) { bool r = false; if (lex_Current.token == T_ID) { string* symbolName = str_Create(lex_Current.value.string); if (sym_IsMacro(symbolName)) { if (handleMacroArguments()) { fstk_ProcessMacro(symbolName); parse_GetToken(); r = true; } } else { err_Error(ERROR_INSTR_UNKNOWN, lex_Current.value.string); } str_Free(symbolName); } return r; }
extern int xasm_Main(int argc, char* argv[]) { char format = 'x'; int argn = 1; int rcode; clock_t StartClock; clock_t EndClock; string* pOutname = NULL; bool_t debuginfo = false; bool_t verbose = false; #if defined(_DEBUG) atexit(getchar); #endif StartClock = clock(); argc -= 1; if(argc == 0) PrintUsage(); sect_Init(); sym_Init(); globlex_Init(); loclexer_Init(); opt_Open(); while(argc && argv[argn][0] == '-') { switch(argv[argn][1]) { case '?': case 'h': PrintUsage(); break; case 'g': debuginfo = true; break; case 'v': verbose = true; break; case 'f': if(strlen(argv[argn]) > 2) { switch(argv[argn][2]) { case 'x': case 'b': format = argv[argn][2]; break; case 'g': case 'h': if(g_pConfiguration->bSupportAmiga) { format = argv[argn][2]; break; } default: prj_Warn(WARN_OPTION, argv[argn]); break; } } break; case 'o': pOutname = str_Create(&argv[argn][2]); break; case 'i': case 'e': case 'm': case 'b': case 'w': case 'z': opt_Parse(&argv[argn][1]); break; default: prj_Warn(WARN_OPTION, argv[argn]); break; } ++argn; --argc; } rcode = EXIT_SUCCESS; if(argc == 1) { string* source = str_Create(argv[argn]); if(fstk_Init(source)) { bool_t b = parse_Do(); if(b) { patch_OptimizeAll(); patch_BackPatch(); } if(b && g_nTotalErrors == 0) { float timespent; bool_t wr = false; if(verbose) { EndClock = clock(); timespent = ((float)(EndClock - StartClock))/CLOCKS_PER_SEC; printf("Success! %u lines in %.02f seconds ", g_nTotalLines, timespent); if(timespent == 0) { printf("\n"); } else { printf("(%d lines/minute)\n", (int)(60/timespent*g_nTotalLines)); } if(g_nTotalWarnings != 0) { printf("Encountered %u warnings\n", g_nTotalWarnings); } } if(pOutname != NULL) { switch(format) { case 'x': wr = obj_Write(pOutname); break; case 'b': wr = bin_Write(pOutname); break; case 'g': wr = ami_WriteExecutable(pOutname, debuginfo); break; case 'h': wr = ami_WriteObject(pOutname, source, debuginfo); break; } if(!wr) { remove(str_String(pOutname)); } } } else { if(verbose) { printf("Encountered %u error%s", g_nTotalErrors, g_nTotalErrors > 1 ? "s" : ""); if(g_nTotalWarnings != 0) printf(" and %u warning%s\n", g_nTotalWarnings, g_nTotalWarnings > 1 ? "s" : ""); else printf("\n"); } rcode = EXIT_FAILURE; } fstk_Cleanup(); } str_Free(source); } str_Free(pOutname); opt_Close(); return rcode; }
static bool_t ParseSymbol(char* src, uint32_t size) { stringbuffer* pBuffer = strbuf_Create(); string* pString; uint32_t i; bool_t r; for(i = 0; i < size; ++i) { char ch = *src++; if(ch == '\\') { if(i + 1 < size) { char* marg = NULL; ch = *src++; ++i; if(ch == '@') marg = fstk_GetMacroRunID(); else if(ch >= '0' && ch <= '9') marg = fstk_GetMacroArgValue(ch); if(marg) { strbuf_AppendStringZero(pBuffer, marg); continue; } } prj_Fail(ERROR_ID_MALFORMED); strbuf_Free(pBuffer); return false; } strbuf_AppendChar(pBuffer, ch); } pString = strbuf_String(pBuffer); strbuf_Free(pBuffer); if(g_bDontExpandStrings == 0 && sym_IsString(pString)) { string* pValue = sym_GetStringValueByName(pString); int len = str_Length(pValue); int i; lex_SkipBytes(size); lex_UnputString(str_String(pValue)); for(i = 0; i < len; ++i) { if(str_CharAt(pValue, i) == '\n') g_pFileContext->LineNumber -= 1; } r = false; str_Free(pValue); } else { strcpy(g_CurrentToken.Value.aString, str_String(pString)); r = true; } str_Free(pString); return r; }