Note that the functions below only handle digit format modifiers.
eg %02X is ok, but %lu and %.4u will fail.
*/
+#include <errno.h>
+
#include "common.h"
#include "asm.h"
+#include "dbuf_string.h"
/* A 'token' is like !blah or %24f and is under the programmers
control. */
-#define MAX_TOKEN_LEN 64
+#define MAX_TOKEN_LEN 64
static hTab *_h;
while (*fileFullName)
{
if ((*fileFullName == '/') || (*fileFullName == '\\') || (*fileFullName == ':'))
- {
- p = fileFullName;
- p++;
- }
+ {
+ p = fileFullName;
+ p++;
+ }
fileFullName++;
}
return p;
}
-static const char *
-_findMapping (const char *szKey)
-{
- return shash_find (_h, szKey);
-}
-
-// Append a string onto another, and update the pointer to the end of
-// the new string.
-static char *
-_appendAt (char *at, char *onto, const char *sz)
-{
- wassert (at && onto && sz);
- strcpy (at, sz);
- return at + strlen (sz);
-}
-
-void
-tvsprintf (char *buffer, const char *format, va_list ap)
+void
+dbuf_tvprintf (struct dbuf_s *dbuf, const char *format, va_list ap)
{
// Under Linux PPC va_list is a structure instead of a primitive type,
// and doesnt like being passed around. This version turns everything
// This is acheived by expanding the tokens and zero arg formats into
// one big format string, which is passed to the native printf.
static int count;
- char noTokens[INITIAL_INLINEASM];
- char newFormat[INITIAL_INLINEASM];
- char *pInto = noTokens;
+ struct dbuf_s tmpDBuf;
+ const char *noTokens;
char *p;
char token[MAX_TOKEN_LEN];
const char *sz = format;
- // NULL terminate it to let strlen work.
- *pInto = '\0';
+ dbuf_init(&tmpDBuf, INITIAL_INLINEASM);
/* First pass: expand all of the macros */
while (*sz)
{
if (*sz == '!')
- {
- /* Start of a token. Search until the first
- [non alpha, *] and call it a token. */
- const char *t;
- p = token;
- sz++;
- while (isalpha (*sz) || *sz == '*')
- {
- *p++ = *sz++;
- }
- *p = '\0';
- /* Now find the token in the token list */
- if ((t = _findMapping (token)))
- {
- pInto = _appendAt (pInto, noTokens, t);
- }
- else
- {
- fprintf (stderr, "Cant find token \"%s\"\n", token);
- wassert (0);
- }
- }
+ {
+ /* Start of a token. Search until the first
+ [non alpha, *] and call it a token. */
+ const char *t;
+ p = token;
+ sz++;
+ while (isalpha ((unsigned char)*sz) || *sz == '*')
+ {
+ *p++ = *sz++;
+ }
+ *p = '\0';
+ /* Now find the token in the token list */
+ if ((t = shash_find (_h, token)))
+ {
+ dbuf_append_str(&tmpDBuf, t);
+ }
+ else
+ {
+ fprintf (stderr, "Cant find token \"%s\"\n", token);
+ wassert (0);
+ }
+ }
else
{
- *pInto++ = *sz++;
+ dbuf_append_char(&tmpDBuf, *sz++);
}
}
- *pInto = '\0';
-
/* Second pass: Expand any macros that we own */
+ noTokens = dbuf_c_str(&tmpDBuf);
sz = noTokens;
- pInto = newFormat;
+
+ /* recycle tmpDBuf */
+ dbuf_init(&tmpDBuf, INITIAL_INLINEASM);
while (*sz)
{
if (*sz == '%')
- {
- // See if its one that we handle.
- sz++;
- switch (*sz)
- {
- case 'C':
- // Code segment name.
- pInto = _appendAt (pInto, newFormat, CODE_NAME);
+ {
+ // See if its one that we handle.
+ sz++;
+ switch (*sz)
+ {
+ case 'C':
+ // Code segment name.
+ dbuf_append_str(&tmpDBuf, CODE_NAME);
sz++;
- break;
- case 'F':
- // Source file name.
- pInto = _appendAt (pInto, newFormat, srcFileName);
+ break;
+
+ case 'F':
+ // Source file name.
+ dbuf_append_str(&tmpDBuf, fullSrcFileName);
sz++;
- break;
+ break;
+
case 'N':
// Current function name.
- pInto = _appendAt (pInto, newFormat, currFunc->rname);
+ dbuf_append_str(&tmpDBuf, currFunc->rname);
sz++;
break;
- case 'I':
- {
- // Unique ID.
- char id[20];
- sprintf (id, "%u", ++count);
- pInto = _appendAt (pInto, newFormat, id);
- sz++;
- break;
- }
- default:
- // Not one of ours. Copy until the end.
- *pInto++ = '%';
- while (!isalpha (*sz))
- {
- *pInto++ = *sz++;
- }
- *pInto++ = *sz++;
- }
- }
+
+ case 'I':
+ // Unique ID.
+ dbuf_printf(&tmpDBuf, "%u", ++count);
+ sz++;
+ break;
+
+ default:
+ // Not one of ours. Copy until the end.
+ dbuf_append_char(&tmpDBuf, '%');
+ while (!isalpha ((unsigned char)*sz))
+ dbuf_append_char(&tmpDBuf, *sz++);
+
+ dbuf_append_char(&tmpDBuf, *sz++);
+ }
+ }
else
- {
- *pInto++ = *sz++;
- }
+ {
+ dbuf_append_char(&tmpDBuf, *sz++);
+ }
}
- *pInto = '\0';
+ dbuf_free(noTokens);
+
+ sz = dbuf_c_str(&tmpDBuf);
+
+ dbuf_vprintf(dbuf, sz, ap);
+
+ dbuf_destroy(&tmpDBuf);
+}
- // Now do the actual printing
- vsprintf (buffer, newFormat, ap);
+void
+dbuf_tprintf (struct dbuf_s *dbuf, const char *szFormat,...)
+{
+ va_list ap;
+ va_start (ap, szFormat);
+ dbuf_tvprintf (dbuf, szFormat, ap);
+ va_end(ap);
}
-void
-tfprintf (FILE * fp, const char *szFormat,...)
+void
+tsprintf (char *buffer, size_t len, const char *szFormat,...)
{
va_list ap;
- char buffer[INITIAL_INLINEASM];
+ struct dbuf_s dbuf;
+ size_t copyLen;
+
+ dbuf_init(&dbuf, INITIAL_INLINEASM);
va_start (ap, szFormat);
- tvsprintf (buffer, szFormat, ap);
- fputs (buffer, fp);
+ dbuf_tvprintf (&dbuf, szFormat, ap);
+ va_end(ap);
+
+ copyLen = min(len - 1, dbuf_get_length(&dbuf));
+ memcpy(buffer, dbuf_get_buf(&dbuf), copyLen);
+ buffer[copyLen] = '\0';
+ dbuf_destroy(&dbuf);
}
-void
-tsprintf (char *buffer, const char *szFormat,...)
+void
+tfprintf (FILE *fp, const char *szFormat,...)
{
va_list ap;
+ struct dbuf_s dbuf;
+ size_t len;
+
+ dbuf_init(&dbuf, INITIAL_INLINEASM);
+
va_start (ap, szFormat);
- tvsprintf (buffer, szFormat, ap);
+ dbuf_tvprintf (&dbuf, szFormat, ap);
+ va_end(ap);
+
+ len = dbuf_get_length(&dbuf);
+ fwrite(dbuf_get_buf(&dbuf), 1, len, fp);
+ dbuf_destroy(&dbuf);
}
-void
+void
asm_addTree (const ASM_MAPPINGS * pMappings)
{
const ASM_MAPPING *pMap;
}
/*-----------------------------------------------------------------*/
-/* printCLine - try to find the c-code for this lineno */
+/* printILine - return the readable i-code for this ic */
/*-----------------------------------------------------------------*/
-static FILE *inFile=NULL;
-static char inLineString[1024];
-static int inLineNo=0;
-int rewinds=0;
+char *
+printILine (iCode *ic)
+{
+ char *verbalICode;
+ struct dbuf_s tmpBuf;
+ iCodeTable *icTab=getTableEntry(ic->op);
+
+ dbuf_init(&tmpBuf, 1024);
+
+ if (INLINEASM == ic->op)
+ dbuf_append (&tmpBuf, "inline", (sizeof "inline") - 1);
+ else {
+ /* stuff the temporary file with the readable icode */
+ icTab->iCodePrint(&tmpBuf, ic, icTab->printName);
+ }
+
+ /* null terminate the buffer */
+ dbuf_c_str(&tmpBuf);
+ verbalICode = dbuf_detach(&tmpBuf);
-char *printCLine (char *srcFile, int lineno) {
+ /* 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 */
+/*-----------------------------------------------------------------*/
+/* 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) {
- inFile=fopen(srcFile, "r");
- if (!inFile) {
- perror ("printCLine");
- exit (1);
+
+ if (inFile) {
+ if (strcmp (lastSrcFile, srcFile) != 0) {
+ fclose (inFile);
+ inFile = NULL;
+ inLineNo = 0;
+ strncpyz (lastSrcFile, srcFile, PATH_MAX);
}
}
- if (lineno<inLineNo) {
- fseek (inFile, 0, SEEK_SET);
- inLineNo=0;
- rewinds++;
+ if (!inFile && !(inFile = fopen(srcFile, "r"))) {
+ /* can't open the file:
+ don't panic, just return the error message */
+ SDCCsnprintf(inLineString, sizeof(inLineString), "ERROR: %s", strerror(errno));
}
- while (fgets (inLineString, 1024, inFile)) {
- inLineNo++;
- if (inLineNo==lineno) {
- // remove the trailing NL
- inLineString[strlen(inLineString)-1]='\0';
- break;
+ else {
+ if (lineno<inLineNo) {
+ fseek (inFile, 0, SEEK_SET);
+ inLineNo=0;
+ /* rewinds++; */
+ }
+ while (fgets (inLineString, 1024, inFile)) {
+ inLineNo++;
+ if (inLineNo==lineno) {
+ // remove the trailing NL
+ inLineString[strlen(inLineString)-1]='\0';
+ break;
+ }
}
}
- while (isspace ((int)*ilsP))
+
+ while (isspace ((unsigned char)*ilsP))
ilsP++;
return ilsP;
"; ---------------------------------"
},
{"functionlabeldef", "%s:"},
- {"bankimmeds", "0 ; PENDING: bank support"},
+ {"bankimmeds", "0 ; PENDING: bank support"},
{"los","(%s & 0xFF)"},
{"his","(%s >> 8)"},
{"hihis","(%s >> 16)"},
{"hihil","(%05d$ >> 16)"},
{"hihihil","(%05d$ >> 24)"},
{"equ","="},
+ {"org", ".org 0x%04X"},
{NULL, NULL}
};
"; ---------------------------------"
},
{"functionlabeldef", "%s:"},
- {"bankimmeds", "0 ; PENDING: bank support"},
+ {"bankimmeds", "0 ; PENDING: bank support"},
{NULL, NULL}
};
"; ---------------------------------"
},
{"functionlabeldef", "%s:"},
- {"bankimmeds", "0 ; PENDING: bank support"},
+ {"bankimmeds", "0 ; PENDING: bank support"},
{"los","(%s & 0FFh)"},
{"his","((%s / 256) & 0FFh)"},
{"hihis","((%s / 65536) & 0FFh)"},
{"hihil","((L%05d / 65536) & 0FFh)"},
{"hihihil","((L%09d / 16777216) & 0FFh)"},
{"equ"," equ"},
+ {"org", ".org 0x%04X"},
{NULL, NULL}
};
{"dbs", ".db \"%s\""},
{"dw", ".dw"},
{"dws", ".dw %s"},
- {"constbyte", "0%02xh"},
- {"constword", "0%04xh"},
- {"immedword", "#0%04Xh"},
- {"immedbyte", "#0%02Xh"},
+ {"constbyte", "0x%02x"},
+ {"constword", "0x%04x"},
+ {"immedword", "0x%04x"},
+ {"immedbyte", "0x%02x"},
{"hashedstr", "#%s"},
{"lsbimmeds", "#<%s"},
{"msbimmeds", "#>%s"},
"; ---------------------------------"
},
{"functionlabeldef", "%s:"},
- {"bankimmeds", "0 ; PENDING: bank support"},
+ {"bankimmeds", "0 ; PENDING: bank support"},
{"los","(%s & 0FFh)"},
{"his","((%s / 256) & 0FFh)"},
{"hihis","((%s / 65536) & 0FFh)"},