bool read_line(char *buf, size_t size) { size_t len ; bool eof = false; size_t config_id_len; char *buf_start; bool rev_cmp; size_t ofs; char *text_start; config_id_len = config_id ? strlen(config_id) : 0; do { if (fgets(buf, (int)size, current_stream)) { len = strlen(buf); if (len && (buf[len-1] == '\n' || buf[len-1] == '\r')) buf[len-1] = '\0'; if (len > 1 && (buf[len-2] == '\n' || buf[len-2] == '\r')) buf[len-2] = '\0'; text_start = buf + strspn(buf, " \t"); if (text_start[0] == '@') { /* If the line starts '@', check the following word matches the system id. @^ reverses the sense of the match */ if (text_start[1] == '^') { rev_cmp = true; ofs = 2; } else { rev_cmp = false; ofs = 1; } /* We need something after the system_id */ if (!(buf_start = strpbrk(text_start + ofs, " \t"))) { buf[0] = '\0'; break; } /* Check if config_id matches/doesn't match as appropriate */ if ((!config_id || (size_t)(buf_start - (text_start + ofs)) != config_id_len || strncmp(text_start + ofs, config_id, config_id_len)) != rev_cmp) { buf[0] = '\0'; break; } /* Remove the @config_id from start of line */ memset(text_start, ' ', (size_t)(buf_start - text_start)); } } else { eof = true; buf[0] = '\0'; break; } } while (buf[0] && check_include(buf)); return !eof; }
int read_line(char *buf, int size) { int ch; do { int count = 0; memset(buf, 0, MAXBUF); while ((ch = fgetc(current_stream)) != EOF && (int) ch != '\n' && (int) ch != '\r') { if (count < size) buf[count] = (int) ch; else break; count++; } } while (check_include(buf) == 1); return (ch == EOF) ? 0 : 1; }
bool read_line(char *buf, size_t size) { size_t len ; bool eof = false; do { if (fgets(buf, (int)size, current_stream)) { len = strlen(buf); if (len && (buf[len-1] == '\n' || buf[len-1] == '\r')) buf[len-1] = '\0'; if (len > 1 && (buf[len-2] == '\n' || buf[len-2] == '\r')) buf[len-2] = '\0'; } else { eof = true; buf[0] = '\0'; } } while (check_include(buf)); return !eof; }
/********************************************************************** Read a new line into cur_line; also copy to copy_line. Increments line_num and cur_line_pos. Returns 0 if didn't read or other problem: treat as EOF. Strips newline from input. ***********************************************************************/ static bool read_a_line(struct inputfile *inf) { struct astring *line; char *ret; int pos; assert_sanity(inf); if (inf->at_eof) return FALSE; /* abbreviation: */ line = &inf->cur_line; /* minimum initial line length: */ astr_minsize(line, 80); pos = 0; /* don't print "orig line" in warnings until we have it: */ inf->copy_line.n = 0; /* Read until we get a full line: * At start of this loop, pos is index to trailing null * (or first position) in line. */ for(;;) { ret = fz_fgets(line->str + pos, line->n_alloc - pos, inf->fp); if (!ret) { /* fgets failed */ inf->at_eof = TRUE; if (inf->in_string) { /* Note: Don't allow multi-line strings to cross "include" * boundaries */ inf_log(inf, LOG_ERROR, "Multi-line string went to end-of-file"); return FALSE; } break; } pos += strlen(line->str + pos); line->n = pos + 1; if (line->str[pos-1] == '\n') { line->str[pos-1] = '\0'; line->n--; break; } if (line->n != line->n_alloc) { freelog(LOG_VERBOSE, "inputfile: expect missing newline at EOF"); } astr_minsize(line, line->n*2); } inf->line_num++; inf->cur_line_pos = 0; astr_minsize(&inf->copy_line, inf->cur_line.n + ((inf->cur_line.n == 0) ? 1 : 0)); strcpy(inf->copy_line.str, inf->cur_line.str); if (check_include(inf)) { return read_a_line(inf); } if (inf->at_eof) { line->str[0] = '\0'; line->n = 0; if (inf->included_from) { /* Pop the include, and get next line from file above instead. */ struct inputfile *inc = inf->included_from; inf_close_partial(inf); *inf = *inc; /* so the user pointer in still valid * (and inf pointers in calling functions) */ free(inc); return read_a_line(inf); } return FALSE; } else { return TRUE; } }