scansup.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * scansup.c
  4.  *   support routines for the lex/flex scanner, used by both the normal
  5.  * backend as well as the bootstrap backend
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  *
  10.  * IDENTIFICATION
  11.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/parser/scansup.c,v 1.13 1999/05/25 16:10:25 momjian Exp $
  12.  *
  13.  *-------------------------------------------------------------------------
  14.  */
  15. #include "config.h"
  16. #include <ctype.h>
  17. #include <string.h>
  18. #include "postgres.h"
  19. #include "miscadmin.h"
  20. #include "parser/scansup.h"
  21. #include "utils/elog.h"
  22. /* ----------------
  23.  * scanstr
  24.  *
  25.  * if the string passed in has escaped codes, map the escape codes to actual
  26.  * chars
  27.  *
  28.  * the string returned is a pointer to static storage and should NOT
  29.  * be freed by the caller.
  30.  * ----------------
  31.  */
  32. char *
  33. scanstr(char *s)
  34. {
  35. static char newStr[MAX_PARSE_BUFFER];
  36. int len,
  37. i,
  38. j;
  39. if (s == NULL || s[0] == '')
  40. return s;
  41. len = strlen(s);
  42. for (i = 0, j = 0; i < len; i++)
  43. {
  44. if (s[i] == ''')
  45. {
  46. /*
  47.  * Note: if scanner is working right, unescaped quotes can
  48.  * only appear in pairs, so there should be another character.
  49.  */
  50. i++;
  51. newStr[j] = s[i];
  52. }
  53. else if (s[i] == '\')
  54. {
  55. i++;
  56. switch (s[i])
  57. {
  58. case 'b':
  59. newStr[j] = 'b';
  60. break;
  61. case 'f':
  62. newStr[j] = 'f';
  63. break;
  64. case 'n':
  65. newStr[j] = 'n';
  66. break;
  67. case 'r':
  68. newStr[j] = 'r';
  69. break;
  70. case 't':
  71. newStr[j] = 't';
  72. break;
  73. case '0':
  74. case '1':
  75. case '2':
  76. case '3':
  77. case '4':
  78. case '5':
  79. case '6':
  80. case '7':
  81. {
  82. int k;
  83. long octVal = 0;
  84. for (k = 0;
  85.  s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
  86.  k++)
  87. octVal = (octVal << 3) + (s[i + k] - '0');
  88. i += k - 1;
  89. newStr[j] = ((char) octVal);
  90. }
  91. break;
  92. default:
  93. newStr[j] = s[i];
  94. break;
  95. } /* switch */
  96. } /* s[i] == '\' */
  97. else
  98. newStr[j] = s[i];
  99. j++;
  100. }
  101. newStr[j] = '';
  102. return newStr;
  103. }