FoxInterpreterSymbols.Mod 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. MODULE FoxInterpreterSymbols; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT Strings, Basic := FoxBasic, StringPool, Streams, Commands, PersistentObjects;
  3. CONST
  4. MaxIndex = 8;
  5. TAB = 09X;
  6. TYPE
  7. Item*= PersistentObjects.Object;
  8. Address*= RECORD
  9. object*: Item;
  10. in*: Item;
  11. name*: StringPool.Index;
  12. i*: ARRAY MaxIndex OF LONGINT; (* indices if applicable *)
  13. END;
  14. Value* = OBJECT (Item)
  15. PROCEDURE & InitValue;
  16. BEGIN InitObject
  17. END InitValue;
  18. PROCEDURE WriteValue*(w: Streams.Writer);
  19. BEGIN
  20. END WriteValue;
  21. PROCEDURE GetString*(VAR w: ARRAY OF CHAR);
  22. VAR stringWriter: Streams.StringWriter;
  23. BEGIN
  24. NEW(stringWriter, 128);
  25. WriteValue(stringWriter); stringWriter.Update;
  26. stringWriter.Get(w);
  27. END GetString;
  28. END Value;
  29. CONST StrValue="value";
  30. TYPE
  31. IntegerValue*=OBJECT(Value)
  32. VAR value*: LONGINT;
  33. PROCEDURE & InitInteger*(value: LONGINT);
  34. BEGIN InitValue; SELF.value := value; type := "IntegerValue";
  35. END InitInteger;
  36. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  37. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  38. END Enumerate;
  39. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  40. BEGIN
  41. IF name = StrValue THEN c.GetInteger(value);
  42. ELSE Set^(name, index, c);
  43. END;
  44. END Set;
  45. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  46. BEGIN
  47. IF name = StrValue THEN c.SetInteger(value);
  48. ELSE Get^(name, index, c);
  49. END;
  50. END Get;
  51. PROCEDURE WriteValue(w: Streams.Writer);
  52. BEGIN w.Int(value,0);
  53. END WriteValue;
  54. END IntegerValue;
  55. RealValue*=OBJECT(Value)
  56. VAR value*: LONGREAL;
  57. PROCEDURE & InitReal*(value: LONGREAL);
  58. BEGIN InitValue; SELF.value := value; type := "RealValue";
  59. END InitReal;
  60. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  61. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  62. END Enumerate;
  63. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  64. BEGIN
  65. IF name = StrValue THEN c.GetFloat(value);
  66. ELSE Set^(name, index, c);
  67. END;
  68. END Set;
  69. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  70. BEGIN
  71. IF name = StrValue THEN c.SetFloat(value);
  72. ELSE Get^(name, index, c);
  73. END;
  74. END Get;
  75. PROCEDURE WriteValue(w: Streams.Writer);
  76. BEGIN w.Float(value,40);
  77. END WriteValue;
  78. END RealValue;
  79. BooleanValue*=OBJECT(Value)
  80. VAR value*: BOOLEAN;
  81. PROCEDURE & InitBoolean*(value: BOOLEAN);
  82. BEGIN InitValue; SELF.value := value; type := "BooleanValue";
  83. END InitBoolean;
  84. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  85. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  86. END Enumerate;
  87. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  88. BEGIN
  89. IF name = StrValue THEN c.GetBoolean(value);
  90. ELSE Set^(name, index, c);
  91. END;
  92. END Set;
  93. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  94. BEGIN
  95. IF name = StrValue THEN c.SetBoolean(value);
  96. ELSE Get^(name, index, c);
  97. END;
  98. END Get;
  99. PROCEDURE WriteValue(w: Streams.Writer);
  100. BEGIN IF value THEN w.String("TRUE") ELSE w.String("FALSE") END
  101. END WriteValue;
  102. END BooleanValue;
  103. StringValue*=OBJECT(Value)
  104. VAR value*: Strings.String;
  105. PROCEDURE & InitString*(CONST value: ARRAY OF CHAR);
  106. BEGIN InitValue; SELF.value := Strings.NewString(value); type := "StringValue";
  107. END InitString;
  108. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  109. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  110. END Enumerate;
  111. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  112. BEGIN
  113. IF name = StrValue THEN c.GetString(value);
  114. ELSE Set^(name, index, c);
  115. END;
  116. END Set;
  117. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  118. BEGIN
  119. IF name = StrValue THEN c.SetString(value);
  120. ELSE Get^(name, index, c);
  121. END;
  122. END Get;
  123. PROCEDURE WriteValue(w: Streams.Writer);
  124. BEGIN (*w.String('"');*) w.String(value^); (*w.String('"');*)
  125. END WriteValue;
  126. END StringValue;
  127. SetValue*=OBJECT(Value)
  128. VAR value*: SET;
  129. PROCEDURE & InitSet*(value: SET);
  130. BEGIN InitValue; SELF.value := value; type := "SetValue"
  131. END InitSet;
  132. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  133. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  134. END Enumerate;
  135. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  136. BEGIN
  137. IF name = StrValue THEN c.GetSet(value);
  138. ELSE Set^(name, index, c);
  139. END;
  140. END Set;
  141. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  142. BEGIN
  143. IF name = StrValue THEN c.SetSet(value);
  144. ELSE Get^(name, index, c);
  145. END;
  146. END Get;
  147. PROCEDURE WriteValue(w: Streams.Writer);
  148. BEGIN
  149. w.Set(value)
  150. END WriteValue;
  151. END SetValue;
  152. RangeValue*=OBJECT(Value)
  153. VAR value*: RANGE;
  154. PROCEDURE & InitRange*(r: RANGE);
  155. BEGIN InitValue; value := r; type := "RangeValue"
  156. END InitRange;
  157. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  158. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  159. END Enumerate;
  160. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  161. BEGIN
  162. IF name = StrValue THEN c.GetRange(value);
  163. ELSE Set^(name, index, c);
  164. END;
  165. END Set;
  166. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  167. BEGIN
  168. IF name = StrValue THEN c.SetRange(value);
  169. ELSE Get^(name, index, c);
  170. END;
  171. END Get;
  172. PROCEDURE WriteValue(w: Streams.Writer);
  173. BEGIN
  174. w.Int(FIRST(value),0); w.String(" .. "); w.Int(LAST(value),0); IF STEP(value) # 1 THEN w.String(" BY "); w.Int(STEP(value),0) END;
  175. END WriteValue;
  176. END RangeValue;
  177. CharValue*=OBJECT(Value)
  178. VAR value: CHAR;
  179. PROCEDURE & InitChar*(c: CHAR);
  180. BEGIN InitValue; value := c; type := "CharValue";
  181. END InitChar;
  182. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  183. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  184. END Enumerate;
  185. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  186. BEGIN
  187. IF name = StrValue THEN c.GetChar(value);
  188. ELSE Set^(name, index, c);
  189. END;
  190. END Set;
  191. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  192. BEGIN
  193. IF name = StrValue THEN c.SetChar(value);
  194. ELSE Get^(name, index, c);
  195. END;
  196. END Get;
  197. PROCEDURE WriteValue(w: Streams.Writer);
  198. BEGIN
  199. w.Hex(ORD(value),2); w.String("X");
  200. END WriteValue;
  201. END CharValue;
  202. EnumValue*=OBJECT(Value)
  203. VAR value: LONGINT; translation: PersistentObjects.Translation;
  204. PROCEDURE & InitEnumValue*(trans: PersistentObjects.Translation; v: LONGINT);
  205. BEGIN InitValue; value := v; translation := trans; type := "EnumValue";
  206. END InitEnumValue;
  207. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  208. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  209. END Enumerate;
  210. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  211. BEGIN
  212. IF name = StrValue THEN c.GetEnum(translation, value);
  213. ELSE Set^(name, index, c);
  214. END;
  215. END Set;
  216. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  217. BEGIN
  218. IF name = StrValue THEN c.SetEnum(translation, value);
  219. ELSE Get^(name, index, c);
  220. END;
  221. END Get;
  222. PROCEDURE WriteValue(w: Streams.Writer);
  223. VAR str: ARRAY 32 OF CHAR;
  224. BEGIN
  225. IF translation.Name(value, str) THEN w.String(str) ELSE w.String("unknown") END;
  226. END WriteValue;
  227. END EnumValue;
  228. MathArrayValue*=OBJECT(Value)
  229. VAR values: ARRAY [*] OF Value;
  230. PROCEDURE &InitMathArrayValue*(len: LONGINT);
  231. BEGIN
  232. InitValue;
  233. NEW(values, len);
  234. type := "MathArrayValue";
  235. END InitMathArrayValue;
  236. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  237. BEGIN Enumerate^(enum); enum(StrValue,FALSE);
  238. END Enumerate;
  239. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  240. BEGIN
  241. IF name = StrValue THEN values[index] := ContentGetValue(c)
  242. ELSE Set^(name, index, c);
  243. END;
  244. END Set;
  245. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  246. BEGIN
  247. IF name = StrValue THEN c.SetObject(values[index],"Value");
  248. ELSE Get^(name, index, c);
  249. END;
  250. END Get;
  251. PROCEDURE SetValue*(at: LONGINT; value: Value);
  252. BEGIN
  253. values[at] := value;
  254. END SetValue;
  255. PROCEDURE GetValue*(at: LONGINT): Value;
  256. BEGIN
  257. RETURN values[at]
  258. END GetValue;
  259. PROCEDURE WriteValue*(w: Streams.Writer);
  260. VAR i: LONGINT; max: LONGINT;
  261. BEGIN
  262. w.String("[ ");
  263. max := LEN(values,0)-1;
  264. FOR i := 0 TO max DO
  265. values[i].WriteValue(w);
  266. IF i < max THEN
  267. w.String(", ");
  268. END;
  269. END;
  270. w.String("] ");
  271. END WriteValue;
  272. END MathArrayValue;
  273. (* object value represented as ANY wrapped in Value ? *)
  274. Symbol*= OBJECT
  275. VAR
  276. name: StringPool.Index;
  277. item-: Item;
  278. PROCEDURE & InitSymbol(name: StringPool.Index; index: LONGINT);
  279. BEGIN
  280. SELF.name := name; SELF.item := item;
  281. END InitSymbol;
  282. PROCEDURE GetName(VAR name: ARRAY OF CHAR);
  283. BEGIN
  284. StringPool.GetString(SELF.name, name);
  285. END GetName;
  286. END Symbol;
  287. Container* = OBJECT (Item)
  288. VAR
  289. symbols-: Basic.List;
  290. lookup-: Basic.HashTableInt;
  291. (* New scope. Note that it is possible that a scope is registered with an alias *)
  292. PROCEDURE & InitContainer*;
  293. BEGIN
  294. InitObject();
  295. NEW(lookup, 16); NEW(symbols, 16);
  296. type := "Container";
  297. END InitContainer;
  298. PROCEDURE Enumerate(enum: PersistentObjects.Enumerator);
  299. VAR i: LONGINT; symbol: Symbol; o: ANY; name: ARRAY 256 OF CHAR;
  300. BEGIN Enumerate^(enum);
  301. FOR i := 0 TO symbols.Length()-1 DO
  302. o := symbols.Get(i);
  303. symbol := o(Symbol);
  304. symbol.GetName(name);
  305. enum(name, FALSE);
  306. END;
  307. END Enumerate;
  308. PROCEDURE Set(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  309. BEGIN
  310. IF FALSE THEN
  311. ELSE Set^(name, index, c);
  312. END;
  313. END Set;
  314. PROCEDURE Get(CONST name: ARRAY OF CHAR; index: LONGINT; c: PersistentObjects.Content);
  315. VAR item: Item;
  316. BEGIN
  317. item := Find(name);
  318. IF item # NIL THEN c.SetObject(item,"Item")
  319. ELSE Get^(name, index, c);
  320. END;
  321. END Get;
  322. PROCEDURE GetItem*(index: LONGINT): Item;
  323. BEGIN
  324. RETURN symbols.Get(index)(Symbol).item
  325. END GetItem;
  326. (* Enter a symbol with its name *)
  327. PROCEDURE Enter1*(item: Item; name: StringPool.Index);
  328. VAR any: ANY; symbol: Symbol;
  329. BEGIN
  330. any := lookup.Get(name);
  331. IF any # NIL THEN
  332. symbol := any(Symbol)
  333. ELSE
  334. NEW(symbol, name, symbols.Length());
  335. symbols.Add(symbol);
  336. lookup.Put(symbol.name, symbol);
  337. END;
  338. symbol.item := item
  339. END Enter1;
  340. (* Enter a symbol with its name *)
  341. PROCEDURE Enter*(item: Item; CONST name: ARRAY OF CHAR);
  342. BEGIN
  343. Enter1(item, StringPool.GetIndex1(name))
  344. END Enter;
  345. PROCEDURE Find1*(id: LONGINT): Item;
  346. VAR any: ANY;
  347. BEGIN
  348. any := lookup.Get(id);
  349. IF any # NIL THEN RETURN any(Symbol).item ELSE RETURN NIL END
  350. END Find1;
  351. (* Find a symbol with name *)
  352. PROCEDURE Find*(CONST name: ARRAY OF CHAR): Item;
  353. BEGIN
  354. RETURN Find1(StringPool.GetIndex1(name))
  355. END Find;
  356. END Container;
  357. Scope* = OBJECT
  358. VAR
  359. outer-: Scope;
  360. object-: PersistentObjects.Object;
  361. level: LONGINT;
  362. PROCEDURE & InitScope*(outer: Scope; object: PersistentObjects.Object);
  363. BEGIN
  364. SELF.outer := outer;
  365. IF outer = NIL THEN level := 0 ELSE level := outer.level + 1 END;
  366. ASSERT(object # NIL);
  367. SELF.object := object
  368. END InitScope;
  369. PROCEDURE Enter*(object: PersistentObjects.Object): Scope;
  370. VAR scope: Scope;
  371. BEGIN
  372. NEW(scope, SELF, object);
  373. RETURN scope
  374. END Enter;
  375. PROCEDURE FindObject*(CONST name: ARRAY OF CHAR; index: LONGINT; VAR in: PersistentObjects.Object): PersistentObjects.Object;
  376. VAR object: PersistentObjects.Object;
  377. BEGIN
  378. in := SELF.object;
  379. object := FindInObject(in, name, index);
  380. IF (object = NIL) & (outer # NIL) THEN
  381. object := outer.FindObject(name, index, in)
  382. END;
  383. RETURN object
  384. END FindObject;
  385. PROCEDURE FindObject1*(name: StringPool.Index; index: LONGINT; VAR in: PersistentObjects.Object): PersistentObjects.Object;
  386. VAR str: ARRAY 256 OF CHAR;
  387. BEGIN
  388. StringPool.GetString(name, str);
  389. RETURN FindObject(str,index, in);
  390. END FindObject1;
  391. PROCEDURE Leave*(): Scope;
  392. BEGIN
  393. RETURN outer
  394. END Leave;
  395. PROCEDURE Dump*(log: Streams.Writer);
  396. BEGIN
  397. IF object # NIL THEN object.Dump(log,"scope object") END;
  398. log.Ln;
  399. IF outer # NIL THEN outer.Dump(log) END;
  400. END Dump;
  401. END Scope;
  402. PROCEDURE Indent(w: Streams.Writer; level: LONGINT);
  403. BEGIN
  404. WHILE level> 0 DO w.Char(TAB); DEC(level) END;
  405. END Indent;
  406. PROCEDURE Test*(context: Commands.Context);
  407. VAR scope, inner: Scope; container: Container; integer: IntegerValue; float: RealValue; string: StringValue;
  408. BEGIN
  409. NEW(container);
  410. container.Enter(integer, "integer");
  411. container.Enter(float,"float");
  412. container.Enter(string,"string");
  413. NEW(scope, NIL, container);
  414. NEW(container);
  415. inner := scope.Enter(container);
  416. scope.Dump(context.out);
  417. (*scope.Write(context.out);*)
  418. END Test;
  419. PROCEDURE ContentGetValue(c: PersistentObjects.Content): Value;
  420. VAR o: PersistentObjects.Object;
  421. BEGIN
  422. c.GetObject(o); IF o = NIL THEN RETURN NIL ELSE RETURN o(Value) END;
  423. END ContentGetValue;
  424. PROCEDURE NewIntegerValue(value: LONGINT): IntegerValue;
  425. VAR obj: IntegerValue;
  426. BEGIN
  427. NEW(obj, value); RETURN obj
  428. END NewIntegerValue;
  429. PROCEDURE NewFloatValue(value: LONGREAL): RealValue;
  430. VAR obj: RealValue;
  431. BEGIN
  432. NEW(obj, value); RETURN obj
  433. END NewFloatValue;
  434. PROCEDURE NewBooleanValue(value: BOOLEAN): BooleanValue;
  435. VAR obj: BooleanValue;
  436. BEGIN
  437. NEW(obj, value); RETURN obj
  438. END NewBooleanValue;
  439. PROCEDURE NewStringValue(CONST value: ARRAY OF CHAR): StringValue;
  440. VAR obj: StringValue;
  441. BEGIN
  442. NEW(obj, value); RETURN obj
  443. END NewStringValue;
  444. PROCEDURE NewNameValue(CONST value: ARRAY OF CHAR): StringValue;
  445. VAR obj: StringValue;
  446. BEGIN
  447. NEW(obj, value); RETURN obj
  448. END NewNameValue;
  449. PROCEDURE NewRangeValue(value: RANGE): RangeValue;
  450. VAR obj: RangeValue;
  451. BEGIN
  452. NEW(obj, value); RETURN obj
  453. END NewRangeValue;
  454. PROCEDURE NewCharValue(value: CHAR): CharValue;
  455. VAR obj: CharValue;
  456. BEGIN
  457. NEW(obj, value); RETURN obj
  458. END NewCharValue;
  459. PROCEDURE NewSetValue(value: SET): SetValue;
  460. VAR obj: SetValue;
  461. BEGIN
  462. NEW(obj, value); RETURN obj
  463. END NewSetValue;
  464. PROCEDURE NewEnumValue(translation: PersistentObjects.Translation; value: LONGINT): EnumValue;
  465. VAR obj: EnumValue;
  466. BEGIN
  467. NEW(obj, translation, value);
  468. END NewEnumValue;
  469. PROCEDURE FindInObject*(in: PersistentObjects.Object; CONST name: ARRAY OF CHAR; index: LONGINT): PersistentObjects.Object;
  470. VAR content: PersistentObjects.Content;
  471. TYPE Class=PersistentObjects.Class;
  472. BEGIN
  473. NEW(content);
  474. in.Get(name, index, content);
  475. IF content.success THEN
  476. CASE content.class OF
  477. |Class.String: RETURN NewStringValue(content.string^);
  478. |Class.Object: RETURN content.object
  479. |Class.Name: RETURN NewNameValue(content.name);
  480. |Class.Boolean: RETURN NewBooleanValue(content.boolean);
  481. |Class.Integer: RETURN NewIntegerValue(content.integer);
  482. |Class.Float: RETURN NewFloatValue(content.float);
  483. |Class.Enum: RETURN NewEnumValue(content.translation,content.integer)
  484. |Class.Range: RETURN NewRangeValue(content.range)
  485. |Class.Set: RETURN NewSetValue(content.set)
  486. |Class.Char: RETURN NewCharValue(content.char)
  487. END
  488. END;
  489. RETURN NIL
  490. END FindInObject;
  491. TYPE
  492. ObjectFilter* = OBJECT
  493. VAR
  494. content: PersistentObjects.Content;
  495. object: PersistentObjects.Object;
  496. found: Container;
  497. attribute, value: ARRAY 256 OF CHAR;
  498. PROCEDURE & InitObjectFilter*;
  499. BEGIN
  500. NEW(content); NEW(found);
  501. END InitObjectFilter;
  502. PROCEDURE AddFiltered(obj: PersistentObjects.Object);
  503. BEGIN
  504. IF obj # NIL THEN
  505. obj.Get(attribute, -1, content);
  506. IF content.success & content.Equals(value) THEN
  507. found.Enter(obj,"any");
  508. END;
  509. END;
  510. END AddFiltered;
  511. PROCEDURE Enumerate(CONST name: ARRAY OF CHAR; array: BOOLEAN);
  512. VAR obj: PersistentObjects.Object; index: LONGINT;
  513. BEGIN
  514. object.Get(name,-1, content);
  515. IF content.success & (content.class = PersistentObjects.Class.Object) THEN
  516. IF array THEN
  517. index := 0;
  518. REPEAT
  519. object.Get(name, index, content);
  520. obj := content.object;
  521. AddFiltered(obj);
  522. INC(index);
  523. UNTIL obj = NIL;
  524. ELSE
  525. AddFiltered(content.object)
  526. END;
  527. END;
  528. END Enumerate;
  529. PROCEDURE Filter*(obj: PersistentObjects.Object; attribute, value: ARRAY OF CHAR): Container;
  530. BEGIN
  531. NEW(found);
  532. object := obj;
  533. COPY(attribute, SELF.attribute);
  534. COPY(value, SELF.value);
  535. obj.Enumerate(Enumerate);
  536. RETURN found
  537. END Filter;
  538. END ObjectFilter;
  539. PROCEDURE FindInObject1*(in: PersistentObjects.Object; name: StringPool.Index; index: LONGINT): PersistentObjects.Object;
  540. VAR str: ARRAY 256 OF CHAR;
  541. BEGIN
  542. StringPool.GetString(name, str);
  543. RETURN FindInObject(in,str,index);
  544. END FindInObject1;
  545. END FoxInterpreterSymbols.
  546. SystemTools.FreeDownTo FoxInterpreterSymbols ~
  547. FoxInterpreterSymbols.Test ~