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.

335 lines
8.0 KiB

  1. /***********************************************************************
  2. * Microsoft (R) Windows (R) Resource Compiler
  3. *
  4. * Copyright (c) Microsoft Corporation. All rights reserved.
  5. *
  6. * File Comments:
  7. *
  8. *
  9. ***********************************************************************/
  10. #include "rc.h"
  11. /************************************************************************/
  12. /* Local Function Prototypes */
  13. /************************************************************************/
  14. long and(void);
  15. long andif(void);
  16. long constant(void);
  17. long constexpr(void);
  18. long eqset(void);
  19. long mult(void);
  20. long or(void);
  21. long orelse(void);
  22. long plus(void);
  23. long prim(void);
  24. long relation(void);
  25. long shift(void);
  26. long xor(void);
  27. /************************************************************************/
  28. /* File Global Variables */
  29. /************************************************************************/
  30. long Currval = 0;
  31. static int Parencnt = 0;
  32. /************************************************************************/
  33. /* do_constexpr() */
  34. /************************************************************************/
  35. long
  36. do_constexpr(
  37. void
  38. )
  39. {
  40. REG long val;
  41. Parencnt = 0;
  42. Currtok = L_NOTOKEN;
  43. val = constexpr();
  44. if( Currtok == L_RPAREN ) {
  45. if( Parencnt-- == 0 ) {
  46. fatal(1012, L"("); /* missing left paren */
  47. }
  48. } else if( Currtok != L_NOTOKEN ) {
  49. warning(4067, PPifel_str);
  50. }
  51. if( Parencnt > 0 ) {
  52. fatal(4012, L")"); /* missing right paren */
  53. }
  54. return(val);
  55. }
  56. /************************************************************************/
  57. /* constexpr ::= orelse [ '?' orelse ':' orelse ]; */
  58. /************************************************************************/
  59. long
  60. constexpr(
  61. void
  62. )
  63. {
  64. REG long val;
  65. REG long val1;
  66. long val2;
  67. val = orelse();
  68. if( nextis(L_QUEST) ) {
  69. val1 = orelse();
  70. if( nextis(L_COLON) )
  71. val2 = orelse();
  72. return(val ? val1 : val2);
  73. }
  74. return(val);
  75. }
  76. /************************************************************************/
  77. /* orelse ::= andif [ '||' andif ]* ; */
  78. /************************************************************************/
  79. long
  80. orelse(
  81. void
  82. )
  83. {
  84. REG long val;
  85. val = andif();
  86. while(nextis(L_OROR))
  87. val = andif() || val;
  88. return(val);
  89. }
  90. /************************************************************************/
  91. /* andif ::= or [ '&&' or ]* ; */
  92. /************************************************************************/
  93. long
  94. andif(
  95. void
  96. )
  97. {
  98. REG long val;
  99. val = or();
  100. while(nextis(L_ANDAND))
  101. val = or() && val;
  102. return(val);
  103. }
  104. /************************************************************************/
  105. /* or ::= xor [ '|' xor]* ; */
  106. /************************************************************************/
  107. long
  108. or(
  109. void
  110. )
  111. {
  112. REG long val;
  113. val = xor();
  114. while( nextis(L_OR) )
  115. val |= xor();
  116. return(val);
  117. }
  118. /************************************************************************/
  119. /* xor ::= and [ '^' and]* ; */
  120. /************************************************************************/
  121. long
  122. xor(
  123. void
  124. )
  125. {
  126. REG long val;
  127. val = and();
  128. while( nextis(L_XOR) )
  129. val ^= and();
  130. return(val);
  131. }
  132. /************************************************************************/
  133. /* and ::= eqset [ '&' eqset]* ; */
  134. /************************************************************************/
  135. long
  136. and(
  137. void
  138. )
  139. {
  140. REG long val;
  141. val = eqset();
  142. while( nextis(L_AND) )
  143. val &= eqset();
  144. return(val);
  145. }
  146. /************************************************************************/
  147. /* eqset ::= relation [ ('==' | '!=') eqset] ; */
  148. /************************************************************************/
  149. long
  150. eqset(
  151. void
  152. )
  153. {
  154. REG long val;
  155. val = relation();
  156. if( nextis(L_EQUALS) )
  157. return(val == relation());
  158. if( nextis(L_NOTEQ) )
  159. return(val != relation());
  160. return(val);
  161. }
  162. /************************************************************************/
  163. /* relation ::= shift [ ('<' | '>' | '<=' | '>=' ) shift] ; */
  164. /************************************************************************/
  165. long
  166. relation(
  167. void
  168. )
  169. {
  170. REG long val;
  171. val = shift();
  172. if( nextis(L_LT) )
  173. return(val < shift());
  174. if( nextis(L_GT) )
  175. return(val > shift());
  176. if( nextis(L_LTEQ) )
  177. return(val <= shift());
  178. if( nextis(L_GTEQ) )
  179. return(val >= shift());
  180. return(val);
  181. }
  182. /************************************************************************/
  183. /* shift ::= plus [ ('<< | '>>') plus] ; */
  184. /************************************************************************/
  185. long
  186. shift(
  187. void
  188. )
  189. {
  190. REG long val;
  191. val = plus();
  192. if( nextis(L_RSHIFT) )
  193. return(val >> plus());
  194. if( nextis(L_LSHIFT) )
  195. return(val << plus());
  196. return(val);
  197. }
  198. /************************************************************************/
  199. /* plus ::= mult [ ('+' | '-') mult ]* ; */
  200. /************************************************************************/
  201. long
  202. plus(
  203. void
  204. )
  205. {
  206. REG long val;
  207. val = mult();
  208. for(;;) {
  209. if( nextis(L_PLUS) )
  210. val += mult();
  211. else if( nextis(L_MINUS) )
  212. val -= mult();
  213. else
  214. break;
  215. }
  216. return(val);
  217. }
  218. /************************************************************************/
  219. /* mult ::= prim [ ('*' | '/' | '%' ) prim ]* ; */
  220. /************************************************************************/
  221. long
  222. mult(
  223. void
  224. )
  225. {
  226. REG long val;
  227. long PrimVal;
  228. val = prim();
  229. for(;;) {
  230. if( nextis(L_MULT) )
  231. val *= prim();
  232. else if( nextis(L_DIV) ) {
  233. PrimVal = prim();
  234. if (PrimVal)
  235. val /= PrimVal;
  236. else
  237. val = PrimVal;
  238. }
  239. else if( nextis(L_MOD) ) {
  240. PrimVal = prim();
  241. if (PrimVal)
  242. val %= PrimVal;
  243. else
  244. val = 0;
  245. }
  246. else
  247. break;
  248. }
  249. return(val);
  250. }
  251. /************************************************************************/
  252. /* prim ::= constant | ( '!' | '~' | '-' ) constant */
  253. /************************************************************************/
  254. long
  255. prim(
  256. void
  257. )
  258. {
  259. if( nextis(L_EXCLAIM) )
  260. return( ! constant());
  261. else if( nextis(L_TILDE) )
  262. return( ~ constant() );
  263. else if( nextis(L_MINUS) )
  264. return(-constant());
  265. else
  266. return(constant());
  267. }
  268. /************************************************************************/
  269. /* constant - at last, a terminal symbol | '(' constexpr ')' */
  270. /************************************************************************/
  271. long
  272. constant(
  273. void
  274. )
  275. {
  276. REG long val;
  277. if( nextis(L_LPAREN) ) {
  278. Parencnt++;
  279. val = constexpr();
  280. if( nextis(L_RPAREN) ) {
  281. Parencnt--;
  282. return(val);
  283. } else {
  284. fatal(1012, L")");
  285. }
  286. } else if( ! nextis(L_CINTEGER) ) {
  287. fatal(1017); /* invalid integer constant expression */
  288. }
  289. return(Currval);
  290. }