Commit a4b84541 by Aaron Leung

Refactoring and fixing stuff.

parent 18ec89bd
enum sss_type {
ATOM,
SEQUENCE,
CHOICE,
OPTION,
AT_LEAST_ZERO,
AT_LEAST_ONE,
AT_LEAST_N,
AT_MOST_N,
EXACTLY_N,
END
};
typedef struct {
sss_type tag;
size_t (*matcher)(char *);
} sss_component;
typedef struct {
size_t length;
sss_component *body;
} sss_pattern;
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "text_prefix_matchers.h" #include "prefix_primitives.h"
int main() { int main() {
char *s = "'this is a \"string\" now' blah blah blah"; char *s = "'this is a \"string\" now' blah blah blah";
int l = text_has_delimited_prefix(s, "'", "'", 1); int l = prefix_is_string_constant(s);
if (l) { if (l) {
printf("matched a string literal of length %d:\n", l); printf("matched a string literal of length %d:\n", l);
int i; int i;
...@@ -15,10 +15,15 @@ int main() { ...@@ -15,10 +15,15 @@ int main() {
} }
putchar('\n'); putchar('\n');
} }
else {
printf("matched %d characters\n", l);
}
unsigned char x; unsigned char x;
printf("By the way, punctuation symbols are:\n"); printf("By the way, punctuation symbols are:\n");
for (x = '\0'; x < 128; x++) if (ispunct(x)) printf("%c", x); for (x = '\0'; x < 128; x++) if (ispunct(x)) printf("%c", x);
putchar('\n'); putchar('\n');
printf("By the way, 0 || 24 is: %d\n", 0 || 24);
printf("And 24 || 0 is: %d\n", 24 || 0);
return 0; return 0;
} }
\ No newline at end of file
#include <ctype.h>
#include <string.h>
#define text_has_ctype_prefix(src, type) (is ## type((src)[0]) ? 1 : 0)
#define DEF_SINGLE_CTYPE_PREFIX_MATCHER(type) \
size_t text_starts_with_one_ ## type(char *src) \
return is ## type(src[0]) ? 1 : 0; \
}
#define DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(type) \
size_t text_starts_with_ ## type ## s(char *src) { \
int p = 0; \
while (is ## type(src[p])) p++; \
return p; \
}
#define DEF_DELIMITED_PREFIX_MATCHER(name, begin, end, escapable) \
size_t text_starts_with_ ## name(char *src) { \
return text_has_delimited_prefix(src, begin, end, escapable); \
}
size_t text_has_exact_prefix(char *src, char* pre) {
int p = 0;
while (1) {
if (pre[p] == '\0') return p;
if (pre[p] != src[p]) return 0;
p++;
}
}
size_t text_has_delimited_prefix(char *src, char *beg, char *end, int esc) {
int p = 0;
size_t len = text_has_exact_prefix(src, beg);
if (!len) return 0;
p += len;
while (1) {
if (src[p] == '\0') return 0;
len = text_has_exact_prefix(src+p, end);
if (len && esc && src[p-1] != '\\') return p + len;
p += len || 1;
}
}
/*
These macro calls expand into function definitions. Their corresponding
signatures are in the comments.
*/
DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(space); /* size_t text_starts_with_spaces(char *) */
DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(alpha); /* size_t text_starts_with_alphas(char *) */
DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(digit); /* size_t text_starts_with_digits(char *) */
DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(xdigit); /* size_t text_starts_with_xdigits(char *) */
DEF_CTYPE_SEQUENCE_PREFIX_MATCHER(alnum); /* size_t text_starts_with_alnums(char *) */
size_t text_starts_with_whitespace(char *src) {
int p = 0;
while (isspace(src[p++])) ;
return p;
}
size_t text_starts_with_block_comment(char *src) {
return text_has_delimited_prefix(src, "/*", "*/", 0);
}
size_t text_starts_with_line_comment(char *src) {
int p = text_has_exact_prefix(src, "//");
while (src[p] != '\n' && src[p] != '\0') p++;
return p;
}
DEF_DELIMITED_PREFIX_MATCHER(dqstring, "\"", "\"", 1);
DEF_DELIMITED_PREFIX_MATCHER(sqstring, "'", "'", 1);
size_t text_starts_with_string_constant(char *src) {
return text_starts_with_dqstring(src) || text_starts_with_sqstring(src);
}
size_t text_starts_with_interpolant(char *src) {
return text_has_delimited_prefix(src, "#{", "}", 0);
}
size_t text_has_exact_prefix(char *, char*);
size_t text_has_delimited_prefix(char *, char *, char *, int);
size_t text_starts_with_delimited(char *src, char d);
size_t text_starts_with_line_comment(char *src);
size_t text_starts_with_block_comment(char *src);
/* more to come */
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment