Commit 871fb84a by Aaron Leung

Basic string prefix matching functions for tokenization. Based on previous…

Basic string prefix matching functions for tokenization. Based on previous parser-writing experience, I don't think I'll need a general-purpose regexp library.
parent 8751077c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "text_prefix_matchers.h"
int main() {
char *s = "'this is a \"string\" now' blah blah blah";
int l = text_has_delimited_prefix(s, "'", "'", 1);
if (l) {
printf("matched a string literal of length %d:\n", l);
int i;
for (i = 0; i < l; i++) {
putchar(s[i]);
}
putchar('\n');
}
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; \
}
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;
}
}
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;
}
size_t text_starts_with_string_constant(char *src) {
return text_has_delimited_prefix(src, "\"", "\"", 1)
|| text_has_delimited_prefix(src, "'", "'", 1);
}
size_t text_starts_with_interpolant(char *src) {
return text_has_delimited_prefix(src, "#{", "}", 0);
}
size_t sass_text_has_exact_prefix(char *, char*);
size_t sass_text_has_delimited_prefix(char *, char *, char *, int);
size_t sass_text_starts_with_delimited(char *src, char d);
size_t sass_text_starts_with_line_comment(char *src);
size_t sass_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