Annotation of OpenXM/src/kan96xx/Doc/ox.sm1, Revision 1.1.1.1
1.1 maekawa 1: %%%%%%%%%%%% Configuration: Specify your server path
2: %%%%% ox, ox_sm1, oxlog are contained in kxx.tgz
3: %%%%% These should be under /usr/local/lib/sm1 or LOAD_SM1_PATH
4: /oxpath.ox (bin/ox) def
5: /oxpath.oxsm1 (bin/ox_sm1) def
6: /oxpath.oxlog (bin/oxlog) def
7: /oxpath.xterm (/usr/X11R6/bin/xterm -icon -e ) def
8: /oxpath.null ( ) def
9: /oxpath.null00 ( >& /dev/null ) def %% cf oxNoX
10: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11: %% Old full path.
12: %/oxpath.ox (/home/nobuki/kxx/ox) def
13: %/oxpath.oxsm1 (/home/nobuki/kxx/ox_sm1) def
14: %/oxpath.oxlog (/home/nobuki/kxx/oxlog) def
15: %/oxpath.xterm (/usr/X11R6/bin/xterm -icon -e ) def
16:
17: %% This macro is invoked when this package is loaded.
18: /initializePathNamesForOx {
19: [oxpath.ox] getPathNameSm1 /oxpath.ox set
20: [oxpath.oxsm1] getPathNameSm1 /oxpath.oxsm1 set
21: [oxpath.oxlog] getPathNameSm1 /oxpath.oxlog set
22: /oxpath.oxlog.xterm [oxpath.oxlog ( ) oxpath.xterm] cat def
23: } def
24:
25: %% Execute this macro, then xterm will not be executed and the output
26: %% will be redirected to /dev/null.
27: /oxNoX {
28: /oxpath.null oxpath.null00 def
29: /oxpath.oxlog.xterm [oxpath.oxlog ( )] cat def
30: (oxpath.oxlog.xterm is set to ) messagen
31: oxpath.oxlog.xterm message
32: } def
33:
34: /ox.ccc.init { ox.ccc ( [(oxPrintMessage) 0] extension pop ) oxsubmit } def
35:
36: /ox.verbose 0 def
37: /ox.version (2.981105) def
38: ox.version [(Version)] system_variable gt
39: { (This package requires the latest version of kan/sm1) message
40: (Please get it from http://www.math.kobe-u.ac.jp/KAN) message
41: error
42: } { } ifelse
43: (ox.sm1, --- open sm1 protocol module 10/1,1999 (C) N.Takayama. oxhelp for help) message-quiet
44:
45: /ox.ccc load isArray
46: { }
47: { /ox.ccc [ ] def } ifelse
48:
49:
50:
51: /ox.logsize 10 def
52: /ox.log [1 1 ox.logsize {pop 0} for ] def
53: /ox.mod { dup ox.logsize idiv ox.logsize mul sub } def
54: /ox.takelog 1 def
55:
56: /SM_executeStringByLocalParser 268 def
57: /SM_execute 268 def
58: /SM_popString 263 def
59: /SM_mathcap 264 def
60:
61: /SM_popCMO 262 def
62: /SM_executeFunction 269 def
63: /SM_DUMMY_sendcmo 280 def
64: /SM_sync_ball 281 def
65:
66: /SM_pops 265 def
67: /SM_setName 266 def
68: /SM_evalName 267 def
69:
70: /SM_setMathCap 273 def
71:
72: /SM_getsp 275 def
73: /SM_dupErrors 276 def
74:
75: /SM_control_kill 1024 def
76: /SM_control_reset_connection 1030 def
77:
78: /Etag_error 257 def
79:
80: /enginesList [
81: [(localhost) 1300 1200]
82: [(localhost) 2300 2200]
83: ] def
84: %% cf. startengines
85: /enginesList.2 [
86: [(dc1) 1300 1200]
87: [(dc2) 2300 2200]
88: ] def
89: %% cf. se12
90:
91: /oxconnect {
92: /arg1 set
93: [(oxCreateClient) arg1 aload pop] extension
94: } def
95: [(oxconnect)
96: [([hostname data-port control-port] oxconnect pid)
97: (oxconnect is used to connect this to a server on the hostname with data-port)
98: (and control-port)
99: (Example 1: ox -ox ox_sm1 -data 1300 -control 1200 <== on server.)
100: ( [$localhost$ 1300 1200] oxconnect /ox.ccc set <== on client.)
101: (Example 2: ox -ox ox_sm1 -host s.OpenXM.org -insecure -data 1300 -control 1200 <== on server.)
102: ( [$s.OpenXM.org$ 1300 1200] oxconnect /ox.ccc set <== on client.)
103: (Example 3: ox -ox ox_sm1 -data 1300 -control 1200 >& /dev/null &<== on server.)
104: ( [$localhost$ 1300 1200] oxconnect /ox.ccc set <== on client.)
105: ( cf. oxNoX)
106: (See also ox)
107: ]
108: ] putUsages
109:
110: [(ox)
111: [
112: (client aa oxpushcmo (oxsendcmo), client oxpopcmo dd, client popstring dd, client ss oxrpc)
113: (Example: ox.ccc [1 2 3] oxpushcmo ox.ccc oxpopcmo /ff set ff :: )
114: ( )
115: (client ss oxexecutestring(oxsubmit) <<executeString>>, client ss oxexec <<executeFunction>>)
116:
117: (Example: ox.ccc (0 1 10 { pop $Hello$ message } for) oxexecutestring )
118: (Example: ox.ccc (2).. oxpushcmo ox.ccc (10).. oxpushcmo )
119: ( ox.ccc (power) oxexec ox.ccc oxpopcmo :: )
120: ( )
121: (client str oxevalname, client str oxsetname, client num oxpops, client oxget)
122: ( )
123: (client oxmathcap, client oxsetmathcap, oxgenportfile, oxremoveportfile)
124: ( )
125: (client oxgetsp --- get stack pointer, client oxgeterrors --- get all errors)
126: (cleint oxisData, client oxreset, client oxshutdown)
127: (oxhelp for this message, [(oxWatch) client] extension to start a log.)
128: ([(oxSerial)] extension serial-number-of-out-going-ox-packet.)
129: (oxpopcmo1, oxpopcmo2, sm1connect2, sm1connect3)
130: (sm1connectr )
131: (oxNoX : set an environment to invoke oxlog without xterm and to call oxlog with >& /dev/null)
132: $ ex 1. (ox.sm1) run oxNoX sm1connectr $
133: $ ex 2. (oxasir.sm1) run oxNoX (x^2-1). fctr pmat ; $
134: ]
135: ] putUsages
136:
137: /oxhelp {
138: (oxconnect) usage
139: ( ) message
140: (ox) usage
141: } def
142: [(oxhelp)
143: [(oxhelp outputs help messages for ox commands.)
144: ]] putUsages
145:
146: ox.verbose { oxhelp } { } ifelse
147:
148: /sm1connect2 {
149: [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1
150: oxpath.null
151: ( &)] cat system
152: % (kterm -iconic -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_sm1 &) system
153: % For MSRI, or Eterm,
154: %(xterm -icon -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_sm1 &) system
155: (If you start the server automatically, you may have a trouble to) message
156: (oxreset. In order to avoid this trouble, start the server by hand.) message
157: (sleep 5) system
158: [(localhost) 1300 1200] oxconnect /ox.ccc set
159: (The server is binded to the variable ox.ccc) message
160: ox.ccc.init
161: } def
162:
163: /sm1connect3 {
164: [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1
165: ( -data 2300 -control 2200 )
166: oxpath.null
167: ( &)] cat system
168: % (kterm -iconic -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_sm1 -data 2300 -control 2200 &) system
169: % For MSRI
170: %(xterm -icon -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_sm1 -data 2300 -control 2200&) system
171: (If you start the server automatically, you may have a trouble to) message
172: (oxreset. In order to avoid this trouble, start the server by hand.) message
173: (sleep 5) system
174: [(localhost) 2300 2200] oxconnect /ox.ccc2 set
175: (The server is binded to the variable ox.ccc2) message
176: } def
177:
178: /sm1connect4 {
179: %% test version.
180: /ox.ccc.portfile oxgenportfile def
181: [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1
182: ( -portfile ) ox.ccc.portfile
183: oxpath.null
184: ( &)] cat system
185: (sleep 5) system
186: [(oxReadPortFile) ox.ccc.portfile] extension /ox.ccc.control set
187: ox.ccc.control message
188: [(localhost) ox.ccc.control 1200] /ox.ccc set
189: (The server is binded to the variable ox.ccc) message
190: oxremoveportfile
191: } def
192:
193: /oxpushcmo { oxsendcmo } def
194: /oxsendcmo {
195: /arg1 set
196: /arg2 set
197: ox.takelog { ox.log [(oxSerial)] extension ox.mod arg1 put
198: } { } ifelse
199: [(oxReq) arg2 SM_DUMMY_sendcmo arg1] extension pop
200: } def
201:
202: /oxpopcmo {
203: /arg1 set
204: [(oxReq) arg1 SM_popCMO ] extension pop
205: [(oxGet) arg1] extension
206: } def
207:
208: /oxgetsp {
209: /arg1 set
210: [(oxReq) arg1 SM_getsp ] extension pop
211: [(oxReq) arg1 SM_popCMO ] extension pop
212: [(oxGet) arg1] extension
213: } def
214:
215: /oxgeterrors {
216: /arg1 set
217: [(oxReq) arg1 SM_dupErrors ] extension pop
218: [(oxReq) arg1 SM_popCMO ] extension pop
219: [(oxGet) arg1] extension
220: } def
221:
222: /oxmathcap0 {
223: /arg1 set
224: [(oxReq) arg1 SM_mathcap ] extension pop
225: } def
226: /oxmathcap {
227: /arg1 set
228: [/in-oxmathcap /mypeer /mmm] pushVariables
229: [ /mypeer arg1 def
230: mypeer oxmathcap0
231: mypeer oxpopcmo /mmm set
232: mypeer 10 mmm put %% set math cap.
233: ] pop
234: popVariables
235: } def
236: /oxsetmathcap {
237: /arg1 set
238: [/in-oxsetmathcap /mypeer /mymathcap] pushVariables
239: [
240: /mypeer arg1 def
241: /mymathcap [(cmoMathCap)] extension (array) dc def
242: [(oxReq)
243: mypeer SM_setMathCap
244: mymathcap
245: ] extension pop
246: ] pop
247: popVariables
248: } def
249: /oxsetmathcap.old {
250: /arg1 set
251: [(oxReq)
252: arg1 SM_setMathCap
253: [(mathcap-object)
254: [[199901160 (sm1)]
255: [2130706434 , 1 , 2 , 4 , 17 , 19 , 20 , 22 , 23 , 24 , 25 , 26 , 30 ]
256: %% mathcap for sm1.
257: %% [1 2 3 4 5] %% for test. cf. cmoCheckMathCap, Sm1_mathcap()
258: ]
259: ] %% Never write a broken data here.
260: ] extension pop
261: } def
262: /oxpopcmo1 { %% ask of the transmission.
263: /arg1 set
264: [(oxReq) arg1 SM_popCMO ] extension pop
265: } def
266: /oxpopcmo2 { %% wait the data.
267: /arg1 set
268: [(oxGet) arg1] extension
269: } def
270:
271:
272: /oxpopstring {
273: /arg1 set
274: [(oxReq) arg1 SM_popString ] extension pop
275: [(oxGet) arg1] extension
276: } def
277:
278: /oxrpc {
279: /arg1 set
280: /arg2 set
281: [/ans /ff] pushVariables
282: [
283: /ff arg2 def
284: ox.takelog { ox.log [(oxSerial)] extension ox.mod arg1 put
285: ox.log [(oxSerial)] extension 1 add ox.mod (executeString) put
286: } { } ifelse
287: [(oxReq) ff SM_execute arg1] extension pop
288: [(oxReq) ff SM_popCMO] extension pop
289: [(oxGet) ff] extension /ans set
290: ans etag Etag_error eq {
291: (Got an error object.) message
292: /arg1 ans def
293: }
294: { /arg1 ans def
295: } ifelse
296: ] pop
297: popVariables
298: arg1
299: } def
300:
301: /oxexecutestring { oxsubmit } def
302: /oxsubmit {
303: /arg1 set
304: /arg2 set
305: ox.takelog { ox.log [(oxSerial)] extension ox.mod arg1 put
306: ox.log [(oxSerial)] extension 1 add ox.mod (executeString) put
307: } { } ifelse
308: [(oxReq) arg2 SM_execute arg1] extension pop
309: } def
310:
311: /oxexec {
312: /arg1 set
313: /arg2 set
314: ox.takelog { ox.log [(oxSerial)] extension ox.mod arg1 put
315: ox.log [(oxSerial)] extension 1 add ox.mod (executeFunction) put
316: } { } ifelse
317: [(oxReq) arg2 SM_executeFunction arg1] extension pop
318: } def
319: /oxsubmit2 {
320: oxexec
321: } def
322:
323: /oxpops {
324: /arg1 set
325: /arg2 set
326: [(oxReq) arg2 SM_pops arg1] extension pop
327: } def
328:
329: /oxsetname {
330: /arg1 set
331: /arg2 set
332: [(oxReq) arg2 SM_setName arg1] extension pop
333: } def
334:
335: /oxevalname {
336: /arg1 set
337: /arg2 set
338: [(oxReq) arg2 SM_evalName arg1] extension pop
339: } def
340:
341:
342: /oxreset {
343: /arg1 set
344: [(oxReq) arg1 SM_control_reset_connection] extension pop
345: [(oxGetFromControl) arg1 ] extension pop
346: [(oxGet) arg1] extension message
347: } def
348:
349: /oxisData {
350: /arg1 set
351: [/pp /ff] pushVariables
352: [
353: /ff arg1 def
354: [(oxMultiSelect) [ff] 10] extension /pp set
355: pp message
356: pp 0 get 1 eq {
357: pp 1 get 0 get 1 eq { %% data is in the data stream.
358: /arg1 [(oxGet) ff] extension def
359: } {/arg1 (no data) def } ifelse
360: }
361: { /arg1 (no data) def }
362: ifelse
363: ] pop
364: popVariables
365: arg1
366: } def
367:
368: /oxget {
369: oxisData
370: } def
371:
372:
373: /oxshutdown {
374: /arg1 set
375: [(fp2fclose) arg1 1 get] extension
376: [(oxReq) arg1 SM_control_kill] extension
377: arg1 0 (closed) put
378: } def
379:
380: /oxgenportfile {
381: [(oxGenPortFile)] extension
382: }def
383: /oxremoveportfile {
384: [(oxRemovePortFile)] extension
385: }def
386:
387: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388: /enginescmd
389: $ /computesp {
390: /arg1 set
391: [arg1 myid] arg1 message
392: } def
393: $
394: def
395:
396:
397: /genPairs {
398: /arg1 set
399: [/n /i /j] pushVariables
400: [
401: /n arg1 def
402: /genPairs.list [ ] def
403: /genPairs.i 0 def
404: 0 1 n 1 sub {
405: /i set
406: i 1 add 1 n 1 sub {
407: /j set
408: genPairs.list [i j] append /genPairs.list set
409: } for
410: } for
411: /genPairs.n genPairs.list length def
412: ] pop
413: popVariables
414: } def
415:
416: /getPair {
417: [/i ] pushVariables
418: [
419: genPairs.i genPairs.n lt {
420: genPairs.list genPairs.i get /ans set
421: genPairs.i 1 add /genPairs.i set
422: }
423: { [-1 -1] /ans set} ifelse
424: /arg1 ans def
425: ] pop
426: popVariables
427: arg1
428: } def
429:
430: /sumUp {
431: /arg1 set
432: [/ans /v /i /n] pushVariables
433: [
434: /v arg1 def
435: /n v length def
436: /ans 0 def
437: 0 1 n 1 sub {
438: /i set
439: ans v i get add /ans set
440: } for
441: /arg1 ans def
442: ] pop
443: popVariables
444: arg1
445: } def
446:
447:
448: /dist {
449: /dist.debug 0 def
450: /result [ ] def
451: enginesList {oxconnect} map /engines set
452: /enginesN engines length def
453: % broadcast the program.
454: (ox-1.sm1) pushfile /enginescmd set %% read a file.
455: [(parse) enginescmd] extension
456: engines {enginescmd oxsubmit} map
457: engines { (slave-start) oxsubmit} map %% initialize slave codes.
458: %% send pid.
459: 0 1 enginesN 1 sub {
460: /i set
461: engines i get i oxsendcmo
462: engines i get (/myid set) oxsubmit
463: } for
464:
465: master-start %% initialize master codes
466: %% gbsize genPairs %% obsolete
467: /gbsize ans length def
468: ans makePairs /genPairs.list set
469: /genPairs.i 0 def /genPairs.n genPairs.list length def
470:
471:
472: /exhausted 0 def
473: % clear the busy flag.
474: /busy [1 1 enginesN { pop 0 } for ] def
475: (date) system
476: {{
477: exhausted 0 eq {
478: 0 1 enginesN 1 sub {
479: /i set
480: busy i get 0 eq {
481: getPair /p set
482: p 0 get -1 eq {/exhausted 1 def exit} { } ifelse
483: busy i 1 put
484: engines i get p oxsendcmo
485: engines i get ( computesp ) oxsubmit
486: engines i get oxpopcmo1
487: } { } ifelse
488: } for
489: } { } ifelse
490: dist.debug { (busy=) messagen busy message } { } ifelse
491: busy sumUp 0 eq { result message exit error } { } ifelse
492: [(oxMultiSelect) engines -1] extension /status set
493: /datastatus status 1 get def
494: dist.debug { (datastatus=) messagen datastatus message } { } ifelse
495: 0 1 enginesN 1 sub {
496: /i set
497: datastatus i get 1 eq {
498: engines i get oxpopcmo2 /ans set
499: busy i 0 put
500: result ans append /result set
501: } { } ifelse
502: } for
503: } loop } timer
504: (date) system
505: (result is in result) message
506: (Number of s-pairs checked is ) messagen result length message
507: } def
508:
509: ox.verbose {
510: (dist for experiments for distributed computing. cf. startengines) message
511: } { } ifelse
512:
513: /oxIsServerReady {
514: /arg1 set
515: [/in-isServerReady /sdata /ans] pushVariables
516: [
517: /sdata arg1 def
518: /ans 0 def
519: sdata isArray {
520: sdata length 1 gt {
521: sdata 0 get (client) eq { /ans 1 def } { } ifelse
522: } { } ifelse
523: } { } ifelse
524: /arg1 ans def
525: ] pop
526: popVariables
527: arg1
528: } def
529:
530:
531: %%%%%%%%%%%%%%% tests
532: ox.verbose {
533: (test10 : test to read and write ox-data and ox-command to a file) message
534: } { } ifelse
535:
536: /test10 {
537: [(oxCreateClientFile) (afo) (w)] extension /ccc set
538: [(oxWatch) ccc] extension
539: ccc (x-1). oxsendcmo
540: [(oxReq) ccc SM_executeStringByLocalParser
541: ( dup add message )] extension pop
542: ccc (quit) oxsendcmo
543:
544: [(oxCloseClient) ccc] extension
545: } def
546:
547: /test11 {
548: [(oxCreateClientFile) (afo) (r)] extension /ccc set
549: [(oxGet) ccc] extension ::
550: [(oxGet) ccc] extension ::
551: } def
552:
553: ox.verbose {
554: (test12 : ccc is the client. ff poly in Q<x,y,z,dx,dy,dz> ) message
555: } { } ifelse
556: /test12 {
557: [(localhost) 1300 1200] oxconnect /ccc set
558: [(x,y,z) ring_of_differential_operators ( ) elimination_order 0] define_ring
559: (x+y). /ff set
560: /eee (hello) (error) dc def
561: /eee0 eee (error) dc def
562: (eee is the CMO_ERROR2 object [CMO_ERROR2 hello], eee0 is the CMO_ERROR object) message
563: } def
564:
565: /sm1connectr {
566: [/in-sm1connectr /pass /peer /data /control ] pushVariables
567: [
568: /pass [(oxGenPass)] extension def
569: /peer [(oxGetPort) (localhost)] extension def
570: /data peer 1 get toString def
571: /control peer 3 get toString def
572: peer message
573: [oxpath.oxlog.xterm oxpath.ox ( -reverse -ox ) oxpath.oxsm1
574: ( -data ) data ( -control ) control ( -pass ) pass
575: oxpath.null
576: ( &)] cat system
577: [(oxCreateClient2) peer 0 pass] extension /ox.ccc set
578: %% 0 means connect from only localhost.
579: (The server is binded to the variable ox.ccc) message
580: ox.ccc.init
581: ] pop
582: popVariables
583: } def
584:
585: /addSlash {
586: /arg1 set
587: [/in-addSlash /ss /aaa /ans] pushVariables
588: [
589: /ss arg1 def
590: ss (array) dc /aaa set
591: aaa length 0 eq {
592: /ans (/) def
593: }{
594: aaa aaa length 1 sub get 47 eq %% The last equals / ?
595: {
596: /ans ss def
597: }{
598: /ans [ss (/)] cat def
599: } ifelse
600: } ifelse
601: /arg1 ans def
602: ] pop
603: arg1
604: } def
605:
606: /getPathNameSm1 {
607: /arg1 set
608: [/in-getPathNameSm1 /fname /fullname /tname] pushVariables
609: [
610: /fname arg1 0 get def
611: %% If fullname is given, use it.
612: fname (array) dc 0 get
613: (/) (array) dc 0 get eq
614: { /fullname fname def
615: /getPathNameSm1.LLL goto
616: } { } ifelse
617:
618: %% Else first try to find it in LOAD_SM1_PATH
619: [(getenv) (LOAD_SM1_PATH)] extension /tname set
620: tname isString
621: {
622: tname addSlash /tname set
623: [(stat) [tname fname] cat] extension
624: 0 get isInteger %% The file was found.
625: { /fullname [tname fname] cat def
626: /getPathNameSm1.LLL goto
627: } { } ifelse
628: } { } ifelse
629:
630: %% Else try to find it in /usr/local/lib/sm1
631: [(stat) [(/usr/local/lib/sm1/) fname] cat] extension
632: 0 get isInteger %% The file was found.
633: { /fullname [(/usr/local/lib/sm1/) fname] cat def
634: /getPathNameSm1.LLL goto
635: } { } ifelse
636:
637: %% Otherwise error.
638: [(getPathNameSm1: The file ) fname
639: ( could not be found )
640: (neigher in LOAD_SM1_PATH=)
641: [(getenv) (LOAD_SM1_PATH)] extension
642: ( nor in /usr/local/lib/sm1)
643: ] cat /getPathNameSm1.errorMessage set
644: getPathNameSm1.errorMessage message
645: ] pop popVariables getPathNameSm1.errorMessage error
646:
647: /getPathNameSm1.LLL
648: /arg1 fullname def
649: ] pop
650: popVariables
651: arg1
652: } def
653: [(getPathNameSm1)
654: [([fname] getPathNameSm1 fullname)
655: (string fname, fullname)
656: (This command searches the fname in /usr/local/lib/sm1 and LOAD_SM1_PATH)
657: (and returns the fullname.)
658: ]] putUsages
659:
660: /getPathNameAsir {
661: /arg1 set
662: [/in-getPathNameAsir /fname /fullname /tname] pushVariables
663: [
664: /fname arg1 0 get def
665: %% If fullname is given, use it.
666: fname (array) dc 0 get
667: (/) (array) dc 0 get eq
668: { /fullname fname def
669: /getPathNameAsir.LLL goto
670: } { } ifelse
671:
672: %% Else first try to find it in /usr/local/lib/asir
673: [(stat) [(/usr/local/lib/asir/) fname] cat] extension
674: 0 get isInteger %% The file was found.
675: { /fullname [(/usr/local/lib/asir/) fname] cat def
676: /getPathNameAsir.LLL goto
677: } { } ifelse
678:
679: %% Else try to find it in ASIR_LIBDIR
680: [(getenv) (ASIR_LIBDIR)] extension /tname set
681: tname isString
682: {
683: [(stat) [tname (/) fname] cat] extension
684: 0 get isInteger %% The file was found.
685: { /fullname [tname (/) fname] cat def
686: /getPathNameAsir.LLL goto
687: } { } ifelse
688:
689: } { } ifelse
690:
691: %% Otherwise error.
692: [ (getPathNameAsir: The file ) fname
693: ( could not be found )
694: (neigher in /usr/local/lib/asir nor in ASIR_LIBDIR. )
695: ] cat /getPathNameAsir.errorMessage set
696: getPathNameAsir.errorMessage message
697: ] pop popVariables getPathNameAsir.errorMessage error
698:
699: /getPathNameAsir.LLL
700: /arg1 fullname def
701: ] pop
702: popVariables
703: arg1
704: } def
705: [(getPathNameAsir)
706: [([fname] getPathNameAsir fullname)
707: (string fname, fullname)
708: (This command searches the fname in /usr/local/lib/asir and ASIR_LIBDIR)
709: (and returns the fullname.)
710: ]] putUsages
711:
712:
713:
714: initializePathNamesForOx %% This should be
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>