sms_resource.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:6k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* sms_resource.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <stdlib.h>
  32. #include "sms_error.h"
  33. #include "logfile.h"
  34. #include "token.h"
  35. #include "sms_resource.h"
  36. #include "common.h"
  37. /* -------------------------------------------------------------------- */
  38. /* -------------------------------------------------------------------- */
  39. static void set_defaults(char *filename, RESOURCE *resource_list);
  40. /* -------------------------------------------------------------------- */
  41. /* -------------------------------------------------------------------- */
  42. static void set_defaults(char *filename, RESOURCE *resource_list)
  43. {
  44. RESOURCE
  45. *resource;
  46. resource = resource_list;
  47. while (resource->type != RESOURCE_NULL)
  48. {
  49. if (!resource->found)
  50. {
  51. if (resource->type == RESOURCE_STRING)
  52. {
  53. if (resource->default_warning)
  54. { lprintf(LOG_WARNING, "Parsing '%s' Could not find %s, using default '%s'n", 
  55. filename, 
  56. (resource->name != NULL)?(resource->name):("NULL"), 
  57. (resource->default_str_value != NULL)?(resource->default_str_value):("NULL"));
  58. }
  59. resource->str_value = resource->default_str_value;
  60. }
  61. else if (resource->type == RESOURCE_NUMERIC)
  62. {
  63. if (resource->default_warning)
  64. { lprintf(LOG_WARNING, "Parsing '%s' Could not find %s, using default %ldn", filename, 
  65. (resource->name != NULL)?(resource->name):("NULL"),
  66. resource->default_int_value);
  67. }
  68. resource->int_value = resource->default_int_value;
  69. }
  70. }
  71. if (resource->type == RESOURCE_STRING)
  72. {
  73. if (resource->var != NULL)
  74. { *((char **)(resource->var)) = resource->str_value;
  75. }
  76. lprintf(LOG_VERBOSE, "%s %s = %sn", 
  77. filename, 
  78. (resource->name != NULL)?(resource->name):("NULL"), 
  79. (resource->str_value != NULL)?(resource->str_value):("NULL"));
  80. }
  81. else if (resource->type == RESOURCE_NUMERIC)
  82. {
  83. if (resource->var != NULL)
  84. { *((long *)(resource->var)) = resource->int_value;
  85. }
  86. lprintf(LOG_VERBOSE, "%s %s = %ldn", 
  87. filename, 
  88. (resource->name != NULL)?(resource->name):("NULL"), 
  89. resource->int_value);
  90. }
  91. resource++;
  92. }
  93. }
  94. /* -------------------------------------------------------------------- */
  95. /* -------------------------------------------------------------------- */
  96. int read_resource_file(char *filename, RESOURCE *resource_list, int warnings)
  97. {
  98. RESOURCE
  99. *resource;
  100. char  line[MAXLINELEN],
  101. token[MAXLINELEN],
  102. value_token[MAXLINELEN],
  103.   *src, 
  104. *ptr;
  105. int type,
  106. line_count;
  107. FILE  *fp;
  108. lprintf(LOG_VERBOSE, "Parsing Resource File '%s'n", filename);
  109. fp = fopen(filename, "r");
  110. if (fp == NULL)
  111. { lprintf(LOG_WARNING, "Could not open file '%s'n", filename);
  112. set_defaults(filename, resource_list);
  113. return RESOURCE_FILE_ERROR;
  114. }
  115. line_count = 0;
  116. while (get_line(line, MAXLINELEN, &line_count, fp) != NULL)
  117. {
  118. src = line;
  119. type = get_token(token, MAXLINELEN, src, &src);
  120. if (type != STRING_TOKEN)
  121. {
  122. if (type == COMMENT_TOKEN)
  123. { continue;
  124. }
  125. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' Identifier expected at line %dn", filename, line_count);
  126. continue;
  127. }
  128. resource = resource_list;
  129. while (resource->type != RESOURCE_NULL)
  130. {
  131. if (strcmp(resource->name, token) == 0)
  132. { break;
  133. }
  134. resource++;
  135. }
  136. if (resource->type == RESOURCE_NULL)
  137. { if (warnings)
  138. { lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' Unexpected identifier %s at line %dn", filename, token, line_count);
  139. }
  140. continue;
  141. }
  142. type = get_token(token, MAXLINELEN, src, &src);
  143. if (type != ASSIGNMENT_TOKEN)
  144. {
  145. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' Assignment expected at line %dn", filename, line_count);
  146. continue;
  147. }
  148. type = get_token(value_token, MAXLINELEN, src, &src);
  149. if ((type != STRING_TOKEN) &&
  150.     (type != QUOTED_STRING_TOKEN) &&
  151.     (type != SINGLE_QUOTED_STRING_TOKEN) &&
  152.     (type != NULL_TOKEN) &&
  153.     (type != COMMENT_TOKEN))
  154. {
  155. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' String expected at line %dn", filename, line_count);
  156. continue;
  157. }
  158. if (type == COMMENT_TOKEN)
  159. { sms_strcpy(token, "");
  160. }
  161. type = get_token(token, MAXLINELEN, src, &src);
  162. if ((type != NULL_TOKEN) &&
  163.     (type != COMMENT_TOKEN))
  164. {
  165. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' EOL or comment expected at line %dn", filename, line_count);
  166. continue;
  167. }
  168. if (resource->type == RESOURCE_STRING)
  169. {
  170. resource->str_value = malloc(sms_strlen(value_token) +1);
  171. if (resource->str_value == NULL)
  172. { lprintf(LOG_ERROR, "Allocating memoryn");
  173. exit(EMALLOC);
  174. }
  175. sms_strcpy(resource->str_value, value_token);
  176. resource->found = TRUE;
  177. }
  178. else if (resource->type == RESOURCE_NUMERIC)
  179. {
  180. if (value_token[0] == '')
  181. {
  182. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' Numeric Value expected at line %d assuming 0n", filename, line_count);
  183. resource->int_value = 0;
  184. }
  185. else
  186. { resource->int_value = strtol(value_token, &ptr, 10);
  187. if (ptr != &value_token[sms_strlen(value_token)])
  188. {
  189. lprintf(LOG_WARNING, "Syntax Error: Parsing '%s' Numeric Value expected at line %d assuming 0n", filename, line_count);
  190. resource->int_value = 0;
  191. }
  192. }
  193. resource->found = TRUE;
  194. }
  195. }
  196. fclose(fp);
  197. set_defaults(filename, resource_list);
  198. return RESOURCE_FILE_OK;
  199. }