char * Parse_ReadUnparsedLine(Buffer linebuf, const char *type) { int c; Buf_Reset(linebuf); c = read_char(); if (c == EOF) { Parse_Error(PARSE_FATAL, "Unclosed %s", type); return NULL; } /* Handle '\' at beginning of line, since \\n needs special treatment */ while (c == '\\') { c = read_char(); if (c == '\n') { current->lineno++; do { c = read_char(); } while (c == ' ' || c == '\t'); } else { Buf_AddChar(linebuf, '\\'); if (c == '\\') { Buf_AddChar(linebuf, '\\'); c = read_char(); } break; } } read_logical_line(linebuf, c); return Buf_Retrieve(linebuf); }
/* Normal version of var_set_value(), to be called after variable is fully * initialized. */ static void var_set_value(Var *v, const char *val) { if ((v->flags & VAR_DUMMY) == 0) { Buf_Reset(&(v->val)); Buf_AddString(&(v->val), val); } else { var_set_initial_value(v, val); v->flags &= ~VAR_DUMMY; } }
/* we would like to subst on intervals, but it's complicated, so we cheat * by storing the interval in a static buffer. */ char * Var_Substi(const char *str, const char *estr, SymTable *ctxt, bool undefErr) { /* delimited string: no need to copy */ if (estr == NULL || *estr == '\0') return Var_Subst(str, ctxt, undefErr); Buf_Reset(&subst_buffer); Buf_Addi(&subst_buffer, str, estr); return Var_Subst(Buf_Retrieve(&subst_buffer), ctxt, undefErr); }
/* This is a fairly complex function, but without it, we could not skip * blocks of comments without reading them. */ static int skip_empty_lines_and_read_char(Buffer linebuf) { int c; /* the current character */ for (;;) { Buf_Reset(linebuf); c = read_char(); /* Strip leading spaces, fold on '\n' */ if (c == ' ') { do { c = read_char(); } while (c == ' ' || c == '\t'); while (c == '\\') { c = read_char(); if (c == '\n') { current->lineno++; do { c = read_char(); } while (c == ' ' || c == '\t'); } else { Buf_AddChar(linebuf, '\\'); if (c == '\\') { Buf_AddChar(linebuf, '\\'); c = read_char(); } if (c == EOF) return '\n'; else return c; } } assert(c != '\t'); } if (c == '#') c = skip_to_end_of_line(); /* Almost identical to spaces, except this occurs after * comments have been taken care of, and we keep the tab * itself. */ if (c == '\t') { Buf_AddChar(linebuf, '\t'); do { c = read_char(); } while (c == ' ' || c == '\t'); while (c == '\\') { c = read_char(); if (c == '\n') { current->lineno++; do { c = read_char(); } while (c == ' ' || c == '\t'); } else { Buf_AddChar(linebuf, '\\'); if (c == '\\') { Buf_AddChar(linebuf, '\\'); c = read_char(); } if (c == EOF) return '\n'; else return c; } } } if (c == '\n') current->lineno++; else return c; } }