Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

573 lines
13 KiB

  1. /*++
  2. Copyright (c) 1996-1997 Microsoft Corporation
  3. Module Name:
  4. ppdchar.c
  5. Abstract:
  6. Functions for parsing the lexical elements of a PPD file
  7. Environment:
  8. PostScript driver, PPD parser
  9. Revision History:
  10. 08/20/96 -davidx-
  11. Common coding style for NT 5.0 drivers.
  12. 03/26/96 -davidx-
  13. Created it.
  14. --*/
  15. #include "lib.h"
  16. #include "ppd.h"
  17. #include "ppdparse.h"
  18. PFILEOBJ
  19. PCreateFileObj(
  20. PTSTR ptstrFilename
  21. )
  22. /*++
  23. Routine Description:
  24. Create an input file object
  25. Arguments:
  26. ptstrFilename - Specifies the input file name
  27. Return Value:
  28. Pointer to the newly-created file object
  29. NULL if there is an error
  30. --*/
  31. {
  32. PFILEOBJ pFile;
  33. if (! (pFile = MemAllocZ(sizeof(FILEOBJ))) ||
  34. ! (pFile->ptstrFileName = DuplicateString(ptstrFilename)))
  35. {
  36. ERR(("Memory allocation failed\n"));
  37. MemFree(pFile);
  38. return NULL;
  39. }
  40. pFile->hFileMap = MapFileIntoMemory(ptstrFilename,
  41. (PVOID *) &pFile->pubStart,
  42. &pFile->dwFileSize);
  43. if (pFile->hFileMap == NULL)
  44. {
  45. ERR(("Couldn't open file: %ws\n", ptstrFilename));
  46. MemFree(pFile);
  47. pFile = NULL;
  48. }
  49. else
  50. {
  51. pFile->pubNext = pFile->pubStart;
  52. pFile->pubEnd = pFile->pubStart + pFile->dwFileSize;
  53. pFile->iLineNumber = 1;
  54. pFile->bNewLine = TRUE;
  55. }
  56. return pFile;
  57. }
  58. VOID
  59. VDeleteFileObj(
  60. PFILEOBJ pFile
  61. )
  62. /*++
  63. Routine Description:
  64. Delete an input file object
  65. Arguments:
  66. pFile - Specifies the file object to be deleted
  67. Return Value:
  68. NONE
  69. --*/
  70. {
  71. ASSERT(pFile && pFile->hFileMap);
  72. UnmapFileFromMemory(pFile->hFileMap);
  73. MemFree(pFile->ptstrFileName);
  74. MemFree(pFile);
  75. }
  76. INT
  77. IGetNextChar(
  78. PFILEOBJ pFile
  79. )
  80. /*++
  81. Routine Description:
  82. Read the next character from the input file
  83. Arguments:
  84. pFile - Specifies the input file
  85. Return Value:
  86. Next character from the input file
  87. EOF_CHAR if end-of-file is encountered
  88. --*/
  89. {
  90. INT iBadChars = 0;
  91. //
  92. // Skip non-printable control characters
  93. //
  94. while (!END_OF_FILE(pFile) && !IS_VALID_CHAR(*pFile->pubNext))
  95. iBadChars++, pFile->pubNext++;
  96. if (iBadChars)
  97. {
  98. TERSE(("%ws: Non-printable characters on line %d\n",
  99. pFile->ptstrFileName,
  100. pFile->iLineNumber));
  101. }
  102. if (END_OF_FILE(pFile))
  103. return EOF_CHAR;
  104. //
  105. // A newline is a carriage-return, a line-feed, or CR-LF combination
  106. //
  107. if (*pFile->pubNext == LF ||
  108. *pFile->pubNext == CR && (END_OF_FILE(pFile) || pFile->pubNext[1] != LF))
  109. {
  110. pFile->bNewLine = TRUE;
  111. pFile->iLineNumber++;
  112. }
  113. else
  114. {
  115. pFile->bNewLine = FALSE;
  116. }
  117. return *(pFile->pubNext++); // return current character and advance pointer to next char
  118. }
  119. VOID
  120. VUngetChar(
  121. PFILEOBJ pFile
  122. )
  123. /*++
  124. Routine Description:
  125. Return the last character read to the input file
  126. Arguments:
  127. pFile - Specifies the input file
  128. Return Value:
  129. NONE
  130. --*/
  131. {
  132. ASSERT(pFile->pubNext > pFile->pubStart);
  133. pFile->pubNext--;
  134. if (pFile->bNewLine)
  135. {
  136. ASSERT(pFile->iLineNumber > 1);
  137. pFile->iLineNumber--;
  138. pFile->bNewLine = FALSE;
  139. }
  140. }
  141. VOID
  142. VSkipSpace(
  143. PFILEOBJ pFile
  144. )
  145. /*++
  146. Routine Description:
  147. Skip all characters until the next non-space character
  148. Arguments:
  149. pFile - Specifies the input file
  150. Return Value:
  151. NONE
  152. --*/
  153. {
  154. while (!END_OF_FILE(pFile) && IS_SPACE(*pFile->pubNext))
  155. pFile->pubNext++;
  156. }
  157. VOID
  158. VSkipLine(
  159. PFILEOBJ pFile
  160. )
  161. /*++
  162. Routine Description:
  163. Skip the remaining characters on the current input line
  164. Arguments:
  165. pFile - Specifies the input file
  166. Return Value:
  167. NONE
  168. --*/
  169. {
  170. while (!END_OF_LINE(pFile) && IGetNextChar(pFile) != EOF_CHAR)
  171. NULL;
  172. }
  173. BOOL
  174. BIs7BitAscii(
  175. PSTR pstr
  176. )
  177. /*++
  178. Routine Description:
  179. Check if a character string consists only of printable 7-bit ASCII characters
  180. Arguments:
  181. pstr - Specifies the character string to be checked
  182. Return Value:
  183. TRUE if the specified string consists only of printable 7-bit ASCII characters
  184. FALSE otherwise
  185. --*/
  186. {
  187. PBYTE pub = (PBYTE) pstr;
  188. while (*pub && gubCharMasks[*pub] && *pub < 127)
  189. pub++;
  190. return (*pub == 0);
  191. }
  192. //
  193. // Table to indicate which characters are allowed in what fields
  194. //
  195. #define DEFAULT_MASK (KEYWORD_MASK|XLATION_MASK|QUOTED_MASK|STRING_MASK)
  196. #define BINARY_MASK (QUOTED_MASK|XLATION_MASK)
  197. const BYTE gubCharMasks[256] = {
  198. /* 00 : */ 0,
  199. /* 01 : */ 0,
  200. /* 02 : */ 0,
  201. /* 03 : */ 0,
  202. /* 04 : */ 0,
  203. /* 05 : */ 0,
  204. /* 06 : */ 0,
  205. /* 07 : */ 0,
  206. /* 08 : */ 0,
  207. /* 09 : */ DEFAULT_MASK ^ KEYWORD_MASK,
  208. /* 0A : */ QUOTED_MASK,
  209. /* 0B : */ 0,
  210. /* 0C : */ 0,
  211. /* 0D : */ QUOTED_MASK,
  212. /* 0E : */ 0,
  213. /* 0F : */ 0,
  214. /* 10 : */ 0,
  215. /* 11 : */ 0,
  216. /* 12 : */ 0,
  217. /* 13 : */ 0,
  218. /* 14 : */ 0,
  219. /* 15 : */ 0,
  220. /* 16 : */ 0,
  221. /* 17 : */ 0,
  222. /* 18 : */ 0,
  223. /* 19 : */ 0,
  224. /* 1A : */ 0,
  225. /* 1B : */ 0,
  226. /* 1C : */ 0,
  227. /* 1D : */ 0,
  228. /* 1E : */ 0,
  229. /* 1F : */ 0,
  230. /* 20 : */ DEFAULT_MASK ^ KEYWORD_MASK,
  231. /* 21 : ! */ DEFAULT_MASK,
  232. /* 22 : " */ DEFAULT_MASK ^ QUOTED_MASK,
  233. /* 23 : # */ DEFAULT_MASK,
  234. /* 24 : $ */ DEFAULT_MASK,
  235. /* 25 : % */ DEFAULT_MASK,
  236. /* 26 : & */ DEFAULT_MASK,
  237. /* 27 : ' */ DEFAULT_MASK,
  238. /* 28 : ( */ DEFAULT_MASK,
  239. /* 29 : ) */ DEFAULT_MASK,
  240. /* 2A : * */ DEFAULT_MASK,
  241. /* 2B : + */ DEFAULT_MASK,
  242. /* 2C : , */ DEFAULT_MASK,
  243. /* 2D : - */ DEFAULT_MASK,
  244. /* 2E : . */ DEFAULT_MASK,
  245. /* 2F : / */ DEFAULT_MASK ^ (KEYWORD_MASK|STRING_MASK),
  246. /* 30 : 0 */ DEFAULT_MASK | DIGIT_MASK,
  247. /* 31 : 1 */ DEFAULT_MASK | DIGIT_MASK,
  248. /* 32 : 2 */ DEFAULT_MASK | DIGIT_MASK,
  249. /* 33 : 3 */ DEFAULT_MASK | DIGIT_MASK,
  250. /* 34 : 4 */ DEFAULT_MASK | DIGIT_MASK,
  251. /* 35 : 5 */ DEFAULT_MASK | DIGIT_MASK,
  252. /* 36 : 6 */ DEFAULT_MASK | DIGIT_MASK,
  253. /* 37 : 7 */ DEFAULT_MASK | DIGIT_MASK,
  254. /* 38 : 8 */ DEFAULT_MASK | DIGIT_MASK,
  255. /* 39 : 9 */ DEFAULT_MASK | DIGIT_MASK,
  256. /* 3A : : */ DEFAULT_MASK ^ (KEYWORD_MASK|XLATION_MASK),
  257. /* 3B : ; */ DEFAULT_MASK,
  258. /* 3C : < */ DEFAULT_MASK,
  259. /* 3D : = */ DEFAULT_MASK,
  260. /* 3E : > */ DEFAULT_MASK,
  261. /* 3F : ? */ DEFAULT_MASK,
  262. /* 40 : @ */ DEFAULT_MASK,
  263. /* 41 : A */ DEFAULT_MASK | HEX_DIGIT_MASK,
  264. /* 42 : B */ DEFAULT_MASK | HEX_DIGIT_MASK,
  265. /* 43 : C */ DEFAULT_MASK | HEX_DIGIT_MASK,
  266. /* 44 : D */ DEFAULT_MASK | HEX_DIGIT_MASK,
  267. /* 45 : E */ DEFAULT_MASK | HEX_DIGIT_MASK,
  268. /* 46 : F */ DEFAULT_MASK | HEX_DIGIT_MASK,
  269. /* 47 : G */ DEFAULT_MASK,
  270. /* 48 : H */ DEFAULT_MASK,
  271. /* 49 : I */ DEFAULT_MASK,
  272. /* 4A : J */ DEFAULT_MASK,
  273. /* 4B : K */ DEFAULT_MASK,
  274. /* 4C : L */ DEFAULT_MASK,
  275. /* 4D : M */ DEFAULT_MASK,
  276. /* 4E : N */ DEFAULT_MASK,
  277. /* 4F : O */ DEFAULT_MASK,
  278. /* 50 : P */ DEFAULT_MASK,
  279. /* 51 : Q */ DEFAULT_MASK,
  280. /* 52 : R */ DEFAULT_MASK,
  281. /* 53 : S */ DEFAULT_MASK,
  282. /* 54 : T */ DEFAULT_MASK,
  283. /* 55 : U */ DEFAULT_MASK,
  284. /* 56 : V */ DEFAULT_MASK,
  285. /* 57 : W */ DEFAULT_MASK,
  286. /* 58 : X */ DEFAULT_MASK,
  287. /* 59 : Y */ DEFAULT_MASK,
  288. /* 5A : Z */ DEFAULT_MASK,
  289. /* 5B : [ */ DEFAULT_MASK,
  290. /* 5C : \ */ DEFAULT_MASK,
  291. /* 5D : ] */ DEFAULT_MASK,
  292. /* 5E : ^ */ DEFAULT_MASK,
  293. /* 5F : _ */ DEFAULT_MASK,
  294. /* 60 : ` */ DEFAULT_MASK,
  295. /* 61 : a */ DEFAULT_MASK | HEX_DIGIT_MASK,
  296. /* 62 : b */ DEFAULT_MASK | HEX_DIGIT_MASK,
  297. /* 63 : c */ DEFAULT_MASK | HEX_DIGIT_MASK,
  298. /* 64 : d */ DEFAULT_MASK | HEX_DIGIT_MASK,
  299. /* 65 : e */ DEFAULT_MASK | HEX_DIGIT_MASK,
  300. /* 66 : f */ DEFAULT_MASK | HEX_DIGIT_MASK,
  301. /* 67 : g */ DEFAULT_MASK,
  302. /* 68 : h */ DEFAULT_MASK,
  303. /* 69 : i */ DEFAULT_MASK,
  304. /* 6A : j */ DEFAULT_MASK,
  305. /* 6B : k */ DEFAULT_MASK,
  306. /* 6C : l */ DEFAULT_MASK,
  307. /* 6D : m */ DEFAULT_MASK,
  308. /* 6E : n */ DEFAULT_MASK,
  309. /* 6F : o */ DEFAULT_MASK,
  310. /* 70 : p */ DEFAULT_MASK,
  311. /* 71 : q */ DEFAULT_MASK,
  312. /* 72 : r */ DEFAULT_MASK,
  313. /* 73 : s */ DEFAULT_MASK,
  314. /* 74 : t */ DEFAULT_MASK,
  315. /* 75 : u */ DEFAULT_MASK,
  316. /* 76 : v */ DEFAULT_MASK,
  317. /* 77 : w */ DEFAULT_MASK,
  318. /* 78 : x */ DEFAULT_MASK,
  319. /* 79 : y */ DEFAULT_MASK,
  320. /* 7A : z */ DEFAULT_MASK,
  321. /* 7B : { */ DEFAULT_MASK,
  322. /* 7C : | */ DEFAULT_MASK,
  323. /* 7D : } */ DEFAULT_MASK,
  324. /* 7E : ~ */ DEFAULT_MASK,
  325. /* 7F : */ BINARY_MASK,
  326. /* 80 : */ BINARY_MASK,
  327. /* 81 : */ BINARY_MASK,
  328. /* 82 : */ BINARY_MASK,
  329. /* 83 : */ BINARY_MASK,
  330. /* 84 : */ BINARY_MASK,
  331. /* 85 : */ BINARY_MASK,
  332. /* 86 : */ BINARY_MASK,
  333. /* 87 : */ BINARY_MASK,
  334. /* 88 : */ BINARY_MASK,
  335. /* 89 : */ BINARY_MASK,
  336. /* 8A : */ BINARY_MASK,
  337. /* 8B : */ BINARY_MASK,
  338. /* 8C : */ BINARY_MASK,
  339. /* 8D : */ BINARY_MASK,
  340. /* 8E : */ BINARY_MASK,
  341. /* 8F : */ BINARY_MASK,
  342. /* 90 : */ BINARY_MASK,
  343. /* 91 : */ BINARY_MASK,
  344. /* 92 : */ BINARY_MASK,
  345. /* 93 : */ BINARY_MASK,
  346. /* 94 : */ BINARY_MASK,
  347. /* 95 : */ BINARY_MASK,
  348. /* 96 : */ BINARY_MASK,
  349. /* 97 : */ BINARY_MASK,
  350. /* 98 : */ BINARY_MASK,
  351. /* 99 : */ BINARY_MASK,
  352. /* 9A : */ BINARY_MASK,
  353. /* 9B : */ BINARY_MASK,
  354. /* 9C : */ BINARY_MASK,
  355. /* 9D : */ BINARY_MASK,
  356. /* 9E : */ BINARY_MASK,
  357. /* 9F : */ BINARY_MASK,
  358. /* A0 : */ BINARY_MASK,
  359. /* A1 : */ BINARY_MASK,
  360. /* A2 : */ BINARY_MASK,
  361. /* A3 : */ BINARY_MASK,
  362. /* A4 : */ BINARY_MASK,
  363. /* A5 : */ BINARY_MASK,
  364. /* A6 : */ BINARY_MASK,
  365. /* A7 : */ BINARY_MASK,
  366. /* A8 : */ BINARY_MASK,
  367. /* A9 : */ BINARY_MASK,
  368. /* AA : */ BINARY_MASK,
  369. /* AB : */ BINARY_MASK,
  370. /* AC : */ BINARY_MASK,
  371. /* AD : */ BINARY_MASK,
  372. /* AE : */ BINARY_MASK,
  373. /* AF : */ BINARY_MASK,
  374. /* B0 : */ BINARY_MASK,
  375. /* B1 : */ BINARY_MASK,
  376. /* B2 : */ BINARY_MASK,
  377. /* B3 : */ BINARY_MASK,
  378. /* B4 : */ BINARY_MASK,
  379. /* B5 : */ BINARY_MASK,
  380. /* B6 : */ BINARY_MASK,
  381. /* B7 : */ BINARY_MASK,
  382. /* B8 : */ BINARY_MASK,
  383. /* B9 : */ BINARY_MASK,
  384. /* BA : */ BINARY_MASK,
  385. /* BB : */ BINARY_MASK,
  386. /* BC : */ BINARY_MASK,
  387. /* BD : */ BINARY_MASK,
  388. /* BE : */ BINARY_MASK,
  389. /* BF : */ BINARY_MASK,
  390. /* C0 : */ BINARY_MASK,
  391. /* C1 : */ BINARY_MASK,
  392. /* C2 : */ BINARY_MASK,
  393. /* C3 : */ BINARY_MASK,
  394. /* C4 : */ BINARY_MASK,
  395. /* C5 : */ BINARY_MASK,
  396. /* C6 : */ BINARY_MASK,
  397. /* C7 : */ BINARY_MASK,
  398. /* C8 : */ BINARY_MASK,
  399. /* C9 : */ BINARY_MASK,
  400. /* CA : */ BINARY_MASK,
  401. /* CB : */ BINARY_MASK,
  402. /* CC : */ BINARY_MASK,
  403. /* CD : */ BINARY_MASK,
  404. /* CE : */ BINARY_MASK,
  405. /* CF : */ BINARY_MASK,
  406. /* D0 : */ BINARY_MASK,
  407. /* D1 : */ BINARY_MASK,
  408. /* D2 : */ BINARY_MASK,
  409. /* D3 : */ BINARY_MASK,
  410. /* D4 : */ BINARY_MASK,
  411. /* D5 : */ BINARY_MASK,
  412. /* D6 : */ BINARY_MASK,
  413. /* D7 : */ BINARY_MASK,
  414. /* D8 : */ BINARY_MASK,
  415. /* D9 : */ BINARY_MASK,
  416. /* DA : */ BINARY_MASK,
  417. /* DB : */ BINARY_MASK,
  418. /* DC : */ BINARY_MASK,
  419. /* DD : */ BINARY_MASK,
  420. /* DE : */ BINARY_MASK,
  421. /* DF : */ BINARY_MASK,
  422. /* E0 : */ BINARY_MASK,
  423. /* E1 : */ BINARY_MASK,
  424. /* E2 : */ BINARY_MASK,
  425. /* E3 : */ BINARY_MASK,
  426. /* E4 : */ BINARY_MASK,
  427. /* E5 : */ BINARY_MASK,
  428. /* E6 : */ BINARY_MASK,
  429. /* E7 : */ BINARY_MASK,
  430. /* E8 : */ BINARY_MASK,
  431. /* E9 : */ BINARY_MASK,
  432. /* EA : */ BINARY_MASK,
  433. /* EB : */ BINARY_MASK,
  434. /* EC : */ BINARY_MASK,
  435. /* ED : */ BINARY_MASK,
  436. /* EE : */ BINARY_MASK,
  437. /* EF : */ BINARY_MASK,
  438. /* F0 : */ BINARY_MASK,
  439. /* F1 : */ BINARY_MASK,
  440. /* F2 : */ BINARY_MASK,
  441. /* F3 : */ BINARY_MASK,
  442. /* F4 : */ BINARY_MASK,
  443. /* F5 : */ BINARY_MASK,
  444. /* F6 : */ BINARY_MASK,
  445. /* F7 : */ BINARY_MASK,
  446. /* F8 : */ BINARY_MASK,
  447. /* F9 : */ BINARY_MASK,
  448. /* FA : */ BINARY_MASK,
  449. /* FB : */ BINARY_MASK,
  450. /* FC : */ BINARY_MASK,
  451. /* FD : */ BINARY_MASK,
  452. /* FE : */ BINARY_MASK,
  453. /* FF : */ BINARY_MASK,
  454. };