Inform - Support - Source

Back to List

Inventory
Complete

Backward
Forward

Plain
Coloured
Gaudy

This code
in plain text

Browsing infix.h

InfixRvalueTerm (lines 131-278)

0131  [ InfixRvalueTerm n w i initial_wn wa wl sign base digit dcount;
0132   
0133      initial_wn = wn;
0134   
0135      infix_parsed_lvalue = -1;
0136      infix_term_type = INFIXTT_NUMBER;
0137   
0138      w = NextWordStopped();
0139      if (w == -1) return -1;
0140   
0141      wa = WordAddress(wn-1);
0142      wl = WordLength(wn-1);
0143      if (wa->0 == '-' or '$' or '0' or '1' or '2' or '3'
0144                or '4' or '5' or '6' or '7' or '8' or '9') {
0145          ! Parse decimal, hex or binary number
0146   
0147          sign = 1; base = 10; dcount = 0;
0148          if (wa->0 == '-') { sign = -1; wl--; wa++; }
0149          else {
0150              if (wa->0 == '$') { base = 16; wl--; wa++; }
0151              if (wa->0 == '$') { base = 2; wl--; wa++; }
0152          }
0153          if (wl == 0) return -1;
0154          n = 0;
0155          while (wl > 0) {
0156              if (wa->0 >= 'a') digit = wa->0 - 'a' + 10;
0157              else digit = wa->0 - '0';
0158              dcount++;
0159              switch (base) {
0160                2:
0161                  if (dcount == 17) return -1;
0162                10:
0163                  if (dcount == 6) return -1;
0164                  if (dcount == 5) {
0165                      if (n > 3276) return -1;
0166                      if (n == 3276) {
0167                          if (sign == 1 && digit > 7) return -1;
0168                          if (sign == -1 && digit > 8) return -1;
0169                      }
0170                  }
0171                16:
0172                  if (dcount == 5) return -1;
0173              }
0174              if (digit >= 0 && digit < base) n = base*n + digit;
0175              else return -1;
0176              wl--; wa++;
0177          }
0178          parsed_number = n*sign; return 1;
0179      }
0180   
0181      ! Parse character constant 'a'
0182   
0183      if (wl == 3 && wa->0 == ''' && wa->2 == ''') {
0184          parsed_number = wa->1; return 1;
0185      }
0186   
0187      ! ##Action, 'dword'
0188   
0189      switch (w) {
0190        '##':
0191          infix_term_type = INFIXTT_ACTION;
0192          w = NextWordStopped(); if (w == -1) return -1;
0193          wn--;
0194          if (InfixActionToken() == 0) return 1;
0195          return -1;
0196        '^^':
0197          infix_term_type = INFIXTT_DWORD;
0198          w = NextWordStopped(); if (w == -1) return -1;
0199          parsed_number = w; return 1;
0200      }
0201   
0202      ! Test for attribute, property, class name, variable name, array name, routine
0203      ! name, constant name
0204   
0205      wn--;
0206      if ((wa->0 >= 'a' && wa->0 <= 'z') ||
0207          (wa->0 >= 'A' && wa->0 <= 'Z') ||
0208           wa->0 == '_') {
0209   
0210   
0211          infix_term_type = INFIXTT_ATTRIBUTE;
0212          if (InfixMatchPrule(InfixPrintAttribute, #lowest_attribute_number,
0213              #highest_attribute_number, wa, wl)) {
0214              wn++; return 1; }
0215   
0216          infix_term_type = INFIXTT_PROPERTY;
0217          if (InfixMatchPrule(InfixPrintProperty, #lowest_property_number,
0218              #highest_property_number, wa, wl)) {
0219              wn++; return 1; }
0220   
0221          infix_term_type = INFIXTT_GLOBAL;
0222          if (InfixMatchPrule(InfixPrintGlobal, #lowest_global_number,
0223              #highest_global_number, wa, wl)) {
0224              infix_parsed_lvalue = parsed_number-16;
0225              parsed_number = #globals_array-->infix_parsed_lvalue;
0226              wn++; return 1;
0227          }
0228   
0229          infix_term_type = INFIXTT_ARRAY;
0230          if (InfixMatchPrule(InfixPrintArray, #lowest_array_number,
0231              #highest_array_number, wa, wl)) {
0232              infix_parsed_lvalue = parsed_number;
0233              parsed_number = Symb__Tab(INFIXTT_ARRAY,parsed_number);
0234              infix_data1 = temp__global3;
0235              infix_data2 = temp__global2;
0236              wn++; return 1;
0237          }
0238   
0239          infix_term_type = INFIXTT_ROUTINE;
0240          if (InfixMatchPrule(InfixPrintRoutine, #lowest_routine_number,
0241              #highest_routine_number, wa, wl)) {
0242              infix_parsed_lvalue = parsed_number;
0243              parsed_number = Symb__Tab(INFIXTT_ROUTINE,parsed_number);
0244              infix_data1 = temp__global3;
0245              infix_data2 = temp__global2;
0246              wn++; return 1;
0247          }
0248   
0249          infix_term_type = INFIXTT_CONSTANT;
0250          if (InfixMatchPrule(InfixPrintConstant, #lowest_constant_number,
0251              #highest_constant_number, wa, wl)) {
0252              infix_parsed_lvalue = parsed_number;
0253              parsed_number = Symb__Tab(INFIXTT_CONSTANT,parsed_number);
0254              infix_data1 = temp__global3;
0255              infix_data2 = temp__global2;
0256              wn++; return 1;
0257          }
0258   
0259          switch (w) {
0260            'parent', 'child', 'children',
0261            'random', 'metaclass', 'sibling':
0262              parsed_number = w;
0263              infix_parsed_lvalue = INFIXTT_SYSFUN;
0264              wn++; return 1;
0265          }
0266      }
0267   
0268      infix_term_type = INFIXTT_NAMEDOBJECT;
0269   
0270      wn = initial_wn; i = ParseToken(SCOPE_TT, InfixBigScope);
0271   
0272      if (i == GPR_REPARSE) return i;
0273      if (i > GPR_MULTIPLE) {
0274          print "(", (name) i, " (", i, "))^";
0275          parsed_number = i; return 1;
0276      }
0277      return -1;
0278  ]; ! end of InfixRvalueTerm


Last updated 27 February 2004. The librarian in charge of this page is Graham Nelson (graham@gnelson.demon.co.uk) assisted by C Knight. Please email any comments, suggestions or corrections to cedenqs@inform-fiction.org.