From 0eb3fed6dfbbbe0c68ddadd07693fc17895741f8 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 15 May 2026 01:24:02 +0200 Subject: [PATCH 1/4] Added warning for string truncation --- src/grc65/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/grc65/main.c b/src/grc65/main.c index 51211ddff..b0e3e7184 100644 --- a/src/grc65/main.c +++ b/src/grc65/main.c @@ -261,6 +261,7 @@ static char *nextWord (void) static void setLen (char *name, unsigned len) { if (strlen (name) > len) { + fprintf (stderr, "Warning: string truncated to %u characters\n", len); name[len] = '\0'; } } From b97f4e7c38d47ec12e96ee0ea71508c66e3778eb Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 15 Jun 2026 00:14:51 +0200 Subject: [PATCH 2/4] Added line number to warning --- src/grc65/main.c | 58 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/src/grc65/main.c b/src/grc65/main.c index b0e3e7184..a10c83fc5 100644 --- a/src/grc65/main.c +++ b/src/grc65/main.c @@ -111,6 +111,9 @@ int apple = 0; char outputCMode[2] = "w"; char outputSMode[2] = "w"; +static const char *ParsePos; +static unsigned LineNum = 1; + static void Usage (void) { @@ -160,7 +163,6 @@ static void OptTarget (const char* Opt attribute ((unused)), const char* Arg) default: /* Target is known but unsupported */ AbEnd ("Unsupported target system '%s'", Arg); - break; } } @@ -246,22 +248,52 @@ static int findToken (const char * const *tokenTbl, const char *token) } +static void ParseInit (char *buf) +{ + ParsePos = buf; + LineNum = 1; +} + +static char *ParseTok (const char *delim) +{ + while (*ParsePos && strchr (delim, *ParsePos)) { + if (*ParsePos == '\n') { + ++LineNum; + } + ++ParsePos; + } + if (!*ParsePos) return 0; + + char *start = (char *) ParsePos; + while (*ParsePos && !strchr (delim, *ParsePos)) { + ++ParsePos; + } + + if (*ParsePos) { + *(char *) ParsePos = '\0'; + ++ParsePos; + } + + return start; +} + + static char *nextPhrase (void) { - return strtok (NULL, "\""); + return ParseTok ("\""); } static char *nextWord (void) { - return strtok (NULL, " "); + return ParseTok (" \n\r"); } static void setLen (char *name, unsigned len) { if (strlen (name) > len) { - fprintf (stderr, "Warning: string truncated to %u characters\n", len); + fprintf (stderr, "Warning: String %lu characters too long (line %u)\n", strlen (name) - len, LineNum); name[len] = '\0'; } } @@ -895,8 +927,7 @@ static char *filterInput (FILE *F, char *tbl) if (i >= BLOODY_BIG_BUFFER) { AbEnd ("File too large for internal parsing buffer (%d bytes)",BLOODY_BIG_BUFFER); } - if (((a == '\n') || (a == '\015')) || - (a == ',' && quote)) { + if (a == ',' && quote) { a = ' '; } if (a == '\042') { @@ -915,7 +946,10 @@ static char *filterInput (FILE *F, char *tbl) tbl = xrealloc (tbl, i + 1); break; } - if (IsSpace (a)) { + if (a == '\n' || a == '\r') { + tbl[i++] = a; + prevchar = a; + } else if (IsSpace (a)) { if ((prevchar != ' ') && (prevchar != -1)) { tbl[i++] = ' '; prevchar = ' '; @@ -925,10 +959,9 @@ static char *filterInput (FILE *F, char *tbl) do { a = getc (F); } while (a != '\n' && a != EOF); - /* Don't discard this newline/EOF, continue to next loop. - ** A previous implementation used fseek(F,-1,SEEK_CUR), - ** which is invalid for text mode files, and was unreliable across platforms. - */ + if (a == '\n') { + ungetc (a, F); + } continue; } else { tbl[i++] = a; @@ -960,7 +993,8 @@ static void processFile (const char *filename) str = filterInput (F, xmalloc (BLOODY_BIG_BUFFER)); - token = strtok (str, " "); + ParseInit (str); + token = ParseTok (" \n\r"); do { if (str != NULL) { From ef523590f8c7e8fb8defdc57674b21ee5540f56e Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 25 Jun 2026 11:14:29 +0200 Subject: [PATCH 3/4] Fix format specifier for string length warning --- src/grc65/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grc65/main.c b/src/grc65/main.c index a10c83fc5..c799ccdad 100644 --- a/src/grc65/main.c +++ b/src/grc65/main.c @@ -293,7 +293,7 @@ static char *nextWord (void) static void setLen (char *name, unsigned len) { if (strlen (name) > len) { - fprintf (stderr, "Warning: String %lu characters too long (line %u)\n", strlen (name) - len, LineNum); + fprintf (stderr, "Warning: String %zu characters too long (line %u)\n", strlen (name) - len, LineNum); name[len] = '\0'; } } From da615de36f1cd3fb09385215a8111e02f5dd6d95 Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 25 Jun 2026 11:35:17 +0200 Subject: [PATCH 4/4] No C99 --- src/grc65/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grc65/main.c b/src/grc65/main.c index c799ccdad..9dce48c28 100644 --- a/src/grc65/main.c +++ b/src/grc65/main.c @@ -293,7 +293,7 @@ static char *nextWord (void) static void setLen (char *name, unsigned len) { if (strlen (name) > len) { - fprintf (stderr, "Warning: String %zu characters too long (line %u)\n", strlen (name) - len, LineNum); + fprintf (stderr, "Warning: String %lu characters too long (line %u)\n", (unsigned long) strlen (name) - len, LineNum); name[len] = '\0'; } }