56 lines
1.6 KiB
C
56 lines
1.6 KiB
C
|
/* qindex.c
|
||
|
This program works just like "index()", but it recognizes Prospero quoting.
|
||
|
Looks for first unquoted instance of "c" in string s.
|
||
|
Returns NULL if none found.
|
||
|
If it finds a mis-quoted string, returns NULL and sets perrno to
|
||
|
PARSE_ERROR.
|
||
|
Author: swa@isi.edu, 8/17/92
|
||
|
*/
|
||
|
#include <pfs.h> /* to make sure we match definition. */
|
||
|
#include <perrno.h>
|
||
|
|
||
|
char *
|
||
|
qindex(const char *s, char c)
|
||
|
{
|
||
|
enum { OUTSIDE_QUOTATION, IN_QUOTATION,
|
||
|
SEEN_POSSIBLE_CLOSING_QUOTE } state;
|
||
|
const char *start = s;
|
||
|
|
||
|
state = OUTSIDE_QUOTATION;
|
||
|
|
||
|
for (; *s; ++s) {
|
||
|
switch (state) {
|
||
|
case OUTSIDE_QUOTATION:
|
||
|
if (*s == '\'')
|
||
|
state = IN_QUOTATION;
|
||
|
else if (*s == c)
|
||
|
return (char *) s; /* flush CONST */
|
||
|
break;
|
||
|
case IN_QUOTATION:
|
||
|
if (*s == '\'')
|
||
|
state = SEEN_POSSIBLE_CLOSING_QUOTE;
|
||
|
break;
|
||
|
case SEEN_POSSIBLE_CLOSING_QUOTE:
|
||
|
if (*s == '\'') {
|
||
|
if (c == '\'')
|
||
|
return (char *) s; /* flush CONST */
|
||
|
state = IN_QUOTATION;
|
||
|
} else {
|
||
|
state = OUTSIDE_QUOTATION;
|
||
|
if (*s == c)
|
||
|
return (char *) s; /* flush CONST */
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
internal_error("qindex(): impossible state!");
|
||
|
}
|
||
|
}
|
||
|
if (state == IN_QUOTATION) {
|
||
|
perrno = PARSE_ERROR;
|
||
|
p_err_string = qsprintf_stcopyr(p_err_string,
|
||
|
"qindex(): encountered text with unbalanced quoting: %'s", start);
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|