X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fasm.c;h=9269fc7ef6a606c900212b3747bf371fc2ffa3a6;hb=8f0a6a470b28bb9d4699f48cccff93a29e97ef9f;hp=140691aa1c26f8b333329fcceca5b00df1e7b415;hpb=df203a96d87ea3322e836e3dd980f64b80b234e7;p=fw%2Fsdcc diff --git a/src/asm.c b/src/asm.c index 140691aa..9269fc7e 100644 --- a/src/asm.c +++ b/src/asm.c @@ -9,14 +9,6 @@ #include "common.h" #include "asm.h" -#if defined __MINGW32__ - // for O_BINARY in _pipe() -# include -#elif !defined(__BORLANDC__) && !defined(_MSC_VER) - // for pipe and close -# include -#endif - /* A 'token' is like !blah or %24f and is under the programmers control. */ #define MAX_TOKEN_LEN 64 @@ -204,7 +196,7 @@ tvsprintf (char *buffer, size_t len, const char *format, va_list ap) int wrlen; wrlen = vsnprintf (buffer, len, newFormat, ap); - if (wrlen < 0 || wrlen >= len) + if (wrlen < 0 || (size_t)wrlen >= len) { fprintf(stderr, "Internal error: tvsprintf truncated.\n"); } @@ -258,48 +250,59 @@ asm_addTree (const ASM_MAPPINGS * pMappings) /*-----------------------------------------------------------------*/ /* printILine - return the readable i-code for this ic */ /* */ -/* iCodePrint wants a file stream so we need a pipe to fool it */ +/* iCodePrint wants a file stream so we need a temporary file to */ +/* fool it */ /*-----------------------------------------------------------------*/ -static char verbalICode[1024]; - -char *printILine (iCode *ic) { - int filedes[2]; - FILE *pipeStream; +char * +printILine (iCode *ic) +{ + static char verbalICode[1024]; + FILE *tmpFile; iCodeTable *icTab=getTableEntry(ic->op); - -#if defined __MINGW32__ - assert(_pipe(filedes, 256, O_BINARY)!=-1); // forget it -#else - assert(pipe(filedes)!=-1); // forget it -#endif - - // stuff the pipe with the readable icode - pipeStream=fdopen(filedes[1],"w"); - icTab->iCodePrint(pipeStream, ic, icTab->printName); - // it really needs an extra push - fflush(pipeStream); - // now swallow it - pipeStream=fdopen(filedes[0],"r"); - fgets(verbalICode, sizeof(verbalICode), pipeStream); - // clean up the mess, we'll return here for all icodes!! - assert(!close (filedes[0])); - assert(!close (filedes[1])); - // kill the trailing NL - verbalICode[strlen(verbalICode)-1]='\0'; - // and throw it up + + if (INLINEASM == ic->op) + return "inline"; + + tmpFile = tempfile(); + assert(NULL != tmpFile); + if (NULL == tmpFile) + return ""; /* return empty line if temporary file creation failed */ + + addSetHead(&tmpfileSet, tmpFile); + + /* stuff the temporary file with the readable icode */ + icTab->iCodePrint(tmpFile, ic, icTab->printName); + + /* now swallow it */ + rewind(tmpFile); + fgets(verbalICode, sizeof(verbalICode), tmpFile); + + /* clean up the mess, we'll return here for all icodes!! + * Actually the temporary file is only closed. It will be + * removed by rm_tmpfiles(). + */ + assert(!fclose(tmpFile)); + deleteSetItem(&tmpfileSet, tmpFile); + + /* kill the trailing NL */ + if ('\n' == verbalICode[strlen(verbalICode) - 1]) + verbalICode[strlen(verbalICode) - 1] = '\0'; + + /* and throw it up */ return verbalICode; } /*-----------------------------------------------------------------*/ /* printCLine - return the c-code for this lineno */ /*-----------------------------------------------------------------*/ -static FILE *inFile=NULL; -static char inLineString[1024]; -static int inLineNo=0; -static char lastSrcFile[PATH_MAX]; -int rewinds=0; - -char *printCLine (char *srcFile, int lineno) { +/* int rewinds=0; */ +char * +printCLine (char *srcFile, int lineno) +{ + static FILE *inFile=NULL; + static char inLineString[1024]; + static int inLineNo=0; + static char lastSrcFile[PATH_MAX]; char *ilsP=inLineString; if (inFile) { @@ -320,7 +323,7 @@ char *printCLine (char *srcFile, int lineno) { if (lineno