Blame view

app/app-prime-modbus/lib/common/tinifile.c 34.4 KB
8c2952457   김태훈   응용 프로그램 추가
1
2
3
  /**
      @file   tinifile.c
      @date   2009-04-09
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
4
      @author 장길석 jwjwmx@gmail.com
8c2952457   김태훈   응용 프로그램 추가
5
      @brief  Ver 0.0.6
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
6
              Delphi에서 제공하는 TIniFile을 생성한다.
8c2952457   김태훈   응용 프로그램 추가
7
      @brief  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
8
9
          -# 2012-02-07 오재경
              -# get_identify() 함수에서 index() 함수 리턴값 처리
8c2952457   김태훈   응용 프로그램 추가
10
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
11
12
13
          -# 2010-09-14 장길석
              -# 파일 없이 IniFile을 생성했을 때에도 객체가 생성되고
              -# 파일로 저장할 수 있도록 수정
8c2952457   김태훈   응용 프로그램 추가
14
      @todo
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
15
16
          -# 섹션을 삭제하는 함수를 추가
          -# 구별자 정보를 삭제하는 함수를 추가
8c2952457   김태훈   응용 프로그램 추가
17
18
19
      @bug
      @remark
      @warning
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
20
21
          - 저작권 에프에이리눅스(주)
          - 외부공개 금지
8c2952457   김태훈   응용 프로그램 추가
22
23
24
25
26
27
28
29
30
31
32
33
  */
  
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  
  #include <tlist.h>
  #include <tstrlist.h>
  #include <tinifile.h>
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
34
  /// INI에서 사용하는 버퍼 크기
8c2952457   김태훈   응용 프로그램 추가
35
  #define MAX_BUFFSIZE        1024
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
36
  /// 섹션 문자열 최대 크기
8c2952457   김태훈   응용 프로그램 추가
37
  #define MAX_SECTION         128
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
38
  /// 구분자 문자열 최대 크기
8c2952457   김태훈   응용 프로그램 추가
39
40
  #define MAX_IDENTIFY        128
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
41
42
  /// 에러 전역 코드
  int     ini_error_code;                                                 // 에러코드
8c2952457   김태훈   응용 프로그램 추가
43
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
44
  /// 섹션과 구분자를 위한 버퍼
8c2952457   김태훈   응용 프로그램 추가
45
  char buf_text[MAX_BUFFSIZE+1];
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
46
  /// 센션과 구분자에 대한 데이터를 구하기 위한 버퍼
8c2952457   김태훈   응용 프로그램 추가
47
48
49
  char buf_data[MAX_BUFFSIZE+1];
  
  static void trim( char *str)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
50
  // 설명: 인수로 받은 문자열에서 앞과 뒤의 화이트 문자를 제거한다.
8c2952457   김태훈   응용 프로그램 추가
51
52
53
54
55
56
  {
      int     sz_str;
      int     ndx;
  
      sz_str = strlen( str);
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
57
      if ( 0 >= sz_str)   return;                                         // 정상적인 문자열이 아니면 바로 복귀
8c2952457   김태훈   응용 프로그램 추가
58
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
59
      for ( ndx = sz_str -1; 0 <= ndx; ndx--)                             // 문자열 뒤의 화이트 문자를 제거, -1: NULL 위치 제거
8c2952457   김태훈   응용 프로그램 추가
60
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
61
          if ( ' ' < str[ndx])                                            // 한글이나 특수문자의 두번째 바이트일 경우를 대비하기 위해 MSB 비트를 확인한다.
8c2952457   김태훈   응용 프로그램 추가
62
63
64
65
66
67
          {
              break;
          }
          str[ndx]    = '\0';
      }
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
68
      sz_str  = strlen( str);                                             // 문자열 앞의 화이트 문자를 제거
8c2952457   김태훈   응용 프로그램 추가
69
70
      for( ndx = 0; ndx < sz_str; ndx++)
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
71
          if ( ' ' != str[ndx])                                           // 한글이 있을 경우를 생각해서 ' ' 문자를 직접 비교한다.
8c2952457   김태훈   응용 프로그램 추가
72
73
              break;
      }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
74
      memcpy( str, str+ndx, strlen( str));                                // 회이트 문자가 아닌 부분을 포인터의 시작 위치로 이동
8c2952457   김태훈   응용 프로그램 추가
75
76
77
  }
  
  static char *get_identify( char *str, char *identify)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
78
79
80
  // 설명: 인수 문자열에서 구별지 문자열을 구한다.
  // 참고: '='까지의 문자열을 구하며, 앞과 뒤의 화이트 문자를 제거한다.
  // 반환: 구별자 문자열
8c2952457   김태훈   응용 프로그램 추가
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  {
      char   *p_data;
      char   *p_branch;
      int     sz_data;
      int     pos;
  
      p_branch  = index( str, '=');
      if ( NULL == p_branch ) return NULL;
      
      pos = p_branch -str;
  
      memcpy( identify, str, pos);
      identify[pos]   = '\0';
      sz_data         = strlen( str) - pos;
      p_data          = malloc( sz_data +1);
  
      if ( NULL != p_data)
      {
          memcpy( p_data, p_branch+1, sz_data);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
100
          p_data[sz_data] = '\0';                                         // 복사 문자열 끝을 '\0'으로 마무리
8c2952457   김태훈   응용 프로그램 추가
101
102
103
104
105
106
107
108
  
          trim( identify);
          trim( p_data);
      }
      return p_data;
  }
  
  static void get_section( char *str, char *sec)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
109
110
111
  // 설명: 인수 문자열에서 섹션 문자열을 구한다.
  // 참고: '['와 ']' 사이의 문자를 구하며, 문자열 앞과 뒤의 화이트 문자는 제거한다.
  // 반환: 섹션 문자열
8c2952457   김태훈   응용 프로그램 추가
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  {
      int     ndx_str;
      int     ndx_sec;
  
      ndx_str = 0;
      while( ('\0' != str[ndx_str]) && ( ndx_str < MAX_BUFFSIZE))
      {
          if ( '[' == str[ndx_str++])
              break;
      }
  
      ndx_sec = 0;
      while( ('\0' != str[ndx_str]) && ( ndx_sec < MAX_SECTION))
      {
          if ( ']' == str[ndx_str])
          {
              sec[ndx_sec]    = '\0';
              break;
          }
          sec[ndx_sec++] = str[ndx_str++];
      }
      trim( sec);
  }
  
  static int  is_remark( char *str)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
137
138
139
  // 설명: 문자열이 주석인지의 여부를 판단한다.
  // 참고: '#' 문자 또는 ';' 문자로 문장이 시작하면 주석으로 판단
  // 반환: INI_TRUE=주석
8c2952457   김태훈   응용 프로그램 추가
140
141
142
143
144
  {
      char    ch_data;
      int     ndx;
  
      ndx = 0;
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
145
      while( ('\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE))                 // 문장의 끝 또는 버퍼의 크기 만큼 확인
8c2952457   김태훈   응용 프로그램 추가
146
147
      {
          ch_data = str[ndx++];
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
148
          if ( '#' == ch_data)                                            // 공백 이상의 문자 중 주석에 해당되는 '#' 문자를 만나면 주석으로 판단
8c2952457   김태훈   응용 프로그램 추가
149
150
151
          {
              return INI_TRUE;
          }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
152
          else if ( ';' == ch_data)                                       // 공백 이상의 문자 중 주석에 해당되는 ';' 문자를 만나면 주석으로 판단
8c2952457   김태훈   응용 프로그램 추가
153
154
155
          {
              return INI_TRUE;
          }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
156
          else if ( ' ' != str[ndx])                                      // 공백 키워드가 아닌 공백 이상의 문자를 만나면 주석 행이 아님으로 판단
8c2952457   김태훈   응용 프로그램 추가
157
158
159
160
161
162
163
164
          {
              return INI_FALSE;
          }
      }
      return INI_TRUE;
  }
  
  static int  is_identify( char *str)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
165
166
167
  // 설명: 문자열이 섹션 정보를 담고있는지의 여부를 반환
  // 참고: '=' 문자가 있으면서 유효
  // 반환: 0 = 구별자 정보가 없음, 1 = 구별자 정보가 있음
8c2952457   김태훈   응용 프로그램 추가
168
169
170
171
  {
      int     ndx;
  
      ndx = 0;
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
172
      while( ('\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE))                 // 문장의 끝 또는 버퍼의 크기 만큼 확인
8c2952457   김태훈   응용 프로그램 추가
173
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
174
          if ( ' ' < str[ndx++])                                          // 앞에 있는 공백 문자를 무시. 공백 이상의 문자가 오면
8c2952457   김태훈   응용 프로그램 추가
175
          {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
176
              while( ('\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE))         // 공백 이상에 '=' 문자가 있는지 확인
8c2952457   김태훈   응용 프로그램 추가
177
178
179
180
181
182
183
184
185
186
187
188
189
              {
                  if ( '=' == str[ndx++])
                  {
                      return 1 == 1;
                  }
              }
              return 1 == 0;
          }
      }
      return 1 == 0;
  }
  
  static int  is_section( char *str)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
190
191
192
193
  //설명: 문자열이 섹션 정보를 담고있는지의 여부를 반환
  //참고: '[' 문자가 있으면서 '[' 앞에는 빈 문자열이거나 공백 문자만 유효
  //      '[' 문자와 ']' 문자 사이에는 섹션에 대한 이름 문자열이 있어야 함
  //반환: 0 = 섹션 정보가 없음, 1 = 섹션 정보가 있음
8c2952457   김태훈   응용 프로그램 추가
194
195
196
197
198
  {
      char    ch_data;
      int     ndx;
  
      ndx = 0;
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
199
      while( ( '\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE))                // 문장의 끝 또는 버퍼의 크기 만큼 확인
8c2952457   김태훈   응용 프로그램 추가
200
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
201
202
          ch_data = str[ndx++];                                           // 확인할 문자열
          if ( '[' == ch_data)                                            // 시작 [ 문자 있음
8c2952457   김태훈   응용 프로그램 추가
203
          {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
204
              while( ('\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE))         // 문장의 끝 또는 버퍼의 크기 만큼 확인
8c2952457   김태훈   응용 프로그램 추가
205
              {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
206
                  if ( ' ' < str[ndx++])                                  // [ 문자 이후에 다른 문자가 있다면
8c2952457   김태훈   응용 프로그램 추가
207
                  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
208
                      while( ('\0' != str[ndx]) && ( ndx < MAX_BUFFSIZE)) // 문장의 끝 또는 버퍼의 크기 만큼 확인
8c2952457   김태훈   응용 프로그램 추가
209
                      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
210
                          if ( ']' == str[ndx++])                         // ] 문자가 있다면 TRUE
8c2952457   김태훈   응용 프로그램 추가
211
212
213
214
215
216
217
218
219
                          {
                              return 1;
                          }
                      }
                      return 0;
                  }
              }
              return 0;
          }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
220
          else if ( ' ' != ch_data)                                       // [ 문자 앞에 공백 문자 외에 다른 문자가 있다면 FALSE
8c2952457   김태훈   응용 프로그램 추가
221
222
223
224
225
226
227
228
          {
              break;
          }
      }
      return 0;
  }
  
  static void read_inifile_data( FILE *fp, inifile_t *inifile)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
229
230
231
232
233
  //설명: ini 파일의 내용을 읽어들여 inifile_t 객체의 내용을 완성한다.
  //인수: FILE *fp          : ini 파일에 대한 파일 포인터
  //      ifile_t *inifile  : inifile_t 객체 포인터
  //참고: 섹션에 따라 구별자 목록을 갖는 tstrlist를 생성하여
  //      섹션 리스트의 아이템에 object로 추가한다.
8c2952457   김태훈   응용 프로그램 추가
234
235
236
237
238
239
240
241
  {
      char        str_section [MAX_SECTION +1];
      char        str_identify[MAX_IDENTIFY+1];
      tstrlist   *lst_identify    = NULL;
      char       *p_data;
  
      while( NULL != fgets( buf_text, MAX_BUFFSIZE, fp))
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
242
          if      ( INI_TRUE == is_remark( buf_text) )                    // 주석 행이면 다음 행으로
8c2952457   김태훈   응용 프로그램 추가
243
244
245
              ;
          else if ( NULL != index( buf_text, '['))
          {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
246
              if ( is_section( buf_text))                                 // 파일에서 읽어들인 문자열이 섹션 정보로 유효하다면
8c2952457   김태훈   응용 프로그램 추가
247
              {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
248
                  lst_identify    = tstrlist_create();                    // 섹션에 포함된 모든 구별자 정보를 담을 수 있는 tstrlist를 생성
8c2952457   김태훈   응용 프로그램 추가
249
250
                  if ( NULL == lst_identify)
                  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
251
                      ini_error_code  = INIERR_CREATE_IDENTIFY_FAIL;      //  에러코드: 구별자 정보를 위한 메모리 할당 실패
8c2952457   김태훈   응용 프로그램 추가
252
253
254
255
256
257
258
259
260
261
262
263
264
265
                      return;
                  }
                  get_section( buf_text, str_section);
                  tstrlist_add_object( inifile->lst_sections, str_section, lst_identify);
              }
              else
                  lst_identify    = NULL;
          }
          else if (   ( NULL != lst_identify)
                  &&  is_identify( buf_text))
          {
              p_data = get_identify( buf_text, str_identify);
              if ( NULL == p_data)
              {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
266
                  ini_error_code  = INIERR_READ_IDENTIFY_FAIL;            //  에러코드: 구별자의 문자열 정보를 메모리 할당 실패
8c2952457   김태훈   응용 프로그램 추가
267
268
269
270
271
272
273
274
275
276
                  return;
              }
              tstrlist_add_object( lst_identify, str_identify, p_data);
          }
      }
  
      inifile->is_changed = 0;
  }
  
  static char *read_string( inifile_t *inifile, char *str_section, char *str_identify)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
277
278
279
280
281
282
283
  //설명: 섹션과 구별자의 문자열 데이터를 구한다.
  //인수: inifile_t *inifile  : inifile_t 객체 포인터
  //      char *str_section   : 섹션 문자열
  //      char *str_identify  : 구별자 문자열
  //반환: 섹션과 구별자의 문자열 데이터
  //주의: 섹션과 구별자가 없다면 NULL을 반환
  //      반환된 문자열 포인터로 메모리 소멸을 해서는 안 된다.
8c2952457   김태훈   응용 프로그램 추가
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
  {
      tstrlist   *lst_section;
      int         index;
  
  
      index   = tstrlist_indexof( inifile->lst_sections, str_section);
      if ( 0 > index) return NULL;
  
      lst_section = ( tstrlist *)tstrlist_get_object( inifile->lst_sections, index);
      if ( NULL == lst_section) return NULL;
  
      index   = tstrlist_indexof( lst_section, str_identify);
      if ( 0 > index) return NULL;
  
      return (char *)tstrlist_get_object( lst_section, index);
  }
  
  static int write_string( inifile_t *inifile, char *str_section, char *str_identify, char *data)
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
302
303
304
305
306
307
308
  //설명: 섹션과 구별자의 문자열 데이터를 변경 또는 추가한다.
  //인수: inifile_t *inifile      : inifile_t 객체 포인터
  //      char      *str_section  : 섹션 문자열
  //      char      *str_identify : 구별자 문자열
  //      char      *data         : 저장할 데이터
  //반환: INI_TRUE= 변경 또는 추가 성공, INI_FALSE 변경 또는 추가 실패
  //주의: 섹션과 구별자가 없다면 새로 추가한다.
8c2952457   김태훈   응용 프로그램 추가
309
310
311
312
313
  {
      tstrlist   *lst_section;
      char       *p_data;
      int         index;
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
314
      inifile->is_changed = 1;                                            // 자료 변경 이나 추가가 있음
8c2952457   김태훈   응용 프로그램 추가
315
316
  
      index   = tstrlist_indexof( inifile->lst_sections, str_section);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
317
      if ( 0 > index)                                                     // 섹션이 없다면 추가한다.
8c2952457   김태훈   응용 프로그램 추가
318
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
319
          lst_section = tstrlist_create();                                // 섹션에 포함된 모든 구별자 정보를 담을 수 있는 tstrlist를 생성
8c2952457   김태훈   응용 프로그램 추가
320
321
          if ( NULL == lst_section)
          {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
322
              ini_error_code  = INIERR_CREATE_IDENTIFY_FAIL;              //  에러코드: 구별자 정보를 위한 메모리 할당 실패
8c2952457   김태훈   응용 프로그램 추가
323
324
325
326
327
328
329
330
331
332
              return INI_FALSE;
          }
          tstrlist_add_object( inifile->lst_sections, str_section, lst_section);
      }
      else
      {
          lst_section = ( tstrlist *)tstrlist_get_object( inifile->lst_sections, index);
      }
  
      index   = tstrlist_indexof( lst_section, str_identify);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
333
      if ( 0 > index)                                                     // 구별자가 없다면 추가한다.
8c2952457   김태훈   응용 프로그램 추가
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
      {
          tstrlist_add_object( lst_section, str_identify, data);
      }
      else
      {
          p_data  = (char *)tstrlist_get_object( lst_section, index);
          free( p_data);
  
          tstrlist_put_object( lst_section, index, data);
      }
      return INI_TRUE;
  }
  
  char  *ini_error_string( void)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
349
350
351
      @brief  ini_error_code에 대한 에러 설명 문자열을 반환
      @return 에러 코드에 대한 에러 설명 문자열 포인터
      @warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
8c2952457   김태훈   응용 프로그램 추가
352
353
  */
  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
354
355
356
357
358
359
360
361
362
     char *error_string[] ={ "에러 없음",                                 //  INIERR_NONE
                             "메모리 부족",                               //  INIERR_OUT_OF_MEMORY
                             "파일 이름 지정 오류",                       //  INIERR_FILENAME_FAIL
                             "자료 없음",                                 //  INIERR_NO_DATA
                             "IniFile 없음",                              //  INIERR_NO_FILE
                             "IniFile을 읽을 수 없음",                    //  INIERR_ACCESS_FAIL
                             "섹션 리스트 생성 실패",                     //  INIERR_CREATE_SECTION_FAIL
                             "구별자 생성 실패",                          //  INIERR_CREATE_IDENTIFY_FAIL
                             "인수의 객체가 NULL"                         //  INIERR_NULL_POINTER
8c2952457   김태훈   응용 프로그램 추가
363
364
365
366
367
368
                          };
     return( error_string[ini_error_code]);
  }
  
  int ini_print_error( char *remark)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
369
370
371
      @brief  ini_error_code에 대한 에러 설명 문자열을 화면에 출력
      @param  remark : 에러 설명 문자열 끝에 첨부하여 출력할 문자열
      @return 에러 코드
8c2952457   김태훈   응용 프로그램 추가
372
373
374
375
376
377
378
379
380
  */
  {
     printf( "[ini error:%d]%s %s
  ", ini_error_code, ini_error_string(), remark);
     return ini_error_code;
  }
  
  int ini_write_bool( inifile_t *inifile, char *str_section, char *str_identify, int value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
381
382
383
384
385
      @brief  섹션과 구별자가 지정하는 데이터의 값을 변경한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  value : boolean 값
8c2952457   김태훈   응용 프로그램 추가
386
387
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
388
389
390
          INI_TRUE  - 변경 또는 추가 성공
  
          INI_FALSE - 변경 또는 추가 실패
8c2952457   김태훈   응용 프로그램 추가
391
392
393
394
395
396
397
398
399
400
401
402
403
  */
  {
      char    *data;
  
      data        = malloc( 2);
      if ( value) sprintf( data, "1");
      else        sprintf( data, "0");
  
      return write_string( inifile, str_section, str_identify, data);
  }
  
  int ini_write_real( inifile_t *inifile, char *str_section, char *str_identify, double value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
404
405
406
407
408
      @brief  섹션과 구별자가 지정하는 실수 데이터를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  value : 실수 값
8c2952457   김태훈   응용 프로그램 추가
409
      @return
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
410
411
          - INI_TRUE  - 변경 또는 추가 성공
          - INI_FALSE - 변경 또는 추가 실패
8c2952457   김태훈   응용 프로그램 추가
412
413
414
415
416
417
418
419
420
421
422
423
  */
  {
      char    *data;
  
      data        = malloc( 30);
      sprintf( data, "%lf", value);
      trim( data);
      return write_string( inifile, str_section, str_identify, data);
  }
  
  int ini_write_integer( inifile_t *inifile, char *str_section, char *str_identify, int value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
424
425
426
427
428
429
430
      @brief  섹션과 구별자가 지정하는 정수 데이터를 지정한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
  
      @param  str_identify : 구별자 문자열
  
      @param  value : 정수 데이터
8c2952457   김태훈   응용 프로그램 추가
431
      @return
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
432
433
          - INI_TRUE  - 변경 또는 추가 성공
          - INI_FALSE - 변경 또는 추가 실패
8c2952457   김태훈   응용 프로그램 추가
434
435
436
437
438
439
440
441
442
443
444
445
446
  */
  {
      char    *data;
  
      data        = malloc( 20);
      sprintf( data, "%d", value);
      trim( data);
  
      return write_string( inifile, str_section, str_identify, data);
  }
  
  int ini_write_string( inifile_t *inifile, char *str_section, char *str_identify, char *value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
447
448
449
450
451
452
453
      @brief  섹션과 구별자의 문자열을 변경
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
  
      @param  str_identify : 구별자 문자열
  
      @param  value : 문자열 데이터
8c2952457   김태훈   응용 프로그램 추가
454
      @return
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
455
456
          - INI_TRUE  - 변경 또는 추가 성공
          - INI_FALSE - 변경 또는 추가 실패
8c2952457   김태훈   응용 프로그램 추가
457
458
459
460
461
462
463
464
465
466
467
468
  */
  {
      char    *data;
  
      data        = malloc( strlen( value)+1);
      memcpy( data, value, strlen( value));
      data[strlen(value)]    = '\0';
      return write_string( inifile, str_section, str_identify, data);
  }
  
  int ini_write_char( inifile_t *inifile, char *str_section, char *str_identify, char value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
469
470
471
472
473
474
475
      @brief  섹션과 구별자의 문자를 변경
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
  
      @param  str_identify : 구별자 문자열
  
      @param  value : 문자
8c2952457   김태훈   응용 프로그램 추가
476
      @return
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
477
478
          - INI_TRUE  - 변경 또는 추가 성공
          - INI_FALSE - 변경 또는 추가 실패
8c2952457   김태훈   응용 프로그램 추가
479
480
481
482
483
484
485
486
487
488
  */
  {
      char  str[16];
  
      sprintf( str, "%c", value );
      return ini_write_string( inifile, str_section, str_identify, str );
  }
  
  int ini_read_bool( inifile_t *inifile, char *str_section, char *str_identify, int default_value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
489
490
491
492
493
494
495
496
497
498
499
500
501
502
      @brief  섹션과 구별자가 지정하는 Boolean 데이터를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
  
      @param  str_identify : 구별자 문자열
  
      @param  default_value : 값이 없다면 대신 반환될 기본값
      @warning    ini 파일에 저장한 문자열이 0 이면 FALSE로 반환하며
  
                  이외는 무조건 TRUE로 반환한다.
  
                  즉, 섹션과 구별자가 가지고 있는 문자열 정보가
  
                  '0' 인지 아닌지의 여부를 반환한다.
8c2952457   김태훈   응용 프로그램 추가
503
504
505
506
507
  */
  {
      char   *data;
      int     int_data;
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
508
509
510
511
512
      data    = read_string( inifile, str_section, str_identify);                         // 먼저 문자열로 데이터를 읽어 들인다.
      if      ( NULL == data)                             return default_value;           // 찾는 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == strlen( data) )                      return default_value;           // 문자열 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == sscanf( data, "%d", &int_data))      return default_value;           // 정수로 변환된 값이 없다면 기본값을 반환
      else                                                return 0 != int_data;           // 정수 값이 0이면 FALSE로 반환한다.
8c2952457   김태훈   응용 프로그램 추가
513
514
515
516
  }
  
  double ini_read_real( inifile_t *inifile, char *str_section, char *str_identify, double default_value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
517
518
519
520
521
      @brief  섹션과 구별자가 지정하는 실수 데이터를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section  : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  default_value: 값이 없다면 대신 반환될 기본값
8c2952457   김태훈   응용 프로그램 추가
522
523
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
524
525
526
          섹션과 구별자에 해당하는 실수 값
  
          저정한 섹션이나 구별자에 대한 실수 값이 없다면 기본값을 반환
8c2952457   김태훈   응용 프로그램 추가
527
528
529
530
531
532
  */
  {
      char       *data;
      double      float_data;
  
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
533
534
535
536
537
      data    = read_string( inifile, str_section, str_identify);                         // 먼저 문자열로 데이터를 읽어 들인다.
      if      ( NULL == data)                             return default_value;           // 찾는 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == strlen( data) )                      return default_value;           // 문자열 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == sscanf( data, "%lf", &float_data))   return default_value;           // 실수로 변환된 값이 없다면 기본값을 반환
      else                                                return float_data;              // 실수 값을 반환한다.
8c2952457   김태훈   응용 프로그램 추가
538
539
540
541
  }
  
  int ini_read_integer( inifile_t *inifile, char *str_section, char *str_identify, int default_value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
542
543
544
545
546
      @brief  섹션과 구별자가 지정하는 정수 데이터를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  default_value : 값이 없다면 대신 반환될 기본값
8c2952457   김태훈   응용 프로그램 추가
547
548
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
549
550
551
          섹션과 구별자에 해당하는 정수 값
  
          저정한 섹션이나 구별자에 대한 정수 값이 없다면 기본값을 반환
8c2952457   김태훈   응용 프로그램 추가
552
553
554
555
556
  */
  {
      char   *data;
      int     int_data;
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
557
      data    = read_string( inifile, str_section, str_identify);                         // 먼저 문자열로 데이터를 읽어 들인다.
8c2952457   김태훈   응용 프로그램 추가
558
      
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
559
560
561
562
      if      ( NULL == data)                             return default_value;           // 찾아진 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == strlen( data) )                      return default_value;           // 문자열 데이터가 없다면 기본값을 반환한다.
      else if ( 0 == sscanf( data, "%d", &int_data))      return default_value;           // 정수로 변환된 값이 없다면 기본값을 반환
      else                                                return int_data;                // 정수값을 반환한다.
8c2952457   김태훈   응용 프로그램 추가
563
564
565
566
  }
  
  char *ini_read_string( inifile_t *inifile, char *str_section, char *str_identify, char *default_value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
567
568
569
570
571
      @brief  섹션과 구별자가 지정하는 문자열 데이터를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  default_value : 값이 없다면 대신 반환될 기본값
8c2952457   김태훈   응용 프로그램 추가
572
573
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
574
575
576
577
          섹션과 구별자의 문자열 정보
  
          저정한 섹션이나 구별자에 대한 문자열이 없다면 기본값을 반환
      @warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
8c2952457   김태훈   응용 프로그램 추가
578
579
580
581
582
583
  */
  {
      char    *data;
  
      data    = read_string( inifile, str_section, str_identify);
      if ( NULL == data)                                  return default_value;
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
584
      else if ( 0 == strlen( data) )                      return default_value;           // 문자열 데이터가 없다면 기본값을 반환한다.
8c2952457   김태훈   응용 프로그램 추가
585
586
587
588
589
      else                                                return data;
  }
  
  char         ini_read_char( inifile_t *inifile, char *str_section, char *str_identify, char default_value)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
590
591
592
593
594
      @brief  섹션과 구별자가 지정하는 케릭터 데이타를 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
      @param  str_identify : 구별자 문자열
      @param  default_value : 값이 없다면 대신 반환될 기본값
8c2952457   김태훈   응용 프로그램 추가
595
596
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
597
598
599
600
          섹션과 구별자의 문자열 정보
  
          저정한 섹션이나 구별자에 대한 문자열이 없다면 기본값을 반환
      @warning 절대 반환 받은 문자열을 소멸 시켜서는 안 된다!!
8c2952457   김태훈   응용 프로그램 추가
601
602
603
604
605
606
607
608
609
610
611
  */
  {
  	char *cc;
  
  	cc = ini_read_string( inifile, str_section, str_identify, NULL );
  	if ( cc ) return cc[0];
  	else      return default_value;
  }
  
  tstrlist *ini_read_section( inifile_t *inifile, char *str_section)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
612
613
614
      @brief  섹션이 가지고 있는 모든 구별자 문자열의 정보를 tstrlist 형식으로 구한다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 섹션 문자열
8c2952457   김태훈   응용 프로그램 추가
615
616
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
617
618
619
620
          섹션이 가지고 있는 모든 구별자 문자열을 가지고 있는 tstrlist 객체
  
          저정한 섹션이 없다면 NULL을 반환
      @warning 절대 반환 받은 객체를 소멸 시켜서는 안 된다!!
8c2952457   김태훈   응용 프로그램 추가
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
  */
  {
      tstrlist   *lst_section;
      int         index;
  
      if ( NULL == inifile)   return  NULL;
      index   = tstrlist_indexof( inifile->lst_sections, str_section);
  
      if ( 0 > index)         return  NULL;
      lst_section = ( tstrlist *)tstrlist_get_object( inifile->lst_sections, index);
  
      return lst_section;
  }
  
  tstrlist *ini_read_sections( inifile_t *inifile)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
637
638
639
640
      @brief  inifile_t 객체가 가지고 있는 모든 섹션 정보를 tstrlist 형식으로 구한다.
      @param  inifile : inifile_t 객체 포인터
      @return 모든 섹션 문자열을 가지고 있는 tstrlist 객체
      @warning 절대 반환 받은 객체를 소멸 시켜서는 안 된다!!
8c2952457   김태훈   응용 프로그램 추가
641
642
643
644
645
646
647
648
649
650
651
652
  */
  {
      if ( NULL == inifile)
      {
          return  NULL;
      }
      return inifile->lst_sections;
  }
  
  int ini_save_to_file( inifile_t *inifile, char *filename){
  
      /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
653
654
655
          @brief  inifile_t 객체 내용이 변경되어 있다면 파일로 저장한다.
          @param  inifile : inifile_t 객체 포인터
          @return  INI_TRUE - 작업 중 오류 없음
8c2952457   김태훈   응용 프로그램 추가
656
      */
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
657
658
659
660
661
662
663
664
665
666
      FILE       *fp_inifile;             // ini 파일 객체
      tstrlist   *lst_sections;           // inifile_t가 가지고 있는 모든 섹션 리스트
      tstrlist   *lst_identifies;         // 섹션이 가지고 있는 구별자 리스트
      char       *str_section;            // 섹션 문자열
      char       *str_identify;           // 구별자 문자열
      char       *str_data;               // 섹션과 구별자의 문자열 데이터
      int         ndx_sec;                // 모든 섹션을 처리하기 위한 루프 인데스
      int         ndx_idn;                // 모든 구별자를 처리하기 위한 루프 인덱스
  
      if ( NULL == inifile)                                               // ini 파일 개체가 없음
8c2952457   김태훈   응용 프로그램 추가
667
668
669
670
671
672
673
674
675
      {
          ini_error_code  = INIERR_NULL_POINTER;
          return INI_FALSE;
      }
      if ( NULL == inifile->lst_sections)
      {
          ini_error_code  = INIERR_NULL_POINTER;
          return INI_FALSE;
      }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
676
677
      fp_inifile = fopen( filename, "w");                    //  ini 파일을 쓰기 전용으로 열기
      if ( NULL == fp_inifile)                                        //  파일 열기 실패
8c2952457   김태훈   응용 프로그램 추가
678
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
679
          ini_error_code  = INIERR_ACCESS_FAIL;                       //  에러코드: 파일 열기 실패 지정
8c2952457   김태훈   응용 프로그램 추가
680
681
          return INI_FALSE;
      }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
682
683
      lst_sections = ini_read_sections( inifile);                     // ini 객체에서 모든 섹션 리스트를 구한다.
      for( ndx_sec = 0; ndx_sec < tstrlist_getcount( lst_sections); ndx_sec++)// 모든 섹션에 대해서
8c2952457   김태훈   응용 프로그램 추가
684
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
685
686
687
          str_section     = tstrlist_get_string( lst_sections, ndx_sec);      // 섹션 문자열을 구한다.
          fprintf( fp_inifile, "[%s]
  ", str_section);                // 파일에 섹션 문자열을 쓰기
8c2952457   김태훈   응용 프로그램 추가
688
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
689
          lst_identifies  = ini_read_section( inifile, str_section);  // 섹션의 모든 구별자 리스트를 구한다.
8c2952457   김태훈   응용 프로그램 추가
690
691
692
693
          for( ndx_idn = 0; ndx_idn < tstrlist_getcount( lst_identifies); ndx_idn++)
          {
              str_identify    = tstrlist_get_string( lst_identifies, ndx_idn);
              str_data        = ini_read_string( inifile, str_section, str_identify, "");
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
694
695
              fprintf( fp_inifile, "%s=%s
  ", str_identify, str_data);         // 구별자와 데이터를 쓰기
8c2952457   김태훈   응용 프로그램 추가
696
697
698
699
700
701
702
703
704
705
          }
      }
      fclose( fp_inifile);
      sync();
  
      return INI_TRUE;
  }
  
  int ini_flush( inifile_t *inifile)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
706
707
708
      @brief  inifile_t 객체 내용이 변경되어 있다면 파일로 저장한다.
      @param  inifile : inifile_t 객체 포인터
      @return  INI_TRUE - 작업 중 오류 없음
8c2952457   김태훈   응용 프로그램 추가
709
710
711
712
  */
  {
      int     rst = INIERR_NONE;
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
713
      if ( INI_TRUE == inifile->is_changed){                              // 데이터가 변경되었거나 추가되었음
8c2952457   김태훈   응용 프로그램 추가
714
715
716
717
718
719
720
721
          inifile->is_changed = INI_FALSE;
          rst = ini_save_to_file( inifile, inifile->filename);
      }
      return rst;
  }
  
  void ini_remove_section( inifile_t *inifile, char *str_section)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
722
723
724
725
      @brief  지정된 섹션을 제거합니다.
      @param  inifile : inifile_t 객체 포인터
      @param  str_section : 삭제할 섹션
      @warning 변경이나 추가된 자료를 위해 ini_flush()를 호출한다.
8c2952457   김태훈   응용 프로그램 추가
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
  */
  {
      tstrlist   *psection;
      char       *pdata;
      int         index;
      int         ndx_idn;
  
      if ( NULL != inifile)
      {
          if ( NULL != inifile->lst_sections)
          {
              index   = tstrlist_indexof( inifile->lst_sections, str_section);
              if ( 0 <= index)
              {
                  psection = ( tstrlist *)tstrlist_get_object( inifile->lst_sections, index);
                  for ( ndx_idn = 0; ndx_idn < tstrlist_getcount( psection); ndx_idn++)
                  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
743
                      pdata   = ( char *)tstrlist_get_object( psection, ndx_idn);         // identify에 지정된 데이터 문자열 메모리를 제거
8c2952457   김태훈   응용 프로그램 추가
744
745
746
747
748
                      free( pdata);
                  }
                  tstrlist_free( psection);
                  tstrlist_delete( inifile->lst_sections, index);
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
749
  		        inifile->is_changed = INI_TRUE;	// [KTG] section 삭제에 대해서도 파일에 반영되도록 하기 위함.
8c2952457   김태훈   응용 프로그램 추가
750
751
752
753
754
755
756
              }
          }
      }
  }
  
  void ini_free( inifile_t *inifile)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
757
758
759
      @brief  inifile_t 객체를 소멸
      @param  inifile : inifile_t 객체 포인터
      @warning 변경이나 추가된 자료를 위해 ini_flush()를 호출한다.
8c2952457   김태훈   응용 프로그램 추가
760
761
762
763
764
765
766
767
768
  */
  {
      tstrlist   *psection;
      char       *pdata;
      int         ndx_sec;
      int         ndx_idn;
  
      if ( NULL != inifile)
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
769
770
          ini_flush( inifile);                                            // 변경된 내용이 있다면 파일로 저장
          if ( NULL != inifile->filename) free( inifile->filename);       // 파일 이름의 메모리 소멸
8c2952457   김태훈   응용 프로그램 추가
771
772
773
774
775
776
777
          if ( NULL != inifile->lst_sections)
          {
              for ( ndx_sec = 0; ndx_sec < tstrlist_getcount( inifile->lst_sections); ndx_sec++)
              {
                  psection    = tstrlist_get_object( inifile->lst_sections, ndx_sec);
                  for ( ndx_idn = 0; ndx_idn < tstrlist_getcount( psection); ndx_idn++)
                  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
778
                      pdata   = ( char *)tstrlist_get_object( psection, ndx_idn);         // identify에 지정된 데이터 문자열 메모리를 제거
8c2952457   김태훈   응용 프로그램 추가
779
780
781
782
783
784
785
786
787
788
789
790
                      free( pdata);
                  }
                  tstrlist_free( psection);
              }
              tstrlist_free( inifile->lst_sections);
          }
          free( inifile);
      }
  }
  
  inifile_t *ini_create( char *filename)
  /**
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
791
792
793
794
795
796
      @brief  filename의 내용을 섹션과 구별자로 구분하여 읽어 들인다.
  
      file에서 자료를 읽어 들인 후에는 데이터가 변경되어 저장이 필요하기 전까지는 
  
      다시 파일을 억세스할 필요가 없다.
      @param  filename : ini 파일의 이름
8c2952457   김태훈   응용 프로그램 추가
797
798
      @return
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
799
800
          ini 파일의 모든 내용을 담은 inifile_t 객체 포인터
          읽기에 실패했다면 NULL을 반환
8c2952457   김태훈   응용 프로그램 추가
801
802
  */
  {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
803
804
805
      inifile_t  *inifile;                // ini 파일 객체
      FILE       *fp_inifile;             // ini 파일을 읽기 위한 파일 포인터
      int         sz_filename;            // ini 파일의 전체 이름 크기
8c2952457   김태훈   응용 프로그램 추가
806
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
807
      if ( 0 != access( filename, F_OK | R_OK))                           //  IniFile 존재 확인 및 읽기가 가능한지 확인
8c2952457   김태훈   응용 프로그램 추가
808
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
809
810
          fp_inifile = fopen( filename, "w");                             //  파일이 없다면 파일 생성이 가능한지를 확인한다.
          if ( NULL == fp_inifile)                                        //  파일 생성에 실패했다면 에러코드 반환
8c2952457   김태훈   응용 프로그램 추가
811
          {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
812
              ini_error_code  = INIERR_ACCESS_FAIL;                       //  에러코드: 파일 열기 실패 지정
8c2952457   김태훈   응용 프로그램 추가
813
814
815
816
817
              return  NULL;
          }
          fclose( fp_inifile);
      }
      
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
818
819
      inifile = malloc( sizeof( inifile_t));                              //  ini 파일 객체 생성
      if ( NULL == inifile)                                               //  객체를 위한 메모리 할당에 실패하면
8c2952457   김태훈   응용 프로그램 추가
820
      {
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
821
          ini_error_code  = INIERR_OUT_OF_MEMORY;                         //  에러코드 지정
8c2952457   김태훈   응용 프로그램 추가
822
823
          return  NULL;
      }
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
824
      inifile->filename       = NULL;                                     //  기본값 지정: 파일 이름 지정이 아직 안 되어 있음
8c2952457   김태훈   응용 프로그램 추가
825
      inifile->lst_sections   = NULL;                                     //  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
826
      inifile->is_changed     = INI_FALSE;                                //  기본값 지정: 변경된 내용이 없음
8c2952457   김태훈   응용 프로그램 추가
827
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
828
      sz_filename             = strlen( filename);                        //  파일 이름을 객체 정보에 저장한다.
8c2952457   김태훈   응용 프로그램 추가
829
830
831
832
833
834
835
      if ( 0 == sz_filename)
      {
          ini_free( inifile);
          ini_error_code  = INIERR_FILENAME_FAIL;
          return  NULL;
      }
      inifile->filename = malloc( sz_filename+1);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
836
      if ( NULL == inifile->filename)                                     //  메모리 할당에 실패했다면 에러 처리한다.
8c2952457   김태훈   응용 프로그램 추가
837
838
839
840
841
842
      {
          ini_free( inifile);
          ini_error_code  = INIERR_OUT_OF_MEMORY;
          return  NULL;
      }
      memcpy( inifile->filename, filename, sz_filename+1);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
843
844
      inifile->lst_sections = tstrlist_create();                          //  루트 섹션을 생성
      if ( NULL == inifile->lst_sections)                                 //  루트 섹션을 위한 스트링 리스트를 생성하지 못했다면
8c2952457   김태훈   응용 프로그램 추가
845
846
      {
          ini_free( inifile);
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
847
          ini_error_code  = INIERR_CREATE_SECTION_FAIL;                   //  에러코드: 루트 섹션 리스트 생성
8c2952457   김태훈   응용 프로그램 추가
848
849
850
          return  NULL;
      }
  
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
851
852
      fp_inifile = fopen( filename, "r");                                 //  IniFile의 파일을 열기를 함
      if ( NULL == fp_inifile)                                            //  파일 열기 실패
8c2952457   김태훈   응용 프로그램 추가
853
854
      {                                                                   
          ini_free( inifile);                                             
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
855
          ini_error_code  = INIERR_ACCESS_FAIL;                           //  에러코드: 파일 열기 실패 지정
8c2952457   김태훈   응용 프로그램 추가
856
857
          return  NULL;                                                   
      }                                                                   
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
858
      read_inifile_data( fp_inifile, inifile);                            // IniFile 내용을 모두 읽어 들임
8c2952457   김태훈   응용 프로그램 추가
859
860
861
862
863
      fclose( fp_inifile);
      
      return inifile;
  }