Commit d5abc011 by Aaron Leung

Fixing some tiny but breaking bugs.

parent 2053f9c2
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include "prefix_primitives.h"
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 p = 0;
int len = prefix_is_exactly(src, beg);
......@@ -19,23 +32,63 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
while (1) {
if (src[p] == '\0') return 0;
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;
}
}
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(alpha);
DEFINE_CTYPE_SEQUENCE_MATCHER(digit);
DEFINE_CTYPE_SEQUENCE_MATCHER(xdigit);
DEFINE_CTYPE_SEQUENCE_MATCHER(alnum);
DEFINE_CTYPE_SEQUENCE_MATCHER(punct);
DEFINE_TO_EOL_MATCHER(line_comment, "//");
DEFINE_DELIMITED_MATCHER(block_comment, "/*", "*/", 0);
DEFINE_DELIMITED_MATCHER(dqstring, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(sqstring, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(double_quoted_string, "\"", "\"", 1);
DEFINE_DELIMITED_MATCHER(single_quoted_string, "'", "'", 1);
DEFINE_DELIMITED_MATCHER(interpolant, "#{", "}", 0);
int prefix_is_string_constant(char *src) {
int len = prefix_is_dqstring(src);
return len ? len : prefix_is_sqstring(src);
int prefix_is_string(char *src) {
int len = prefix_is_double_quoted_string(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_one_of(char *, char *);
int prefix_is_some_of(char *, char *);
int prefix_is_delimited_by(char *, char *, char *, int);
#define DECLARE_MATCHER(name) \
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) \
int prefix_is_one_ ## type(char *src) \
int prefix_is_one_ ## type(char *src) { \
return is ## type(src[0]) ? 1 : 0; \
}
#define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \
int prefix_is_ ## type ## s(char *src) { \
int p = 0; \
while (is ## type(src[p++])) ; \
while (is ## type(src[p])) p++; \
return p; \
}
......@@ -28,14 +35,21 @@ int prefix_is_ ## name(char *src) { \
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(alphas);
DECLARE_MATCHER(digits);
DECLARE_MATCHER(xdigits);
DECLARE_MATCHER(alnums);
DECLARE_MATCHER(puncts);
DECLARE_MATCHER(line_comment);
DECLARE_MATCHER(block_comment);
DECLARE_MATCHER(dqstring);
DECLARE_MATCHER(sqstring);
DECLARE_MATCHER(double_quoted_string);
DECLARE_MATCHER(single_quoted_string);
DECLARE_MATCHER(interpolant);
DECLARE_MATCHER(string_constant);
DECLARE_MATCHER(string);
......@@ -4,26 +4,31 @@
#include <stdlib.h>
#include "prefix_primitives.h"
int main() {
char *s = "'this is a \"string\" now' blah blah blah";
int l = prefix_is_string_constant(s);
if (l) {
printf("matched a string literal of length %d:\n", l);
void printn(char *s, int n) {
int i;
for (i = 0; i < l; i++) {
printf("matched %d characters:\t", n);
for (i = 0; i < n; i++) {
putchar(s[i]);
}
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;
}
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