get_keyword.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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