1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-25 13:29:41 +00:00

Added a quoted-token parsing function.

This commit is contained in:
Greg King 2014-05-20 16:33:16 -04:00
parent 1e4a7454b6
commit 0ec8c8cea7
3 changed files with 140 additions and 7 deletions

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2008 Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2014, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -81,6 +81,7 @@ char* __fastcall__ strlwr (char* s);
char* __fastcall__ strlower (char* s);
char* __fastcall__ strupr (char* s);
char* __fastcall__ strupper (char* s);
char* __fastcall__ strqtok (char* s1, const char* s2);
#endif
const char* __fastcall__ _stroserror (unsigned char errcode);
@ -90,6 +91,3 @@ const char* __fastcall__ _stroserror (unsigned char errcode);
/* End of string.h */
#endif

86
libsrc/common/strqtok.c Normal file
View File

@ -0,0 +1,86 @@
/*
** strqtok() is like strtok(): It finds pieces of text, in a string, that are
** surrounded by given delimiter characters. It returns each piece, in turn,
** as a string, until every piece has been found. Then, it returns NULL. But,
** strqtok() recognizes quotation marks. A mark makes delimiters look ordinary
** until another quotation mark is seen. That allows us to include delimiters
** in tokens. (This version doesn't allow escaped quotation marks.)
**
** 2014-04-19, Daniel Serpell
** 2014-04-21, Paul Foerster
** 2014-04-25, Greg King
*/
#include <string.h>
char * __fastcall__ strqtok (register char *s1, const char *s2)
{
static char c;
static char *start;
static char *next = "";
if (s1 == NULL) {
s1 = next;
if (c == '\"') {
goto inQuote;
}
}
/* Search for the start of a token. */
while (strchr (s2, c = *s1)) {
if (c == '\0') {
/* No more tokens. */
return NULL;
}
++s1;
}
if (c == '\"') {
goto skipQuote;
}
/* Save the start of the token. */
start = s1;
/* Search for the end of a non-quoted token. */
while ((c = *s1) != '\"' && !strchr (s2, c)) {
++s1;
}
if (c == '\0') {
/* The end of the last token is the end of the token list;
** don't go beyond it.
*/
goto found;
}
/* (A possible begin-quote mark will be rememberred.) */
goto terminate;
skipQuote:
++s1;
inQuote:
/* Don't let a quote mark be rememberred. */
c = '\0';
/* Save the start of the token. */
start = s1;
/* Search for the end of a quoted token. */
if ((s1 = strchr (s1, '\"')) == NULL) {
/* The quoted token ended with '\0'; therefore, point to a '\0',
** so that the next call will return NULL.
*/
next = "";
return start;
}
terminate:
*s1 = '\0';
++s1;
found:
next = s1;
return start;
}

View File

@ -0,0 +1,49 @@
/* strqtok-test.c
**
** 2014-05-20, Greg King
**
** This program tests that strqtok() correctly will parse strings
** with quotation marks in them. It should show this list of tokens
** from the test strings:
**
** >This<
** > is only <
** >a<
** >short<
** >quoting<
** >test , honoring blanks, commas<
** >and<
** >(4)<
** >empty<
** ><
** ><
** ><
** ><
** >strings, EOT <
**
** It shouldn"t show
**
** >Bogus token<
*/
#include <string.h>
#include <stdio.h>
void main(void)
{
/* b[] and s[] are declared as automatic, not static, variables
** because strqtok() will change them.
** They must be defined together; and, b[] must be defined first
** (because they're copied onto the top-down stack).
*/
char b[] = "Bogus token ";
char s[] = " This , \" is only \"a short "
"quoting\"test , honoring blanks"
", commas\", and (4) empty \"\"\"\"\"\"\"\" \"strings, EOT ";
char *t = strqtok(s, " ,");
while (t != NULL) {
printf(">%s<\n", t);
t = strqtok(NULL, " ,");
}
}