Added string stripping functions
This commit is contained in:
8
Makefile
8
Makefile
@@ -1,10 +1,10 @@
|
||||
|
||||
CC = gcc
|
||||
STND=-ansi
|
||||
CFLAGS = $(STND) -pedantic -O3 -g -Werror -Wall -Wextra -Wformat=2 -Wshadow -Wno-long-long \
|
||||
-Wno-overlength-strings -Wno-format-nonliteral -Wcast-align \
|
||||
-Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wnested-externs \
|
||||
-Wmissing-include-dirs -Wswitch-default
|
||||
CFLAGS = $(STND) -pedantic -O3 -g -Werror -Wall -Wextra -Wformat=2 -Wshadow \
|
||||
-Wno-long-long -Wno-overlength-strings -Wno-format-nonliteral -Wcast-align \
|
||||
-Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wredundant-decls \
|
||||
-Wnested-externs -Wmissing-include-dirs -Wswitch-default
|
||||
|
||||
TESTS = $(wildcard tests/*.c)
|
||||
EXAMPLES = $(wildcard examples/*.c)
|
||||
|
20
README.md
20
README.md
@@ -582,22 +582,22 @@ Useful Parsers
|
||||
<tr><td><code>mpc_startswith(mpc_parser_t *a);</code></td><td>Matches the start of input followed by <code>a</code></td></tr>
|
||||
<tr><td><code>mpc_endswith(mpc_parser_t *a, mpc_dtor_t da);</code></td><td>Matches <code>a</code> followed by the end of input</td></tr>
|
||||
<tr><td><code>mpc_whole(mpc_parser_t *a, mpc_dtor_t da);</code></td><td>Matches the start of input, <code>a</code>, and the end of input</td></tr>
|
||||
<tr><td><code>mpc_stripl(mpc_parser_t *a);</code></td><td>Matches <code>a</code> striping any whitespace to the left</td></tr>
|
||||
<tr><td><code>mpc_stripr(mpc_parser_t *a);</code></td><td>Matches <code>a</code> striping any whitespace to the right</td></tr>
|
||||
<tr><td><code>mpc_strip(mpc_parser_t *a);</code></td><td>Matches <code>a</code> striping any surrounding whitespace</td></tr>
|
||||
<tr><td><code>mpc_tok(mpc_parser_t *a);</code></td><td>Matches <code>a</code> and strips any trailing whitespace</td></tr>
|
||||
<tr><td><code>mpc_sym(const char *s);</code></td><td>Matches string <code>s</code> and strips any trailing whitespace</td></tr>
|
||||
<tr><td><code>mpc_total(mpc_parser_t *a, mpc_dtor_t da);</code></td><td>Matches the whitespace stripped <code>a</code>, enclosed in the start and end of input</td></tr>
|
||||
<tr><td><code>mpc_stripl(mpc_parser_t *a);</code></td><td>Matches <code>a</code> first consuming any whitespace to the left</td></tr>
|
||||
<tr><td><code>mpc_stripr(mpc_parser_t *a);</code></td><td>Matches <code>a</code> then consumes any whitespace to the right</td></tr>
|
||||
<tr><td><code>mpc_strip(mpc_parser_t *a);</code></td><td>Matches <code>a</code> consuming any surrounding whitespace</td></tr>
|
||||
<tr><td><code>mpc_tok(mpc_parser_t *a);</code></td><td>Matches <code>a</code> and consumes any trailing whitespace</td></tr>
|
||||
<tr><td><code>mpc_sym(const char *s);</code></td><td>Matches string <code>s</code> and consumes any trailing whitespace</td></tr>
|
||||
<tr><td><code>mpc_total(mpc_parser_t *a, mpc_dtor_t da);</code></td><td>Matches the whitespace consumed <code>a</code>, enclosed in the start and end of input</td></tr>
|
||||
<tr><td><code>mpc_between(mpc_parser_t *a, mpc_dtor_t ad, <br /> const char *o, const char *c);</code></td><td> Matches <code>a</code> between strings <code>o</code> and <code>c</code></td></tr>
|
||||
<tr><td><code>mpc_parens(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between <code>"("</code> and <code>")"</code></td></tr>
|
||||
<tr><td><code>mpc_braces(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between <code>"<"</code> and <code>">"</code></td></tr>
|
||||
<tr><td><code>mpc_brackets(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between <code>"{"</code> and <code>"}"</code></td></tr>
|
||||
<tr><td><code>mpc_squares(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between <code>"["</code> and <code>"]"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_between(mpc_parser_t *a, mpc_dtor_t ad, <br /> const char *o, const char *c);</code></td><td>Matches <code>a</code> between <code>o</code> and <code>c</code>, where <code>o</code> and <code>c</code> have their trailing whitespace striped.</td></tr>
|
||||
<tr><td><code>mpc_tok_parens(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace stripped <code>"("</code> and <code>")"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_braces(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace stripped <code>"<"</code> and <code>">"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_brackets(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace stripped <code>"{"</code> and <code>"}"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_squares(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace stripped <code>"["</code> and <code>"]"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_parens(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace consumed <code>"("</code> and <code>")"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_braces(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace consumed <code>"<"</code> and <code>">"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_brackets(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace consumed <code>"{"</code> and <code>"}"</code></td></tr>
|
||||
<tr><td><code>mpc_tok_squares(mpc_parser_t *a, mpc_dtor_t ad);</code></td><td>Matches <code>a</code> between trailing whitespace consumed <code>"["</code> and <code>"]"</code></td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
23
mpc.c
23
mpc.c
@@ -2096,12 +2096,33 @@ mpc_val_t *mpcf_oct(mpc_val_t *x) {
|
||||
}
|
||||
|
||||
mpc_val_t *mpcf_float(mpc_val_t *x) {
|
||||
float* y = malloc(sizeof(float));
|
||||
float *y = malloc(sizeof(float));
|
||||
*y = strtod(x, NULL);
|
||||
free(x);
|
||||
return y;
|
||||
}
|
||||
|
||||
mpc_val_t *mpcf_strtriml(mpc_val_t *x) {
|
||||
char *s = x;
|
||||
while (isspace(*s)) {
|
||||
memmove(s, s+1, strlen(s));
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
mpc_val_t *mpcf_strtrimr(mpc_val_t *x) {
|
||||
char *s = x;
|
||||
size_t l = strlen(s);
|
||||
while (isspace(s[l-1])) {
|
||||
s[l-1] = '\0'; l--;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
mpc_val_t *mpcf_strtrim(mpc_val_t *x) {
|
||||
return mpcf_strtriml(mpcf_strtrimr(x));
|
||||
}
|
||||
|
||||
static const char mpc_escape_input_c[] = {
|
||||
'\a', '\b', '\f', '\n', '\r',
|
||||
'\t', '\v', '\\', '\'', '\"', '\0'};
|
||||
|
4
mpc.h
4
mpc.h
@@ -16,6 +16,7 @@
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
/*
|
||||
** State Type
|
||||
@@ -218,6 +219,9 @@ mpc_val_t *mpcf_int(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_hex(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_oct(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_float(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_strtriml(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_strtrimr(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_strtrim(mpc_val_t *x);
|
||||
|
||||
mpc_val_t *mpcf_escape(mpc_val_t *x);
|
||||
mpc_val_t *mpcf_escape_regex(mpc_val_t *x);
|
||||
|
35
tests/core.c
35
tests/core.c
@@ -6,8 +6,8 @@
|
||||
|
||||
static int int_eq(const void* x, const void* y) { return (*(int*)x == *(int*)y); }
|
||||
static void int_print(const void* x) { printf("'%i'", *((int*)x)); }
|
||||
static int string_eq(const void* x, const void* y) { return (strcmp(x, y) == 0); }
|
||||
static void string_print(const void* x) { printf("'%s'", (char*)x); }
|
||||
static int streq(const void* x, const void* y) { return (strcmp(x, y) == 0); }
|
||||
static void strprint(const void* x) { printf("'%s'", (char*)x); }
|
||||
|
||||
void test_ident(void) {
|
||||
|
||||
@@ -21,13 +21,13 @@ void test_ident(void) {
|
||||
free
|
||||
);
|
||||
|
||||
PT_ASSERT(mpc_test_pass(Ident, "test", "test", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_fail(Ident, " blah", "", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_pass(Ident, "anoth21er", "anoth21er", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_pass(Ident, "du__de", "du__de", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "some spaces", "", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "", "", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "18nums", "", string_eq, free, string_print));
|
||||
PT_ASSERT(mpc_test_pass(Ident, "test", "test", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_fail(Ident, " blah", "", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_pass(Ident, "anoth21er", "anoth21er", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_pass(Ident, "du__de", "du__de", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "some spaces", "", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "", "", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_fail(Ident, "18nums", "", streq, free, strprint));
|
||||
|
||||
mpc_delete(Ident);
|
||||
|
||||
@@ -69,7 +69,24 @@ void test_maths(void) {
|
||||
mpc_cleanup(4, Expr, Factor, Term, Maths);
|
||||
}
|
||||
|
||||
void test_strip(void) {
|
||||
|
||||
mpc_parser_t *Stripperl = mpc_apply(mpc_many(mpcf_strfold, mpc_any()), mpcf_strtriml);
|
||||
mpc_parser_t *Stripperr = mpc_apply(mpc_many(mpcf_strfold, mpc_any()), mpcf_strtrimr);
|
||||
mpc_parser_t *Stripper = mpc_apply(mpc_many(mpcf_strfold, mpc_any()), mpcf_strtrim);
|
||||
|
||||
PT_ASSERT(mpc_test_pass(Stripperl, " asdmlm dasd ", "asdmlm dasd ", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_pass(Stripperr, " asdmlm dasd ", " asdmlm dasd", streq, free, strprint));
|
||||
PT_ASSERT(mpc_test_pass(Stripper, " asdmlm dasd ", "asdmlm dasd", streq, free, strprint));
|
||||
|
||||
mpc_delete(Stripperl);
|
||||
mpc_delete(Stripperr);
|
||||
mpc_delete(Stripper);
|
||||
|
||||
}
|
||||
|
||||
void suite_core(void) {
|
||||
pt_add_test(test_ident, "Test Ident", "Suite Core");
|
||||
pt_add_test(test_maths, "Test Maths", "Suite Core");
|
||||
pt_add_test(test_strip, "Test Strip", "Suite Core");
|
||||
}
|
||||
|
Reference in New Issue
Block a user