blob: 2c97a178be1b5615e6c56b0f350e426d4e92b5bb [file] [log] [blame]
/* Copyright (c) 2016 Google Inc
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Various option parsing utility functions. */
#include <parlib/opts.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
/* Parses an option file, calling parse() on individual lines. We trim the
* lines of any leading or trailing spaces first, and ignore anything after #.
*/
int parse_opts_file(char *opts_file, void (*parse)(char *))
{
char *line = NULL;
size_t len = 0;
ssize_t read;
FILE *fp;
char *_line;
if (!opts_file)
return 0;
fp = fopen(opts_file, "r");
if (!fp)
return -1;
while ((read = getline(&line, &len, fp)) != -1) {
_line = line;
/* Drop comments */
for (int i = 0; i < read; i++) {
if (_line[i] == '#') {
_line[i] = 0;
read = i;
break;
}
}
if (!read)
continue;
/* Drop trailing spaces */
for (int i = read - 1; i >= 0; i--) {
if (isspace(_line[i]))
_line[i] = 0;
else
break;
}
while (isspace(_line[read - 1])) {
_line[read - 1] = 0;
read--;
if (!read)
continue;
}
/* Drop leading spaces */
while (isspace(_line[0]))
_line++;
parse(_line);
}
free(line);
fclose(fp);
return 0;
}