parlib: Add option file parsing helper
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 9 Jan 2017 20:17:03 +0000 (15:17 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:40 +0000 (19:01 -0500)
This does the line-by-line work for reading a file: stripping the spaces
and comments.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/opts.h [new file with mode: 0644]
user/parlib/opts.c [new file with mode: 0644]

diff --git a/user/parlib/include/parlib/opts.h b/user/parlib/include/parlib/opts.h
new file mode 100644 (file)
index 0000000..a4038c8
--- /dev/null
@@ -0,0 +1,12 @@
+/* Copyright (c) 2016 Google Inc
+ * Barret Rhoden <brho@cs.berkeley.edu>
+ * See LICENSE for details.
+ *
+ * Various option parsing utility functions. */
+
+#pragma once
+
+/* 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 *));
diff --git a/user/parlib/opts.c b/user/parlib/opts.c
new file mode 100644 (file)
index 0000000..2c97a17
--- /dev/null
@@ -0,0 +1,63 @@
+/* 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;
+}