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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* token.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 <ctype.h>
  31. #include <string.h>
  32. #include "token.h"
  33. #include "common.h"
  34. /* -------------------------------------------------------------------- */
  35. /* -------------------------------------------------------------------- */
  36. char *get_line(char *str, int n, int *line_count, FILE *fp)
  37. {
  38. char *ptr;
  39. (*line_count)++;
  40. while(fgets(str, n, fp) != NULL)
  41. {
  42. ptr = str;
  43. while(isspace(*ptr))
  44. { ptr++;
  45. }
  46. if (*ptr != '')
  47. { return str;
  48. }
  49. (*line_count)++; /* A blank line was skipped  */
  50. /* so increment the line count */
  51. }
  52. return NULL;
  53. }
  54. /* -------------------------------------------------------------------- */
  55. /* -------------------------------------------------------------------- */
  56. int escape_char_token(char *token, int maxlen, char *ptr, char **eptr)
  57. {
  58. int  type;
  59. ptr++;
  60. if (*ptr == 'a')
  61. { /* a  */
  62. type     = ALERT_TOKEN;
  63. token[0] = 'f';
  64. token[1] = '';
  65. *eptr    = ++ptr;
  66. }
  67. else
  68. if (*ptr == 'b')
  69. { /* b */
  70. type     = BACKSPACE_TOKEN;
  71. token[0] = 'b';
  72. token[1] = '';
  73. *eptr    = ++ptr;
  74. }
  75. else
  76. if (*ptr == 'f')
  77. { /* f  */
  78. type     = FORMFEED_TOKEN;
  79. token[0] = 'f';
  80. token[1] = '';
  81. *eptr    = ++ptr;
  82. }
  83. else
  84. if (*ptr == 'n')
  85. { /* n  */
  86. type     = NEWLINE_TOKEN;
  87. token[0] = 'n';
  88. token[1] = '';
  89. *eptr    = ++ptr;
  90. }
  91. else
  92. if (*ptr == 'r')
  93. { /* r  */
  94. type     = CARRIAGE_RETURN_TOKEN;
  95. token[0] = 'r';
  96. token[1] = '';
  97. *eptr    = ++ptr;
  98. }
  99. else
  100. if (*ptr == 't')
  101. { /* t  */
  102. type     = HORIZONTAL_TAB_TOKEN;
  103. token[0] = 't';
  104. token[1] = '';
  105. *eptr    = ++ptr;
  106. }
  107. else
  108. if (*ptr == 'v')
  109. { /* v  */
  110. type     = VERTICLE_TAB_TOKEN;
  111. token[0] = 'v';
  112. token[1] = '';
  113. *eptr    = ++ptr;
  114. }
  115. else
  116. if (*ptr == 'x')
  117. { /* x  */
  118. int low_nibble,
  119. high_nibble;
  120. ptr++;
  121. if (isxdigit(*ptr))
  122. {
  123. if ((*ptr >= '0') && (*ptr <= '9'))
  124. {
  125. high_nibble = (*ptr - '0') << 4;
  126. }
  127. else
  128. if ((*ptr >= 'a') && (*ptr <= 'f'))
  129. {
  130. high_nibble = (10 + (*ptr - 'a')) << 4;
  131. }
  132. else
  133. { high_nibble = (10 + (*ptr - 'A')) << 4;
  134. }
  135. ptr++;
  136. if (isxdigit(*ptr))
  137. {
  138. if ((*ptr >= '0') && (*ptr <= '9'))
  139. {
  140. low_nibble = (*ptr - '0');
  141. }
  142. else
  143. if ((*ptr >= 'a') && (*ptr <= 'f'))
  144. {
  145. low_nibble = (10 + (*ptr - 'a'));
  146. }
  147. else
  148. { low_nibble = (10 + (*ptr - 'A'));
  149. }
  150. type     = HEX_TOKEN;
  151. token[0] = high_nibble + low_nibble;
  152. token[1] = '';
  153. *eptr    = ++ptr;
  154. }
  155. else
  156. { type     = ERROR_HEX_TOKEN;
  157. ptr -= 3;
  158. token[0] = *ptr++;
  159. token[1] = *ptr++;
  160. token[2] = *ptr++;
  161. token[3] = '';
  162. *eptr    = ptr;
  163. }
  164. }
  165. else
  166. { type     = ERROR_HEX_TOKEN;
  167. ptr -= 2;
  168. token[0] = *ptr++;
  169. token[1] = *ptr++;
  170. token[2] = '';
  171. *eptr    = ptr;
  172. }
  173. }
  174. else
  175. if (*ptr == '\')
  176. { /*   */
  177. type     = BACKSLASH_TOKEN;
  178. token[0] = '\';
  179. token[1] = '';
  180. *eptr    = ++ptr;
  181. }
  182. else
  183. if (*ptr == '"')
  184. { /* Quote */
  185. type     = QUOTE_TOKEN;
  186. token[0] = '"';
  187. token[1] = '';
  188. *eptr    = ++ptr;
  189. }
  190. else
  191. if (*ptr == ''')
  192. { /* Single Quote */
  193. type     = SINGLE_QUOTE_TOKEN;
  194. token[0] = ''';
  195. token[1] = '';
  196. *eptr    = ++ptr;
  197. }
  198. else
  199. { type     = BACKSLASH_TOKEN;
  200. token[0] = '\';
  201. token[1] = '';
  202. *eptr    = ptr;
  203. }
  204. return type;
  205. }
  206. /* -------------------------------------------------------------------- */
  207. /* -------------------------------------------------------------------- */
  208. int isstring(char c)
  209. {
  210. if (isspace(c))
  211. { return FALSE;
  212. }
  213. if ((c != '"') &&
  214.     (c != ''') &&
  215.     (c != '#') &&
  216.     (c != '=') &&
  217.     (c != '') &&
  218.     (c != 'n'))
  219. { return TRUE;
  220. }
  221. return FALSE;
  222. }
  223. /* -------------------------------------------------------------------- */
  224. /* -------------------------------------------------------------------- */
  225. int get_token(char *token, int maxlen, char *ptr, char **eptr)
  226. {
  227. int type,
  228. i;
  229. while (isspace(*ptr)) /* Skip white space  */
  230. { ptr++;
  231. }
  232. if (isstring(*ptr))
  233. {
  234. type = STRING_TOKEN;
  235. for (i=0; i<(maxlen -1); i++)
  236. {
  237. if (*ptr == '')
  238. { break;
  239. }
  240. if (!isstring(*ptr))
  241. { break;
  242. }
  243. if (*ptr == '\')
  244. {
  245. char etoken[128];
  246. escape_char_token(etoken, maxlen, ptr, &ptr);
  247. token[i] = '';
  248. sms_strcat(token, etoken);
  249. continue;
  250. }
  251. token[i] = *ptr;
  252. ptr++;
  253. }
  254. token[i] = '';
  255. *eptr    = ptr;
  256. else
  257. if (*ptr == '"') /* Quoted String  */
  258. { /* All characters within */
  259. /* doublequotes  */
  260. /* If missing closing quote */
  261. /* Quoted String Error token */
  262. /* returned */
  263. char etoken[128];
  264. type = QUOTED_STRING_TOKEN;
  265. ptr++;
  266. for (i=0; i<(maxlen -1); i++)
  267. {
  268. if (*ptr == '')
  269. { break;
  270. }
  271. if (*ptr == '\')
  272. {
  273. escape_char_token(etoken, maxlen, ptr, &ptr);
  274. token[i] = '';
  275. sms_strcat(token, etoken);
  276. continue;
  277. }
  278. else
  279. if (*ptr == '"')
  280. { break;
  281. }
  282. token[i] = *ptr;
  283. ptr++;
  284. }
  285. if (*ptr != '"')
  286. { type = QUOTED_STRING_ERROR_TOKEN;
  287. }
  288. else
  289. { ptr++;
  290. }
  291. token[i] = '';
  292. *eptr    = ptr;
  293. }
  294. else
  295. if (*ptr == ''') /* Single Quoted String  */
  296. { /* All characters within */
  297. /* singlequotes  */
  298. /* If missing closing quote */
  299. /* Single Quoted String Error  */
  300. /* token returned */
  301. type = SINGLE_QUOTED_STRING_TOKEN;
  302. ptr++;
  303. for (i=0; i<(maxlen -1); i++)
  304. {
  305. if (*ptr == '')
  306. { break;
  307. }
  308. if (*ptr == ''')
  309. { break;
  310. }
  311. token[i] = *ptr;
  312. ptr++;
  313. }
  314. if (*ptr != ''')
  315. { type = SINGLE_QUOTED_STRING_ERROR_TOKEN;
  316. }
  317. else
  318. { ptr++;
  319. }
  320. token[i] = '';
  321. *eptr    = ptr;
  322. }
  323. else
  324. if (*ptr == '#') /* Comment */
  325. {
  326. type     = COMMENT_TOKEN;
  327. ptr++;
  328. i = 0;
  329. while (*ptr != '')
  330. { token[i] = *ptr++;
  331. }
  332. token[i] = *ptr;
  333. *eptr    = ptr;
  334. }
  335. else
  336. if (*ptr == '=') /* Assignment */
  337. {
  338. type     = ASSIGNMENT_TOKEN;
  339. token[0] = '=';
  340. token[1] = '';
  341. *eptr    = ++ptr;
  342. }
  343. else
  344. if ((*ptr == '') || (*ptr == 'n')) /* EOL */
  345. {
  346. type     = NULL_TOKEN;
  347. token[0] = '';
  348. *eptr    = ptr;
  349. }
  350. else
  351. { type = UNKNOWN_TOKEN;
  352. for (i=0; i<(maxlen -1); i++)
  353. {
  354. if (*ptr == '')
  355. { break;
  356. }
  357. token[i] = *ptr;
  358. ptr++;
  359. }
  360. token[i] = '';
  361. *eptr    = ptr;
  362. }
  363. return type;
  364. }