get_keyword.c

00001 /*
00002   キーワードをファイルから取り出す
00003   Satofumi KAMIMURA
00004   $Id$
00005 
00006   クラスの private として宣言する場合、
00007   このソースを取り込むクラス宣言の前に、以下の宣言が必要となる
00008   
00009   #include <string.h>
00010   #include <stdlib.h>
00011   #include <ctype.h>
00012 
00013   \todo Cでコンパイルできるようにする
00014 */
00015 
00016 #ifndef __cplusplus
00017 #include "get_keyword.h"
00018 #endif
00019 
00020 int skipSpace(FILE *fd) {
00021   while (!feof(fd)) {
00022     int ch = fgetc(fd);
00023     if ((ch == '\r') || (ch == '\n')) {
00024       ungetc(ch, fd);
00025       return -1;
00026     }
00027     if (!isspace(ch)) {
00028       ungetc(ch, fd);
00029       return 0;
00030     }
00031   }
00032   return -1;
00033 }
00034 
00035 
00036 void skipToLF(FILE *fd) {
00037   while (!feof(fd)) {
00038     int ch = fgetc(fd);
00039     if ((ch == '\r') || (ch == '\n')) {
00040       return;
00041     }
00042   }
00043 }
00044 
00045 
00046 char *getString(FILE *fd) {
00047   enum { BUFFER_MAX = 255 };
00048   char buffer[BUFFER_MAX+1];
00049   int index = 0;
00050 
00051   while (!feof(fd)) {
00052     int ch = fgetc(fd);
00053     if (isgraph(ch) && (ch != '=')) {
00054       if (index < BUFFER_MAX) {
00055         buffer[index++] = ch;
00056       }
00057     } else {
00058       char *ret_str;
00059       ungetc(ch, fd);
00060       ret_str = (char *)malloc(index +1);
00061       strncpy(ret_str, buffer, index);
00062       ret_str[index] = '\0';
00063       return ret_str;
00064     }
00065   }
00066   return NULL;
00067 }
00068 
00069 
00070 char *get_keyword(const char *file, const char *key) {
00071 
00072   FILE *fd = fopen(file, "r");
00073   if (!fd) {
00074     return NULL;
00075   }
00076 
00077   while (!feof(fd)) {
00078     while (1) {
00079       char *keyword;
00080       char *value;
00081 
00082       if (skipSpace(fd) < 0) {          // 空白を読み飛ばす
00083         break;
00084       }
00085 
00086       // キーワードを取り出す
00087       keyword = getString(fd);
00088       if ((!keyword) || (keyword[0] == '#') || (strcmp(key, keyword))) {
00089         free(keyword);
00090         break;
00091       }
00092       free(keyword);
00093       if (skipSpace(fd) < 0) {          // 空白を読み飛ばす
00094         skipToLF(fd);
00095         value = (char *)malloc(sizeof(char));
00096         value[0] = '\0';
00097         return value;
00098       }
00099 
00100       // '=' を検出
00101       if (fgetc(fd) != '=') {
00102         break;
00103       }
00104       if (skipSpace(fd) < 0) {          // 空白を読み飛ばす
00105         break;
00106       }
00107 
00108       // キーワードを取り出す
00109       value = getString(fd);
00110       if (!value) {
00111         break;
00112       }
00113       return value;
00114     }
00115     skipToLF(fd);
00116   }
00117   return NULL;
00118 }
00119 

Generated on Mon Apr 13 22:52:05 2009 by  doxygen 1.5.7.1