/* * Get configuration from configuration file. */ void pgut_readopt(const char *path, pgut_option options[], int elevel) { FILE *fp; char buf[1024]; char key[1024]; char value[1024]; if (!options) return; if ((fp = pgut_fopen(path, "rt", true)) == NULL) return; while (fgets(buf, lengthof(buf), fp)) { size_t i; for (i = strlen(buf); i > 0 && IsSpace(buf[i - 1]); i--) buf[i - 1] = '\0'; if (parse_pair(buf, key, value)) { for (i = 0; options[i].type; i++) { pgut_option *opt = &options[i]; if (key_equals(key, opt->lname)) { if (opt->allowed == SOURCE_DEFAULT || opt->allowed > SOURCE_FILE) if (elevel >= ERROR) { ereport(ERROR, (errcode(elevel), errmsg("option %s cannot specified in file", opt->lname))); } else { elog(elevel, "option %s cannot specified in file", opt->lname); } else if (opt->source <= SOURCE_FILE) assign_option(opt, value, SOURCE_FILE); break; } } if (!options[i].type) { if (elevel >= ERROR) { ereport(ERROR, (errcode(elevel), errmsg("invalid option \"%s\"", key))); } else { elog(elevel, "invalid option \"%s\"", key); } } } } fclose(fp); }
static List * ParseControlFile(const char *path) { #define LINEBUF 1024 char buf[LINEBUF]; int lineno; FILE *file; List *items = NIL; file = pgut_fopen(path, "rt"); for (lineno = 1; fgets(buf, LINEBUF, file); lineno++) { char *keyword; char *value; int i; if (!ParseControlFileLine(buf, &keyword, &value)) continue; /* PATH_OPTIONS */ for (i = 0; i < NUM_PATH_OPTIONS; i++) { pgut_option *opt = &options[i]; if (pgut_keyeq(keyword, opt->lname)) { pgut_setopt(opt, value, SOURCE_FILE); break; } } /* Other options */ if (i >= NUM_PATH_OPTIONS) { size_t len; char *item; len = strlen(keyword) + strlen(value) + 2; item = pgut_malloc(len); snprintf(item, len, "%s=%s", keyword, value); items = lappend(items, item); if (pg_strcasecmp(item, "TYPE=FUNCTION") == 0) type_function = true; if (pg_strcasecmp(item, "TYPE=BINARY") == 0 || pg_strcasecmp(item, "TYPE=FIXED") == 0) type_binary = true; if (pg_strcasecmp(item, "WRITER=BINARY") == 0) writer_binary = true; } } fclose(file); return items; }
/* * Get configuration from configuration file. */ void pgut_readopt(const char *path, pgut_option options[], int elevel) { FILE *fp; char buf[1024]; char key[1024]; char value[1024]; if (!options) return; if ((fp = pgut_fopen(path, "Rt")) == NULL) return; while (fgets(buf, lengthof(buf), fp)) { size_t i; for (i = strlen(buf); i > 0 && IsSpace(buf[i - 1]); i--) buf[i - 1] = '\0'; if (parse_pair(buf, key, value)) { for (i = 0; options[i].type; i++) { pgut_option *opt = &options[i]; if (pgut_keyeq(key, opt->lname)) { if (opt->allowed == SOURCE_DEFAULT || opt->allowed > SOURCE_FILE) elog(elevel, "option %s cannot specified in file", opt->lname); else if (opt->source <= SOURCE_FILE) pgut_setopt(opt, value, SOURCE_FILE); break; } } if (!options[i].type) elog(elevel, "invalid option \"%s\"", key); } } fclose(fp); }