/* * next_expr finds the next expression delimited by brackets. The type * of bracket expected is passed as a parameter. Returns NULL on error. * * YOU MUST CHECK FOR AND PROPERLY HANDLE A NULL ON RETURN -- * PASSING NULL TO parse_line() or parse_arglist() OR SIMILAR FUNCTIONS * WILL RETURN IN A PANIC. DO NOT IGNORE THIS! */ static __inline__ char * my_next_expr (char **args, char type, int whine, int wantchar) { char *expr_start, *expr_end; ssize_t span; if (!*args || !**args || **args != type) { if (whine) say("Expression syntax"); return NULL; } /* Find the end of the expression and terminate it. */ expr_start = *args; if ((span = MatchingBracket(expr_start + 1, type, (type == '(') ? ')' : '}')) < 0) { if (whine) say("Unmatched '%c' around [%-.20s]", type, expr_start + 1); return NULL; } else expr_end = expr_start + 1 + span; *expr_end = 0; /* * Reset the input string to non-whitespace after the expression. * "expr_end + 1" is safe here -- "expr_end" points at where the * old } or ) was, and there is at the very least a nul character * after that. */ *args = skip_spaces(expr_end + 1); /* Remove any extraneous whitespace in the expression */ expr_start = skip_spaces(expr_start + 1); remove_trailing_spaces(expr_start, 0); /* * It is guaranteed that (ptr2[-1] >= *args) and so it is further * guaranteed that assigning to ptr2[-1] is valid. So we will stick * the type of expression there just in case anyone wants it. */ if (wantchar) *--expr_start = type; return expr_start; }
/* * next_expr finds the next expression delimited by brackets. The type * of bracket expected is passed as a parameter. Returns NULL on error. */ u_char * next_expr(u_char **args, int itype) { u_char *ptr, *ptr2, *ptr3; u_char type = (u_char)itype; if (!*args) return NULL; ptr2 = *args; if (!*ptr2) return 0; if (*ptr2 != type) { say("Expression syntax"); return 0; } /* { */ ptr = MatchingBracket(ptr2 + 1, type, (type == '(') ? ')' : '}'); if (!ptr) { say("Unmatched '%c'", type); return 0; } *ptr = '\0'; do { ptr2++; } while (isspace(*ptr2)); ptr3 = ptr+1; while (isspace(*ptr3)) ptr3++; *args = ptr3; if (*ptr2) { ptr--; while (isspace(*ptr)) *ptr-- = '\0'; } return ptr2; }