|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8: CHAPTER 5
9:
10:
11: Input/Output
12:
13:
14:
15:
16: The following functions are used to read from and write
17: to external devices (e.g. files) and programs (through
18: pipes). All I/O goes through the lisp data type called the
19: port. A port may be open for either reading or writing, but
20: usually not both simultaneously (see _f_i_l_e_o_p_e_n ). There are
21: only a limited number of ports (20) and they will not be
22: reclaimed unless they are _c_l_o_s_ed. All ports are reclaimed
23: by a _r_e_s_e_t_i_o call, but this drastic step won't be necessary
24: if the program closes what it uses.
25:
26: If a port argument is not supplied to a function which
27: requires one or if a bad port argument (such as nil) is
28: given, then FRANZ LISP will use the default port according
29: to this scheme: If input is being done then the default port
30: is the value of the symbol piport and if output is being
31: done then the default port is the value of the symbol
32: poport. Furthermore, if the value of piport or poport is
33: not a valid port, then the standard input or standard output
34: will be used, respectively.
35:
36: The standard input and standard output are usually the
37: keyboard and terminal display unless your job is running in
38: the background and its input or output is connected to a
39: pipe. All output which goes to the standard output will
40: also go to the port ptport if it is a valid port. Output
41: destined for the standard output will not reach the standard
42: output if the symbol ^w is non nil (although it will still
43: go to ptport if ptport is a valid port).
44:
45: Some of the functions listed below reference files
46: directly. FRANZ LISP has borrowed a convenient shorthand
47: notation from /_b_i_n/_c_s_h, concerning naming files. If a file
48: name begins with ~ (tilde), and the symbol tilde-expansion
49:
50: is bound to something other than nil, then FRANZ LISP
51: expands the file name. It takes the string of characters
52: between the leading tilde, and the first slash as a user-
53: name. Then, that initial segment of the filename is
54: replaced by the home directory of the user. The null user-
55: name is taken to be the current user.
56:
57: Having gone to the effort of searching the password
58: file, FRANZ LISP remembers the user directory, in case it
59: gets asked to do so again. Tilde-expansion is performed in
60: the following functions: _c_f_a_s_l, _c_h_d_i_r, _f_a_s_l, _f_f_a_s_l,
61:
62:
63: Input/Output 5-1
64:
65:
66:
67:
68:
69:
70:
71: Input/Output 5-2
72:
73:
74: _f_i_l_e_o_p_e_n, _i_n_f_i_l_e, _l_o_a_d, _o_u_t_f_i_l_e, _p_r_o_b_e_f, _s_y_s:_a_c_c_e_s_s,
75: _s_y_s:_u_n_l_i_n_k.
76:
77: (cfasl 'st_file 'st_entry 'st_funcname ['st_disc
78: ['st_library]])
79:
80: RETURNS: t
81:
82: SIDE EFFECT: This is used to load in a foreign function
83: (see 8.4). The object file st_file is
84: loaded into the lisp system. St_entry
85: should be an entry point in the file just
86: loaded. The function binding of the sym-
87: bol s_funcname will be set to point to
88: st_entry, so that when the lisp function
89: s_funcname is called, st_entry will be
90: run. st_disc is the discipline to be
91: given to s_funcname. st_disc defaults to
92: "subroutine" if it is not given or if it
93: is given as nil. If st_library is non-
94: null, then after st_file is loaded, the
95: libraries given in st_library will be
96: searched to resolve external references.
97: The form of st_library should be something
98: like "-lS -lm". The C library (" -lc " )
99: is always searched so when loading in a C
100: file you probably won't need to specify a
101: library. For Fortran files, you should
102: specify "-lF77" and if you are doing any
103: I/O, the library entry should be "-lI77
104: -lF77". For Pascal files "-lpc" is
105: required.
106:
107: NOTE: This function may be used to load the output of
108: the assembler, C compiler, Fortran compiler, and
109: Pascal compiler but NOT the lisp compiler (use
110: _f_a_s_l for that). If a file has more than one
111: entry point, then use _g_e_t_a_d_d_r_e_s_s to locate and
112: setup other foreign functions.
113: It is an error to load in a file which has a glo-
114: bal entry point of the same name as a global
115: entry point in the running lisp. As soon as you
116: load in a file with _c_f_a_s_l, its global entry
117: points become part of the lisp's entry points.
118: Thus you cannot _c_f_a_s_l in the same file twice
119: unless you use _r_e_m_o_v_e_a_d_d_r_e_s_s to change certain
120: global entry points to local entry points.
121:
122:
123:
124:
125:
126: 9
127:
128: 9 Printed: July 25, 1983
129:
130:
131:
132:
133:
134:
135:
136: Input/Output 5-3
137:
138:
139: (close 'p_port)
140:
141: RETURNS: t
142:
143: SIDE EFFECT: the specified port is drained and closed,
144: releasing the port.
145:
146: NOTE: The standard defaults are not used in this case
147: since you probably never want to close the stan-
148: dard output or standard input.
149:
150: (cprintf 'st_format 'xfst_val ['p_port])
151:
152: RETURNS: xfst_val
153:
154: SIDE EFFECT: The UNIX formatted output function printf
155: is called with arguments st_format and
156: xfst_val. If xfst_val is a symbol then
157: its print name is passed to printf. The
158: format string may contain characters which
159: are just printed literally and it may con-
160: tain special formatting commands preceded
161: by a percent sign. The complete set of
162: formatting characters is described in the
163: UNIX manual. Some useful ones are %d for
164: printing a fixnum in decimal, %f or %e for
165: printing a flonum, and %s for printing a
166: character string (or print name of a sym-
167: bol).
168:
169: EXAMPLE: (_c_p_r_i_n_t_f "_P_i _e_q_u_a_l_s %_f" _3._1_4_1_5_9) prints `Pi
170: equals 3.14159'
171:
172: (drain ['p_port])
173:
174: RETURNS: nil
175:
176: SIDE EFFECT: If this is an output port then the charac-
177: ters in the output buffer are all sent to
178: the device. If this is an input port then
179: all pending characters are flushed. The
180: default port for this function is the
181: default output port.
182:
183:
184:
185:
186:
187:
188:
189:
190:
191: 9
192:
193: 9 Printed: July 25, 1983
194:
195:
196:
197:
198:
199:
200:
201: Input/Output 5-4
202:
203:
204: (ex [s_filename])
205: (vi [s_filename])
206: (exl [s_filename])
207: (vil [s_filename])
208:
209: RETURNS:
210:
211: SIDE EFFECT: The lisp system starts up an editor on the
212: file named as the argument. It will try
213: appending .l to the file if it can't find
214: it. The functions _e_x_l and _v_i_l will load
215: the file after you finish editing it.
216: These functions will also remember the
217: name of the file so that on subsequent
218: invocations, you don't need to provide the
219: argument.
220:
221: NOTE: These functions do not evaluate their argument.
222:
223: (fasl 'st_name ['st_mapf ['g_warn]])
224:
225: WHERE: st_mapf and g_warn default to nil.
226:
227: RETURNS: t if the function succeeded, nil otherwise.
228:
229: SIDE EFFECT: this function is designed to load in an
230: object file generated by the lisp compiler
231: Liszt. File names for object files usu-
232: ally end in `.o', so _f_a_s_l will append `.o'
233: to st_name (if it is not already present).
234: If st_mapf is non nil, then it is the name
235: of the map file to create. _F_a_s_l writes in
236: the map file the names and addresses of
237: the functions it loads and defines. Nor-
238: mally the map file is created (i.e. trun-
239: cated if it exists), but if
240: (_s_s_t_a_t_u_s _a_p_p_e_n_d_m_a_p _t) is done then the map
241: file will be appended. If g_warn is non
242: nil and if a function is loaded from the
243: file which is already defined, then a
244: warning message will be printed.
245:
246: NOTE: _f_a_s_l only looks in the current directory for the
247: file to load. The function _l_o_a_d looks through a
248: user-supplied search path and will call _f_a_s_l if
249: it finds a file with the same root name and a
250: `.o' extension. In most cases the user would be
251: better off using the function _l_o_a_d rather than
252: calling _f_a_s_l directly.
253:
254:
255:
256: 9
257:
258: 9 Printed: July 25, 1983
259:
260:
261:
262:
263:
264:
265:
266: Input/Output 5-5
267:
268:
269: (ffasl 'st_file 'st_entry 'st_funcname ['st_discipline
270: ['st_library]])
271:
272: RETURNS: the binary object created.
273:
274: SIDE EFFECT: the Fortran object file st_file is loaded
275: into the lisp system. St_entry should be
276: an entry point in the file just loaded. A
277: binary object will be created and its
278: entry field will be set to point to
279: st_entry. The discipline field of the
280: binary will be set to st_discipline or
281: "subroutine" by default. If st_library is
282: present and non-null, then after st_file
283: is loaded, the libraries given in
284: st_library will be searched to resolve
285: external references. The form of
286: st_library should be something like "-lS
287: -ltermcap". In any case, the standard
288: Fortran libraries will be searched also to
289: resolve external references.
290:
291: NOTE: in F77 on Unix, the entry point for the fortran
292: function foo is named `_foo_'.
293:
294: (filepos 'p_port ['x_pos])
295:
296: RETURNS: the current position in the file if x_pos is
297: not given or else x_pos if x_pos is given.
298:
299: SIDE EFFECT: If x_pos is given, the next byte to be
300: read or written to the port will be at
301: position x_pos.
302:
303: (filestat 'st_filename)
304:
305: RETURNS: a vector containing various numbers which the
306: UNIX operating system assigns to files. if
307: the file doesn't exist, an error is invoked.
308: Use _p_r_o_b_e_f to determine if the file exists.
309:
310: NOTE: The individual entries can be accesed by mnemonic
311: functions of the form filestat:_f_i_e_l_d, where field
312: may be any of atime, ctime, dev, gid, ino,
313: mode,mtime, nlink, rdev, size, type, uid. See
314: the UNIX programmers manual for a more detailed
315: description of these quantities.
316:
317:
318:
319:
320:
321: 9
322:
323: 9 Printed: July 25, 1983
324:
325:
326:
327:
328:
329:
330:
331: Input/Output 5-6
332:
333:
334: (flatc 'g_form ['x_max])
335:
336: RETURNS: the number of characters required to print
337: g_form using _p_a_t_o_m. If x_max is given, and if
338: _f_l_a_t_c determines that it will return a value
339: greater than x_max, then it gives up and
340: returns the current value it has computed.
341: This is useful if you just want to see if an
342: expression is larger than a certain size.
343:
344: (flatsize 'g_form ['x_max])
345:
346: RETURNS: the number of characters required to print
347: g_form using _p_r_i_n_t. The meaning of x_max is
348: the same as for flatc.
349:
350: NOTE: Currently this just _e_x_p_l_o_d_e's g_form and checks
351: its length.
352:
353: (fileopen 'st_filename 'st_mode)
354:
355: RETURNS: a port for reading or writing (depending on
356: st_mode) the file st_name.
357:
358: SIDE EFFECT: the given file is opened (or created if
359: opened for writing and it doesn't yet
360: exist).
361:
362: NOTE: this function call provides a direct interface to
363: the operating system's fopen function. The mode
364: may be more than just "r" for read, "w" for write
365: or "a" for append. The modes "r+", "w+" and "a+"
366: permit both reading and writing on a port pro-
367: vided that _f_s_e_e_k is done between changes in
368: direction. See the UNIX manual description of
369: fopen for more details. This routine does not
370: look through a search path for a given file.
371:
372: (fseek 'p_port 'x_offset 'x_flag)
373:
374: RETURNS: the position in the file after the function is
375: performed.
376:
377: SIDE EFFECT: this function positions the read/write
378: pointer before a certain byte in the file.
379: If x_flag is 0 then the pointer is set to
380: x_offset bytes from the beginning of the
381: file. If x_flag is 1 then the pointer is
382: set to x_offset bytes from the current
383: location in the file. If x_flag is 2 then
384: the pointer is set to x_offset bytes from
385: the end of the file.
386: 9
387:
388: 9 Printed: July 25, 1983
389:
390:
391:
392:
393:
394:
395:
396: Input/Output 5-7
397:
398:
399: (infile 's_filename)
400:
401: RETURNS: a port ready to read s_filename.
402:
403: SIDE EFFECT: this tries to open s_filename and if it
404: cannot or if there are no ports available
405: it gives an error message.
406:
407: NOTE: to allow your program to continue on a file-not-
408: found error, you can use something like:
409: (_c_o_n_d ((_n_u_l_l (_s_e_t_q _m_y_p_o_r_t (_c_a_r (_e_r_r_s_e_t (_i_n_f_i_l_e
410: _n_a_m_e) _n_i_l))))
411: (_p_a_t_o_m '"_c_o_u_l_d_n'_t _o_p_e_n _t_h_e _f_i_l_e")))
412: which will set myport to the port to read from if
413: the file exists or will print a message if it
414: couldn't open it and also set myport to nil. To
415: simply determine if a file exists, there is a
416: function named _p_r_o_b_e_f.
417:
418: (load 's_filename ['st_map ['g_warn]])
419:
420: RETURNS: t
421:
422: NOTE: The function of _l_o_a_d has changed since previous
423: releases of FRANZ LISP and the following descrip-
424: tion should be read carefully.
425:
426: SIDE EFFECT: _l_o_a_d now serves the function of both _f_a_s_l
427: and the old _l_o_a_d. _L_o_a_d will search a user
428: defined search path for a lisp source or
429: object file with the filename s_filename
430: (with the extension .l or .o added as
431: appropriate). The search path which _l_o_a_d
432: uses is the value of (_s_t_a_t_u_s _l_o_a_d-_s_e_a_r_c_h-
433: _p_a_t_h). The default is (|.| /usr/lib/lisp)
434: which means look in the current directory
435: first and then /usr/lib/lisp. The file
436: which _l_o_a_d looks for depends on the last
437: two characters of s_filename. If
438: s_filename ends with ".l" then _l_o_a_d will
439: only look for a file name s_filename and
440: will assume that this is a FRANZ LISP
441: source file. If s_filename ends with ".o"
442: then _l_o_a_d will only look for a file named
443: s_filename and will assume that this is a
444: FRANZ LISP object file to be _f_a_s_led in.
445: Otherwise, _l_o_a_d will first look for
446: s_filename.o, then s_filename.l and
447: finally s_filename itself. If it finds
448: s_filename.o it will assume that this is
449: an object file, otherwise it will assume
450: that it is a source file. An object file
451: is loaded using _f_a_s_l and a source file is
452:
453:
454: Printed: July 25, 1983
455:
456:
457:
458:
459:
460:
461:
462: Input/Output 5-8
463:
464:
465: loaded by reading and evaluating each form
466: in the file. The optional arguments
467: st_map and g_warn are passed to _f_a_s_l
468: should _f_a_s_l be called.
469:
470: NOTE: _l_o_a_d requires a port to open the file s_filename.
471: It then lambda binds the symbol piport to this
472: port and reads and evaluates the forms.
473:
474: (makereadtable ['s_flag])
475:
476: WHERE: if s_flag is not present it is assumed to be
477: nil.
478:
479: RETURNS: a readtable equal to the original readtable if
480: s_flag is non-null, or else equal to the
481: current readtable. See chapter 7 for a
482: description of readtables and their uses.
483:
484: (msg [l_option ...] ['g_msg ...])
485:
486: NOTE: This function is intended for printing short mes-
487: sages. Any of the arguments or options presented
488: can be used any number of times, in any order.
489: The messages themselves (g_msg) are evaluated,
490: and then they are transmitted to _p_a_t_o_m. Typi-
491: cally, they are strings, which evaluate to them-
492: selves. The options are interpreted specially:
493:
494:
495: ____________________________________________________
496:
497: _m_s_g _O_p_t_i_o_n _S_u_m_m_a_r_y
498:
499: (_P _p__p_o_r_t_n_a_m_e) causes subsequent output to go to the port p_portname
500: (port should be opened previously)
501:
502: _B print a single blank.
503:
504: (_B '_n__b) evaluate n_b and print that many blanks.
505:
506: _N print a single by calling _t_e_r_p_r.
507:
508: (_N '_n__n) evaluate n_n and transmit
509: that many newlines to the stream.
510:
511: _D _d_r_a_i_n the current port.
512: ____________________________________________________
513:
514:
515:
516:
517: 9
518:
519: 9 Printed: July 25, 1983
520:
521:
522:
523:
524:
525:
526:
527: Input/Output 5-9
528:
529:
530: (nwritn ['p_port])
531:
532: RETURNS: the number of characters in the buffer of the
533: given port but not yet written out to the file
534: or device. The buffer is flushed automati-
535: cally when filled, or when _t_e_r_p_r is called.
536:
537: (outfile 's_filename ['st_type])
538:
539: RETURNS: a port or nil
540:
541: SIDE EFFECT: this opens a port to write s_filename. If
542: st_type is given and if it is a symbol or
543: string whose name begins with `a', then
544: the file will be opened in append mode,
545: that is the current contents will not be
546: lost and the next data will be written at
547: the end of the file. Otherwise, the file
548: opened is truncated by _o_u_t_f_i_l_e if it
549: existed beforehand. If there are no free
550: ports, outfile returns nil. If one cannot
551: write on s_filename, an error is sig-
552: nalled.
553:
554: (patom 'g_exp ['p_port])
555:
556: RETURNS: g_exp
557:
558: SIDE EFFECT: g_exp is printed to the given port or the
559: default port. If g_exp is a symbol or
560: string, the print name is printed without
561: any escape characters around special char-
562: acters in the print name. If g_exp is a
563: list then _p_a_t_o_m has the same effect as
564: _p_r_i_n_t.
565:
566: (pntlen 'xfs_arg)
567:
568: RETURNS: the number of characters needed to print
569: xfs_arg.
570:
571: (portp 'g_arg)
572:
573: RETURNS: t iff g_arg is a port.
574:
575:
576:
577:
578:
579:
580:
581:
582: 9
583:
584: 9 Printed: July 25, 1983
585:
586:
587:
588:
589:
590:
591:
592: Input/Output 5-10
593:
594:
595: (pp [l_option] s_name1 ...)
596:
597: RETURNS: t
598:
599: SIDE EFFECT: If s_name_i has a function binding, it is
600: pretty-printed, otherwise if s_name_i has a
601: value then that is pretty-printed. Nor-
602: mally the output of the pretty-printer
603: goes to the standard output port poport.
604: The options allow you to redirect it.
605:
606:
607: ____________________________________________________
608:
609: _P_P _O_p_t_i_o_n _S_u_m_m_a_r_y
610:
611: (_F _s__f_i_l_e_n_a_m_e) direct future printing to s_filename
612:
613: (_P _p__p_o_r_t_n_a_m_e) causes output to go to the port p_portname
614: (port should be opened previously)
615:
616: (_E _g__e_x_p_r_e_s_s_i_o_n) evaluate g_expression and don't print
617: ____________________________________________________
618:
619:
620:
621:
622: (princ 'g_arg ['p_port])
623:
624: EQUIVALENT TO: patom.
625:
626: (print 'g_arg ['p_port])
627:
628: RETURNS: nil
629:
630: SIDE EFFECT: prints g_arg on the port p_port or the
631: default port.
632:
633: (probef 'st_file)
634:
635: RETURNS: t iff the file st_file exists.
636:
637: NOTE: Just because it exists doesn't mean you can read
638: it.
639:
640:
641:
642:
643:
644:
645:
646:
647: 9
648:
649: 9 Printed: July 25, 1983
650:
651:
652:
653:
654:
655:
656:
657: Input/Output 5-11
658:
659:
660: (pp-form 'g_form ['p_port])
661:
662: RETURNS: t
663:
664: SIDE EFFECT: g_form is pretty-printed to the port
665: p_port (or poport if p_port is not given).
666: This is the function which _p_p uses. _p_p-
667: _f_o_r_m does not look for function defini-
668: tions or values of variables, it just
669: prints out the form it is given.
670:
671: NOTE: This is useful as a top-level-printer, c.f. _t_o_p-
672: _l_e_v_e_l in Chapter 6.
673:
674: (ratom ['p_port ['g_eof]])
675:
676: RETURNS: the next atom read from the given or default
677: port. On end of file, g_eof (default nil) is
678: returned.
679:
680: (read ['p_port ['g_eof]])
681:
682: RETURNS: the next lisp expression read from the given
683: or default port. On end of file, g_eof
684: (default nil) is returned.
685:
686: NOTE: An error will occur if the reader is given an ill
687: formed expression. The most common error is too
688: many right parentheses (note that this is not
689: considered an error in Maclisp).
690:
691: (readc ['p_port ['g_eof]])
692:
693: RETURNS: the next character read from the given or
694: default port. On end of file, g_eof (default
695: nil) is returned.
696:
697: (readlist 'l_arg)
698:
699: RETURNS: the lisp expression read from the list of
700: characters in l_arg.
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712: 9
713:
714: 9 Printed: July 25, 1983
715:
716:
717:
718:
719:
720:
721:
722: Input/Output 5-12
723:
724:
725: (removeaddress 's_name1 ['s_name2 ...])
726:
727: RETURNS: nil
728:
729: SIDE EFFECT: the entries for the s_name_i in the Lisp
730: symbol table are removed. This is useful
731: if you wish to _c_f_a_s_l or _f_f_a_s_l in a file
732: twice, since it is illegal for a symbol in
733: the file you are loading to already exist
734: in the lisp symbol table.
735:
736: (resetio)
737:
738: RETURNS: nil
739:
740: SIDE EFFECT: all ports except the standard input, out-
741: put and error are closed.
742:
743: (setsyntax 's_symbol 's_synclass ['ls_func])
744:
745: RETURNS: t
746:
747: SIDE EFFECT: this sets the code for s_symbol to sx_code
748: in the current readtable. If s_synclass
749: is _m_a_c_r_o or _s_p_l_i_c_i_n_g then ls_func is the
750: associated function. See Chapter 7 on
751: the reader for more details.
752:
753: (sload 's_file)
754:
755: SIDE EFFECT: the file s_file (in the current directory)
756: is opened for reading and each form is
757: read, printed and evaluated. If the form
758: is recognizable as a function definition,
759: only its name will be printed, otherwise
760: the whole form is printed.
761:
762: NOTE: This function is useful when a file refuses to
763: load because of a syntax error and you would like
764: to narrow down where the error is.
765:
766: (tab 'x_col ['p_port])
767:
768: SIDE EFFECT: enough spaces are printed to put the cur-
769: sor on column x_col. If the cursor is
770: beyond x_col to start with, a _t_e_r_p_r is
771: done first.
772:
773:
774:
775:
776:
777: 9
778:
779: 9 Printed: July 25, 1983
780:
781:
782:
783:
784:
785:
786:
787: Input/Output 5-13
788:
789:
790: (terpr ['p_port])
791:
792: RETURNS: nil
793:
794: SIDE EFFECT: a terminate line character sequence is
795: sent to the given port or the default
796: port. This will also drain the port.
797:
798: (terpri ['p_port])
799:
800: EQUIVALENT TO: terpr.
801:
802: (tilde-expand 'st_filename)
803:
804: RETURNS: a symbol whose pname is the tilde-expansion of
805: the argument, (as discussed at the beginning
806: of this chapter). If the argument does not
807: begin with a tilde, the argument itself is
808: returned.
809:
810: (tyi ['p_port])
811:
812: RETURNS: the fixnum representation of the next charac-
813: ter read. On end of file, -1 is returned.
814:
815: (tyipeek ['p_port])
816:
817: RETURNS: the fixnum representation of the next charac-
818: ter to be read.
819:
820: NOTE: This does not actually read the character, it
821: just peeks at it.
822:
823: (tyo 'x_char ['p_port])
824:
825: RETURNS: x_char.
826:
827: SIDE EFFECT: the character whose fixnum representation
828: is x_code, is printed as a on the given
829: output port or the default output port.
830:
831: (untyi 'x_char ['p_port])
832:
833: SIDE EFFECT: x_char is put back in the input buffer so
834: a subsequent _t_y_i or _r_e_a_d will read it
835: first.
836:
837: NOTE: a maximum of one character may be put back.
838:
839:
840:
841:
842: 9
843:
844: 9 Printed: July 25, 1983
845:
846:
847:
848:
849:
850:
851:
852: Input/Output 5-14
853:
854:
855: (username-to-dir 'st_name)
856:
857: RETURNS: the home directory of the given user. The
858: result is stored, to avoid unnecessarily
859: searching the password file.
860:
861: (zapline)
862:
863: RETURNS: nil
864:
865: SIDE EFFECT: all characters up to and including the
866: line termination character are read and
867: discarded from the last port used for
868: input.
869:
870: NOTE: this is used as the macro function for the semi-
871: colon character when it acts as a comment charac-
872: ter.
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907: 9
908:
909: 9 Printed: July 25, 1983
910:
911:
912:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.