* src/pic16/device.c: reverted to previous version
[fw/sdcc] / src / pic16 / gen.c
index 012f409d11d8e7c9a83cf3bd1132d294e766220c..fd084f76ef22d8e95ebc9f93d779fe33c725df40 100644 (file)
@@ -3598,12 +3598,6 @@ static int resultRemat (iCode *ic)
   return 0;
 }
 
-#if defined(__BORLANDC__) || defined(_MSC_VER)
-#define STRCASECMP stricmp
-#else
-#define STRCASECMP strcasecmp
-#endif
-
 #if 0
 /*-----------------------------------------------------------------*/
 /* inExcludeList - return 1 if the string is in exclude Reg list   */
@@ -8487,112 +8481,119 @@ static void genXor (iCode *ic, iCode *ifx)
 static void genInline (iCode *ic)
 {
   char *buffer, *bp, *bp1;
+  bool inComment = FALSE;
     
-       DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
+  DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
 
-       _G.inLine += (!options.asmpeep);
+  _G.inLine += (!options.asmpeep);
 
-       buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1);
-       strcpy(buffer,IC_INLINE(ic));
-       
-       while((bp1=strstr(bp, "\\n"))) {
-         *bp1++ = '\n';
-         *bp1++ = ' ';
-         bp = bp1;
-        }
-        bp = bp1 = buffer;
+  buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic));
+  
+  while((bp1=strstr(bp, "\\n"))) {
+    *bp1++ = '\n';
+    *bp1++ = ' ';
+    bp = bp1;
+  }
+  bp = bp1 = buffer;
 
 #if 0
   /* This is an experimental code for #pragma inline
      and is temporarily disabled for 2.5.0 release */
-        if(asmInlineMap)
-        {
-          symbol *sym;
-          char *s;
-          char *cbuf;
-          int cblen;
-
-            cbuf = Safe_strdup(buffer);
-            cblen = strlen(buffer)+1;
-            memset(cbuf, 0, cblen);
-
-            bp = buffer;
-            bp1 = cbuf;
-            while(*bp) {
-              if(*bp != '%')*bp1++ = *bp++;
-              else {
-                int i;
-
-                  bp++;
-                  i = *bp - '0';
-                  if(i>elementsInSet(asmInlineMap))break;
-                  
-                  bp++;
-                  s = indexSet(asmInlineMap, i);
-                  DEBUGpc("searching symbol s = `%s'", s);
-                  sym = findSym(SymbolTab, NULL, s);
-
-                  if(sym->reqv) {
-                    strcat(bp1, sym->reqv->operand.symOperand->regs[0]->name);
-                  } else {
-                    strcat(bp1, sym->rname);
-                  }
-                  
-                  while(*bp1)bp1++;
-              }
-              
-              if(strlen(bp1) > cblen - 16) {
-                int i = strlen(cbuf);
-                cblen += 50;
-                cbuf = realloc(cbuf, cblen);
-                memset(cbuf+i, 0, 50);
-                bp1 = cbuf + i;
-              }
-            }
+  if(asmInlineMap)
+  {
+    symbol *sym;
+    char *s;
+    char *cbuf;
+    int cblen;
+
+      cbuf = Safe_strdup(buffer);
+      cblen = strlen(buffer)+1;
+      memset(cbuf, 0, cblen);
+
+      bp = buffer;
+      bp1 = cbuf;
+      while(*bp) {
+        if(*bp != '%')*bp1++ = *bp++;
+        else {
+          int i;
+
+            bp++;
+            i = *bp - '0';
+            if(i>elementsInSet(asmInlineMap))break;
             
-            free(buffer);
-            buffer = Safe_strdup( cbuf );
-            free(cbuf);
+            bp++;
+            s = indexSet(asmInlineMap, i);
+            DEBUGpc("searching symbol s = `%s'", s);
+            sym = findSym(SymbolTab, NULL, s);
+
+            if(sym->reqv) {
+              strcat(bp1, sym->reqv->operand.symOperand->regs[0]->name);
+            } else {
+              strcat(bp1, sym->rname);
+            }
             
-            bp = bp1 = buffer;
+            while(*bp1)bp1++;
+        }
+        
+        if(strlen(bp1) > cblen - 16) {
+          int i = strlen(cbuf);
+          cblen += 50;
+          cbuf = realloc(cbuf, cblen);
+          memset(cbuf+i, 0, 50);
+          bp1 = cbuf + i;
         }
+      }
+      
+      free(buffer);
+      buffer = Safe_strdup( cbuf );
+      free(cbuf);
+      
+      bp = bp1 = buffer;
+  }
 #endif  /* 0 */
 
-       /* emit each line as a code */
-       while (*bp) {
-               if (*bp == '\n') {
-                       *bp++ = '\0';
+  /* emit each line as a code */
+  while (*bp)
+    {
+      switch (*bp)
+        {
+        case ';':
+          inComment = TRUE;
+          ++bp;
+          break;
 
-                       if(*bp1)
-                               pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process
-                       bp1 = bp;
-               } else {
-                       if (*bp == ':') {
-                               bp++;
-                               *bp = '\0';
-                               bp++;
-
-                               /* print label, use this special format with NULL directive
-                                * to denote that the argument should not be indented with tab */
-                               pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(NULL, bp1)); // inline directly, no process
-                               bp1 = bp;
-                       } if (*bp == ';') {
-                               /* advance to end of line (prevent splitting of comments at ':' */
-                               while (*bp && *bp != '\n') {
-                                       bp++;
-                               } // while
-                       } else
-                               bp++;
-               }
-       }
+        case '\n':
+          inComment = FALSE;
+          *bp++ = '\0';
+          if (*bp1)
+            pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process
+          bp1 = bp;
+          break;
 
-       if ((bp1 != bp) && *bp1)
-               pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process
+        default:
+          /* Add \n for labels, not dirs such as c:\mydir */
+          if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1])))
+            {
+              ++bp;
+              *bp = '\0';
+              ++bp;
+              /* print label, use this special format with NULL directive
+               * to denote that the argument should not be indented with tab */
+              pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(NULL, bp1)); // inline directly, no process
+              bp1 = bp;
+            }
+          else
+            ++bp;
+          break;
+        }
+    }
 
+  if ((bp1 != bp) && *bp1)
+    pic16_addpCode2pBlock(pb, pic16_newpCodeAsmDir(bp1, NULL)); // inline directly, no process
 
-    Safe_free(buffer);
+  Safe_free (buffer);
 
-    _G.inLine -= (!options.asmpeep);
+  _G.inLine -= (!options.asmpeep);
 }
 
 /*-----------------------------------------------------------------*/
@@ -11976,7 +11977,7 @@ static void genNearPointerSet (operand *right,
            
         DEBUGpic16_emitcode ("; ***","%s  %d",__FUNCTION__,__LINE__);
         while (size--) {
-          if (AOP_TYPE(right) == AOP_LIT) {
+          if (is_LitOp(right)) {
             pic16_emitpcode(POC_MOVLW, pic16_popGet(AOP(right),offset));
             if (size) {
               pic16_emitpcode(POC_MOVWF,pic16_popCopyReg(&pic16_pc_postinc0));
@@ -13181,12 +13182,12 @@ static void genCast (iCode *ic)
              tag = GPTR_TAG_CODE;
            } else if (IS_PTR(rtype)) {
              PERFORM_ONCE(weirdcast,
-             fprintf (stderr, "%s:%u: WARNING: casting `(generic*)(unknown*)' -- assumimg __data space\n", ic->filename, ic->lineno);
+             fprintf (stderr, "%s:%u: WARNING: casting `(generic*)(unknown*)' -- assuming __data space\n", ic->filename, ic->lineno);
              );
              tag = GPTR_TAG_DATA;
            } else {
              PERFORM_ONCE(weirdcast,
-             fprintf (stderr, "%s:%u: WARNING: casting `(generic*)(non-pointer)' -- assumimg __data space\n", ic->filename, ic->lineno);
+             fprintf (stderr, "%s:%u: WARNING: casting `(generic*)(non-pointer)' -- assuming __data space\n", ic->filename, ic->lineno);
              );
              tag = GPTR_TAG_DATA;
            }