/* * Loads filename into memory, we use append_line() for that. */ static int load_file_in_memory(config_t *cfg) { int ret; FILE *fd; size_t len; prelude_string_t *out; char line[1024], *ptr, *tmp; ret = prelude_string_new(&out); if ( ret < 0 ) return ret; fd = fopen(cfg->filename, "r"); if ( ! fd ) { prelude_string_destroy(out); return prelude_error_verbose(prelude_error_code_from_errno(errno), "could not open '%s' for reading: %s", cfg->filename, strerror(errno)); } do { len = 0; ptr = fgets(line, sizeof(line), fd); if ( ptr ) { len = strlen(line); if ( line[len - 1] == '\n' ) line[len - 1] = 0; ret = prelude_string_cat(out, line); if ( ret < 0 ) goto err; if ( line[len - 1] != 0 ) continue; } ret = prelude_string_get_string_released(out, &tmp); if ( ret < 0 ) goto err; if ( ! tmp ) tmp = strdup(""); ret = op_append_line(cfg, tmp); if ( ret < 0 ) { free(tmp); goto err; } prelude_string_clear(out); } while ( ptr ); err: prelude_string_destroy(out); fclose(fd); return 0; }
/** * prelude_read_multiline2: * @fd: File descriptor to read input from. * @line: Pointer to a line counter. * @out: Pointer to a #prelude_string_t object where the line should be stored. * * This function handles line reading separated by the '\' character. * * Returns: 0 on success, a negative value if an error occured. */ int prelude_read_multiline2(FILE *fd, unsigned int *line, prelude_string_t *out) { int ret, r; char buf[8192]; prelude_string_clear(out); do { ret = prelude_read_multiline(fd, line, buf, sizeof(buf)); if ( ret < 0 && (r = prelude_error_get_code(ret)) != PRELUDE_ERROR_EINVAL ) { if ( r == PRELUDE_ERROR_EOF && ! prelude_string_is_empty(out) ) ret = 0; break; } r = prelude_string_cat(out, buf); if ( r < 0 ) return r; } while ( ret < 0 ); return ret; }