00001
00017
00018
00019
00020
00021
00022
00023
00024 #include <julius.h>
00025
00026 #if defined(_WIN32) && !defined(__CYGWIN32__)
00027 #include <mbstring.h>
00028 #endif
00029
00030 #define ISTOKEN(A) (A == ' ' || A == '\t' || A == '\n')
00031
00032
00059
00060 static char *
00061 fgets_jconf(char *buf, int size, FILE *fp)
00062 {
00063 int c, prev_c;
00064 int pos;
00065
00066 if (fp == NULL) return NULL;
00067
00068 pos = 0;
00069 c = '\0';
00070 prev_c = '\0';
00071 while (1) {
00072 if (pos >= size) {
00073 pos--;
00074 break;
00075 }
00076
00077 c = fgetc(fp);
00078 if (c == EOF) {
00079 buf[pos] = '\0';
00080 if (pos <= 0) {
00081 return NULL;
00082 } else {
00083 return buf;
00084 }
00085 } else if (c == '\n' || c == '\r') {
00086 if (c == '\r' && (c = fgetc(fp)) != '\n') {
00087 ungetc(c, fp);
00088 }
00089 if (prev_c == '\\') {
00090 pos--;
00091 } else {
00092 break;
00093 }
00094 } else {
00095 buf[pos] = c;
00096 pos++;
00097
00098 #if defined(_WIN32) && !defined(__CYGWIN32__)
00099 if (c == '\\' && (_ismbblead(prev_c) && _ismbbtrail(c))) {
00100 c = '\0';
00101 }
00102 #endif
00103 }
00104 }
00105 buf[pos] = '\0';
00106
00107 return buf;
00108 }
00109
00126 void
00127 get_dirname(char *path)
00128 {
00129 char *p;
00130
00131
00132
00133
00134
00135 p = path + strlen(path) - 1;
00136 while (*p != '/'
00137 #if defined(_WIN32) && !defined(__CYGWIN32__)
00138 && *p != '\\'
00139 #endif
00140 && p != path) p--;
00141 if (p == path && *p != '/') *p = '\0';
00142 else *(p+1) = '\0';
00143 }
00144
00145
00158 void
00159 config_file_parse(char *conffile)
00160 {
00161 int c_argc;
00162 char **c_argv;
00163 FILE *fp;
00164 int maxnum, step;
00165 char buf[512], *cpy;
00166 char *p, *dst, *dst_from;
00167 char *cdir;
00168
00169 j_printerr("include config: %s\n", conffile);
00170
00171
00172
00173
00174 if ((fp = fopen(conffile, "r")) == NULL) {
00175 j_error("%s: failed to open jconf file: %s\n",EXECNAME, conffile);
00176 }
00177 step = 20;
00178 maxnum = step;
00179 c_argv = (char **)mymalloc(sizeof(char *) * maxnum);
00180 c_argv[0] = strcpy((char *)mymalloc(strlen(conffile)+1), conffile);
00181 c_argc = 1;
00182 while (fgets_jconf(buf, 512, fp) != NULL) {
00183 if (buf[0] == '\0') continue;
00184 cpy = (char *)mymalloc(strlen(buf)+1);
00185 p = buf; dst = cpy;
00186 while (1) {
00187 while (*p != '\0' && ISTOKEN(*p)) p++;
00188 if (*p == '\0') break;
00189
00190 dst_from = dst;
00191
00192 while (*p != '\0' && (!ISTOKEN(*p))) {
00193 if (0 && *p == 92) {
00194 if (*(++p) == '\0') break;
00195 *(dst++) = *(p++);
00196 } else {
00197 if (*p == 34) {
00198 p++;
00199 while (*p != '\0' && *p != 34) *(dst++) = *(p++);
00200 if (*p == '\0') break;
00201 p++;
00202 } else if (*p == 39) {
00203 p++;
00204 while (*p != '\0' && *p != 39) *(dst++) = *(p++);
00205 if (*p == '\0') break;
00206 p++;
00207 } else if (*p == 35) {
00208 *p = '\0';
00209 break;
00210 } else {
00211 *(dst++) = *(p++);
00212 }
00213 }
00214 }
00215 if (dst != dst_from) {
00216 *dst = '\0'; dst++;
00217 if (c_argc >= maxnum) {
00218 maxnum += step;
00219 c_argv = (char **)myrealloc(c_argv, sizeof(char *) * maxnum);
00220 }
00221 c_argv[c_argc++] = dst_from;
00222 }
00223 }
00224 }
00225 if (fclose(fp) == -1) {
00226 j_error("%s: jconf file cannot close\n", EXECNAME);
00227 }
00228
00229 if (debug2_flag) {
00230 int i;
00231 j_printf("\t");
00232 for (i=1;i<c_argc;i++) j_printf(" %s",c_argv[i]);
00233 j_printf("\n");
00234 }
00235
00236
00237
00238 cdir = strcpy((char *)mymalloc(strlen(conffile)+1), conffile);
00239 get_dirname(cdir);
00240 opt_parse(c_argc, c_argv, (cdir[0] == '\0') ? NULL : cdir);
00241 free(cdir);
00242 }
00243