* sim/ucsim/mkecho: inserted #!/bin/sh for Cygwin, so that it's executable
[fw/sdcc] / src / asm.c
index 9722ced0cb076d67565ad2c5fb1c8522718a75c9..b22d352e269232a584926633aa9f1c73e3133afe 100644 (file)
--- a/src/asm.c
+++ b/src/asm.c
@@ -9,6 +9,14 @@
 #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
@@ -204,7 +212,42 @@ asm_addTree (const ASM_MAPPINGS * pMappings)
 }
 
 /*-----------------------------------------------------------------*/
-/* printCLine - try to find the c-code for this lineno             */
+/* printILine - return the readable i-code for this ic             */
+/*                                                                 */
+/* iCodePrint wants a file stream so we need a pipe to fool it     */
+/*-----------------------------------------------------------------*/
+static char verbalICode[1024];
+
+char *printILine (iCode *ic) {
+  int filedes[2];
+  FILE *pipeStream;
+  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
+  return verbalICode;
+}
+
+/*-----------------------------------------------------------------*/
+/* printCLine - return the c-code for this lineno                  */
 /*-----------------------------------------------------------------*/
 static FILE *inFile=NULL;
 static char inLineString[1024];
@@ -219,6 +262,7 @@ char *printCLine (char *srcFile, int lineno) {
     if (strcmp (lastSrcFile, srcFile) != 0) {
       fclose (inFile);
       inFile = NULL;
+      inLineNo = 0;
     }
   }
   if (!inFile) {