Exemple #1
0
extern void
dep_WriteDependencyFile(void) {
    FILE* fileHandle = fopen(str_String(g_outputFilename), "wt");
    if (fileHandle != NULL) {
        fprintf(fileHandle, "%s:", str_String(g_mainOutput));
        for (SDependency* dependency = g_dependencies; dependency != NULL; dependency = dependency->next) {
            fprintf(fileHandle, " %s", str_String(dependency->filename));
        }
        fprintf(fileHandle, "\n\n");
        for (SDependency* dependency = g_dependencies->next; dependency != NULL; dependency = dependency->next) {
            fprintf(fileHandle, "%s:\n\n", str_String(dependency->filename));
        }
    }
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}