+static int parse_cmd_doc(const char **arg, ODR out, char **buf,
+ int *len, int opt)
+{
+ const char *sep;
+ while (**arg && strchr(" \t\n\r\f", **arg))
+ (*arg)++;
+ if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
+ {
+ (*arg)++;
+ *len = sep - *arg;
+ *buf = odr_strdupn(out, *arg, *len);
+ (*arg) = sep+1;
+ return 1;
+ }
+ else if ((*arg)[0] && (*arg)[0] != '\"')
+ {
+ long fsize;
+ FILE *inf;
+ const char *fname = *arg;
+
+ while (**arg != '\0' && **arg != ' ')
+ (*arg)++;
+
+ inf = fopen(fname, "rb");
+ if (!inf)
+ {
+ printf("Couldn't open %s\n", fname);
+ return 0;
+ }
+ if (fseek(inf, 0L, SEEK_END) == -1)
+ {
+ printf("Couldn't seek in %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ fsize = ftell(inf);
+ if (fseek(inf, 0L, SEEK_SET) == -1)
+ {
+ printf("Couldn't seek in %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ *len = fsize;
+ *buf = odr_malloc(out, fsize);
+ if (fread(*buf, 1, fsize, inf) != fsize)
+ {
+ printf("Unable to read %s\n", fname);
+ fclose(inf);
+ return 0;
+ }
+ fclose(inf);
+ return 1;
+ }
+ else if (**arg == '\0')
+ {
+ if (opt)
+ {
+ *len = 0;
+ *buf = 0;
+ return 1;
+ }
+ printf("Missing doc argument\n");
+ }
+ else
+ printf("Bad doc argument %s\n", *arg);
+ return 0;
+}
+