00001
00002
00003
00004
00005
00011 #if HAVE_CONFIG_H
00012 #include <config.h>
00013 #endif
00014
00015 #include <stdio.h>
00016 #include <ctype.h>
00017
00018 #include <yaz/log.h>
00019 #include <yaz/readconf.h>
00020
00021 #define l_isspace(c) ((c) == '\t' || (c) == ' ' || (c) == '\n' || (c) == '\r')
00022
00023 int readconf_line(FILE *f, int *lineno, char *line, int len,
00024 char *argv[], int num)
00025 {
00026 char *p;
00027 int argc;
00028
00029 while ((p = fgets(line, len, f)))
00030 {
00031 (*lineno)++;
00032 while (*p && l_isspace(*p))
00033 p++;
00034 if (*p && *p != '#')
00035 break;
00036 }
00037 if (!p)
00038 return 0;
00039
00040 for (argc = 0; *p ; argc++)
00041 {
00042 if (*p == '#')
00043 break;
00044 argv[argc] = p;
00045 while (*p && !l_isspace(*p))
00046 p++;
00047 if (*p)
00048 {
00049 *(p++) = '\0';
00050 while (*p && l_isspace(*p))
00051 p++;
00052 }
00053 }
00054 return argc;
00055 }
00056
00057
00058
00059
00060 int readconf(char *name, void *rprivate,
00061 int (*fun)(char *name, void *rprivate, int argc, char *argv[]))
00062 {
00063 FILE *f;
00064 char line[512], *m_argv[50];
00065 int m_argc;
00066 int lineno = 0;
00067
00068 if (!(f = fopen(name, "r")))
00069 {
00070 yaz_log(YLOG_WARN|YLOG_ERRNO, "readconf: %s", name);
00071 return -1;
00072 }
00073 for (;;)
00074 {
00075 int res;
00076
00077 if (!(m_argc = readconf_line(f, &lineno, line, 512, m_argv, 50)))
00078 {
00079 fclose(f);
00080 return 0;
00081 }
00082
00083 if ((res = (*fun)(name, rprivate, m_argc, m_argv)))
00084 {
00085 fclose(f);
00086 return res;
00087 }
00088 }
00089 }
00090
00091
00092
00093
00094
00095
00096
00097