Commit d5abc011 by Aaron Leung

Fixing some tiny but breaking bugs.

parent 2053f9c2
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include "prefix_primitives.h" #include "prefix_primitives.h"
int prefix_is_exactly(char *src, char* pre) { int prefix_is_exactly(char *src, char* pre) {
...@@ -11,6 +12,18 @@ int prefix_is_exactly(char *src, char* pre) { ...@@ -11,6 +12,18 @@ int prefix_is_exactly(char *src, char* pre) {
} }
} }
int prefix_is_one_of(char *src, char *class) {
int i;
for (i = 0; class[i]; i++) if (class[i] == src[0]) return 1;
return 0;
}
int prefix_is_some_of(char *src, char *class) {
int p;
for (p = 0; prefix_is_one_of(src+p, class); p++) ;
return p;
}
int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) { int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
int p = 0; int p = 0;
int len = prefix_is_exactly(src, beg); int len = prefix_is_exactly(src, beg);
...@@ -19,23 +32,63 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) { ...@@ -19,23 +32,63 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
while (1) { while (1) {
if (src[p] == '\0') return 0; if (src[p] == '\0') return 0;
len = prefix_is_exactly(src+p, end); len = prefix_is_exactly(src+p, end);
if (len && esc && src[p-1] != '\\') return p + len; if (len && (!esc || src[p-1] != '\\')) return p + len;
p += len ? len : 1; p += len ? len : 1;
} }
} }
DEFINE_SINGLE_CTYPE_MATCHER(space);
DEFINE_SINGLE_CTYPE_MATCHER(alpha);
DEFINE_SINGLE_CTYPE_MATCHER(digit);
DEFINE_SINGLE_CTYPE_MATCHER(xdigit);
DEFINE_SINGLE_CTYPE_MATCHER(alnum);
DEFINE_SINGLE_CTYPE_MATCHER(punct);
DEFINE_CTYPE_SEQUENCE_MATCHER(space); DEFINE_CTYPE_SEQUENCE_MATCHER(space);
DEFINE_CTYPE_SEQUENCE_MATCHER(alpha); DEFINE_CTYPE_SEQUENCE_MATCHER(alpha);
DEFINE_CTYPE_SEQUENCE_MATCHER(digit); DEFINE_CTYPE_SEQUENCE_MATCHER(digit);
DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit); DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit);
DEFINE_CTYPE_SEQUENCE_MATCHER(alnum); DEFINE_CTYPE_SEQUENCE_MATCHER(alnum);
DEFINE_CTYPE_SEQUENCE_MATCHER(punct);
DEFINE_TO_EOL_MATCHER(line_comment, "//"); DEFINE_TO_EOL_MATCHER(line_comment, "//");
DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0); DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0);
DEFINE_DELIMITED_MATCHER(dqstring, "\"", "\"", 1); DEFINE_DELIMITED_MATCHER(double_quoted_string, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(sqstring, "'", "'", 1); DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0); DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string_constant(char *src) { int prefix_is_string(char *src) {
int len = prefix_is_dqstring(src); int len = prefix_is_double_quoted_string(src);
return len ? len : prefix_is_sqstring(src); return len ? len : prefix_is_single_quoted_string(src);
} }
DEFINE_EXACT_MATCHER(lparen, "(");
DEFINE_EXACT_MATCHER(rparen, ")");
DEFINE_EXACT_MATCHER(lbrack, "[");
DEFINE_EXACT_MATCHER(rbrack, "]");
DEFINE_EXACT_MATCHER(lbrace, "{");
DEFINE_EXACT_MATCHER(rbrace, "}");
DEFINE_EXACT_MATCHER(asterisk, "*");
/* not sure I'm gonna' need these
DEFINE_EXACT_MATCHER(exclamation, "!");
DEFINE_EXACT_MATCHER(pound, "#");
DEFINE_EXACT_MATCHER(hash, "#");
DEFINE_EXACT_MATCHER(dollar, "$");
DEFINE_EXACT_MATCHER(percent, "%");
DEFINE_EXACT_MATCHER(ampersand, "&");
DEFINE_EXACT_MATCHER(lparen, "(");
DEFINE_EXACT_MATCHER(rparen, ")");
DEFINE_EXACT_MATCHER(times, "*");
DEFINE_EXACT_MATCHER(comma, ",");
DEFINE_EXACT_MATCHER(hyphen, "-");
DEFINE_EXACT_MATCHER(minus, "-");
DEFINE_EXACT_MATCHER(period, ".");
DEFINE_EXACT_MATCHER(dot, ".");
DEFINE_EXACT_MATCHER(slash, "/");
DEFINE_EXACT_MATCHER(divide, "/");
DEFINE_EXACT_MATCHER(colon, ":");
DEFINE_EXACT_MATCHER(semicolon, ";");
DEFINE_EXACT_MATCHER(lt, "<");
DEFINE_EXACT_MATCHER(lte, "<=");
DEFINE_EXACT_MATCHER(gt, ">");
DEFINE_EXACT_MATCHER(gte, ">=");
*/
\ No newline at end of file
int prefix_is_exactly(char *, char*); int prefix_is_exactly(char *, char*);
int prefix_is_one_of(char *, char *);
int prefix_is_some_of(char *, char *);
int prefix_is_delimited_by(char *, char *, char *, int); int prefix_is_delimited_by(char *, char *, char *, int);
#define DECLARE_MATCHER(name) \ #define DECLARE_MATCHER(name) \
int prefix_is_ ## name(char *) int prefix_is_ ## name(char *)
#define DEFINE_EXACT_MATCHER(name, prefix) \
int prefix_is_ ## name(char *src) { \
return prefix_is_exactly(src, prefix); \
}
#define DEFINE_SINGLE_CTYPE_MATCHER(type) \ #define DEFINE_SINGLE_CTYPE_MATCHER(type) \
int prefix_is_one_ ## type(char *src) \ int prefix_is_one_ ## type(char *src) { \
return is ## type(src[0]) ? 1 : 0; \ return is ## type(src[0]) ? 1 : 0; \
} }
#define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \ #define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \
int prefix_is_ ## type ## s(char *src) { \ int prefix_is_ ## type ## s(char *src) { \
int p = 0; \ int p = 0; \
while (is ## type(src[p++])) ; \ while (is ## type(src[p])) p++; \
return p; \ return p; \
} }
...@@ -28,14 +35,21 @@ int prefix_is_ ## name(char *src) { \ ...@@ -28,14 +35,21 @@ int prefix_is_ ## name(char *src) { \
return p; \ return p; \
} }
DECLARE_MATCHER(one_space);
DECLARE_MATCHER(one_alpha);
DECLARE_MATCHER(one_digit);
DECLARE_MATCHER(one_xdigit);
DECLARE_MATCHER(one_alnum);
DECLARE_MATCHER(one_punct);
DECLARE_MATCHER(spaces); DECLARE_MATCHER(spaces);
DECLARE_MATCHER(alphas); DECLARE_MATCHER(alphas);
DECLARE_MATCHER(digits); DECLARE_MATCHER(digits);
DECLARE_MATCHER(xdigits); DECLARE_MATCHER(xdigits);
DECLARE_MATCHER(alnums); DECLARE_MATCHER(alnums);
DECLARE_MATCHER(puncts);
DECLARE_MATCHER(line_comment); DECLARE_MATCHER(line_comment);
DECLARE_MATCHER(block_comment); DECLARE_MATCHER(block_comment);
DECLARE_MATCHER(dqstring); DECLARE_MATCHER(double_quoted_string);
DECLARE_MATCHER(sqstring); DECLARE_MATCHER(single_quoted_string);
DECLARE_MATCHER(interpolant); DECLARE_MATCHER(interpolant);
DECLARE_MATCHER(string_constant); DECLARE_MATCHER(string);
...@@ -4,26 +4,31 @@ ...@@ -4,26 +4,31 @@
#include <stdlib.h> #include <stdlib.h>
#include "prefix_primitives.h" #include "prefix_primitives.h"
int main() {
char *s = "'this is a \"string\" now' blah blah blah"; void printn(char *s, int n) {
int l = prefix_is_string_constant(s);
if (l) {
printf("matched a string literal of length %d:\n", l);
int i; int i;
for (i = 0; i < l; i++) { printf("matched %d characters:\t", n);
for (i = 0; i < n; i++) {
putchar(s[i]); putchar(s[i]);
} }
putchar('\n'); putchar('\n');
} }
else {
printf("matched %d characters\n", l); int main() {
} char *s = "'this \\'is\\' a \"string\" now' blah blah blah";
char *t = "/* this is a c comment \\x */ blah blah";
char *u = "#{ this is an interpolant \\x } blah blah";
char *v = "hello my name is aaron";
printn(s, prefix_is_string(s));
printn(s, prefix_is_one_of(s, "abcde+'"));
printn(s, prefix_is_some_of(s, "'abcdefghijklmnopqrstuvwxyz "));
printn(t, prefix_is_block_comment(t));
printn(u, prefix_is_interpolant(u));
printn(v, prefix_is_alphas(v));
printn(v, prefix_is_one_alpha(v));
printn(v, prefix_is_exactly(v, "hello"));
unsigned char x;
printf("By the way, punctuation symbols are:\n");
for (x = '\0'; x < 128; x++) if (ispunct(x)) printf("%c", x);
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;
} }
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