Added string stripping functions
This commit is contained in:
8
Makefile
8
Makefile
@@ -1,10 +1,10 @@
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
STND=-ansi
|
STND=-ansi
|
||||||
CFLAGS = $(STND) -pedantic -O3 -g -Werror -Wall -Wextra -Wformat=2 -Wshadow -Wno-long-long \
|
CFLAGS = $(STND) -pedantic -O3 -g -Werror -Wall -Wextra -Wformat=2 -Wshadow \
|
||||||
-Wno-overlength-strings -Wno-format-nonliteral -Wcast-align \
|
-Wno-long-long -Wno-overlength-strings -Wno-format-nonliteral -Wcast-align \
|
||||||
-Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wredundant-decls -Wnested-externs \
|
-Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wredundant-decls \
|
||||||
-Wmissing-include-dirs -Wswitch-default
|
-Wnested-externs -Wmissing-include-dirs -Wswitch-default
|
||||||
|
|
||||||
TESTS = $(wildcard tests/*.c)
|
TESTS = $(wildcard tests/*.c)
|
||||||
EXAMPLES = $(wildcard examples/*.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_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_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_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_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> striping any whitespace to the right</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> striping any surrounding whitespace</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 strips any trailing 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 strips 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 stripped <code>a</code>, enclosed in the start and end of input</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_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_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_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_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_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_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_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 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 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 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 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 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 consumed <code>"["</code> and <code>"]"</code></td></tr>
|
||||||
|
|
||||||
</table>
|
</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) {
|
mpc_val_t *mpcf_float(mpc_val_t *x) {
|
||||||
float* y = malloc(sizeof(float));
|
float *y = malloc(sizeof(float));
|
||||||
*y = strtod(x, NULL);
|
*y = strtod(x, NULL);
|
||||||
free(x);
|
free(x);
|
||||||
return y;
|
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[] = {
|
static const char mpc_escape_input_c[] = {
|
||||||
'\a', '\b', '\f', '\n', '\r',
|
'\a', '\b', '\f', '\n', '\r',
|
||||||
'\t', '\v', '\\', '\'', '\"', '\0'};
|
'\t', '\v', '\\', '\'', '\"', '\0'};
|
||||||
|
4
mpc.h
4
mpc.h
@@ -16,6 +16,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** State Type
|
** 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_hex(mpc_val_t *x);
|
||||||
mpc_val_t *mpcf_oct(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_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(mpc_val_t *x);
|
||||||
mpc_val_t *mpcf_escape_regex(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 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 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 int streq(const void* x, const void* y) { return (strcmp(x, y) == 0); }
|
||||||
static void string_print(const void* x) { printf("'%s'", (char*)x); }
|
static void strprint(const void* x) { printf("'%s'", (char*)x); }
|
||||||
|
|
||||||
void test_ident(void) {
|
void test_ident(void) {
|
||||||
|
|
||||||
@@ -21,13 +21,13 @@ void test_ident(void) {
|
|||||||
free
|
free
|
||||||
);
|
);
|
||||||
|
|
||||||
PT_ASSERT(mpc_test_pass(Ident, "test", "test", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_pass(Ident, "test", "test", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_fail(Ident, " blah", "", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_fail(Ident, " blah", "", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_pass(Ident, "anoth21er", "anoth21er", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_pass(Ident, "anoth21er", "anoth21er", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_pass(Ident, "du__de", "du__de", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_pass(Ident, "du__de", "du__de", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_fail(Ident, "some spaces", "", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_fail(Ident, "some spaces", "", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_fail(Ident, "", "", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_fail(Ident, "", "", streq, free, strprint));
|
||||||
PT_ASSERT(mpc_test_fail(Ident, "18nums", "", string_eq, free, string_print));
|
PT_ASSERT(mpc_test_fail(Ident, "18nums", "", streq, free, strprint));
|
||||||
|
|
||||||
mpc_delete(Ident);
|
mpc_delete(Ident);
|
||||||
|
|
||||||
@@ -69,7 +69,24 @@ void test_maths(void) {
|
|||||||
mpc_cleanup(4, Expr, Factor, Term, Maths);
|
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) {
|
void suite_core(void) {
|
||||||
pt_add_test(test_ident, "Test Ident", "Suite Core");
|
pt_add_test(test_ident, "Test Ident", "Suite Core");
|
||||||
pt_add_test(test_maths, "Test Maths", "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