diff options
-rw-r--r-- | lib/pasta-red-sauce.rcp | 2 | ||||
-rw-r--r-- | parser.c | 26 |
2 files changed, 23 insertions, 5 deletions
diff --git a/lib/pasta-red-sauce.rcp b/lib/pasta-red-sauce.rcp index e870358..bef84c1 100644 --- a/lib/pasta-red-sauce.rcp +++ b/lib/pasta-red-sauce.rcp @@ -1,6 +1,6 @@ @pasta with red sauce
-!lib/pa sta.rcp
+2!pa sta.rcp
salt = *
sugar = 1 teaspoon
onion, garlic = 1
@@ -13,6 +13,8 @@ static const int parse_title(const char * s, recipe * r, pt * type) { fdebug("^ title\n"); + int rc = 0; + if (s[0] == '@' && strlen(s) > 1) { char tmp[LINE_SIZE] = ""; strcpy(tmp, ++s); @@ -20,9 +22,10 @@ parse_title(const char * s, recipe * r, pt * type) r->title = strdup(tmp); } else { r->title = strdup(r->filename); + rc = 1; } *type = ITEMS; - return 0; + return rc; } static const int @@ -34,12 +37,21 @@ parse_item(const char * s, recipe * r, pt * type, char * error) return 0; } - if (s[0] == '!') { + /* 1 - 9 in ascii */ + if ((s[0] > 48 && s[0] < 58) || s[0] == '!') { fdebug("INCLUDING: %s\n", s); char tmp[LINE_SIZE] = ""; char path[LINE_SIZE] = ""; - strcpy(tmp, ++s); + + char *endptr; + int n = (int)strtol(s, &endptr, 10); + if (endptr[0] != '!') { + sprintf(error, "malformed include: %s", s); + return 1; + } + + strcpy(tmp, ++endptr); trim(tmp); if (!strlen(tmp)) { @@ -60,6 +72,7 @@ parse_item(const char * s, recipe * r, pt * type, char * error) sprintf(error, "Couldn't include %s", path); return 1; } + rr->n = n; //copy_items(r, rr); new_subrecipe(r, rr); //free_recipe(rr); @@ -99,6 +112,11 @@ parse_item(const char * s, recipe * r, pt * type, char * error) buf[c] = '\0'; trim(buf); + if (!itemc) { + sprintf(error, "malformed ingderient: %s", buf); + return 1; + } + if (!strlen(buf)) { sprintf(error, "empty ingredient quantity: %s", s); return 1; @@ -141,7 +159,7 @@ handle_line(const char * s, recipe * r, char * error, pt * type, const char * pr switch (*type) { case TITLE: - if (!parse_title(s, r, type)) + if (parse_title(s, r, type)) if (parse_item(s, r, type, error)) return 1; break; |