#include "common.h"
#include "asm.h"
-#if defined __MINGW32__
- // for O_BINARY in _pipe()
-# include <fcntl.h>
-#elif !defined(__BORLANDC__) && !defined(_MSC_VER)
- // for pipe and close
-# include <unistd.h>
-#endif
-
/* A 'token' is like !blah or %24f and is under the programmers
control. */
#define MAX_TOKEN_LEN 64
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");
}
/*-----------------------------------------------------------------*/
/* 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) {
if (lineno<inLineNo) {
fseek (inFile, 0, SEEK_SET);
inLineNo=0;
- rewinds++;
+ /* rewinds++; */
}
while (fgets (inLineString, 1024, inFile)) {
inLineNo++;