Annotation of 43BSD/contrib/icon/docs/tr84-14, revision 1.1

1.1     ! root        1: .so tmac.tr
        !             2: .DA "August 22, 1984"
        !             3: .TR 84-14
        !             4: .Gr
        !             5: .TL
        !             6: Personalized Interpreters for Icon
        !             7: .AU
        !             8: Ralph E. Griswold
        !             9: .AU
        !            10: Robert K. McConeghy
        !            11: .AU
        !            12: William H. Mitchell
        !            13: .AE
        !            14: .tr *\(**
        !            15: .NH
        !            16: Introduction
        !            17: .PP
        !            18: Despite the fact that the Icon programming language has a large repertoire
        !            19: of functions and operations for string and list manipulation, as
        !            20: well as for more conventional computations [1], users frequently
        !            21: need to extend that repertoire. While many extensions can be
        !            22: written as procedures that build on the existing repertoire, there
        !            23: are some kinds of extensions for which this approach is unacceptably
        !            24: inefficient, inconvenient, or simply impractical.
        !            25: .PP
        !            26: Icon itself is written primarily in C [2] and its built-in functions
        !            27: are written as corresponding C functions. Thus the natural way to
        !            28: extend Icon's computational repertoire is to add new C functions to it.
        !            29: .PP
        !            30: The Icon system is organized so that this is comparatively easy to do.
        !            31: Adding a new function
        !            32: does not require changes to the Icon translator,
        !            33: since all functions have a common syntactic form. An entry must be made in
        !            34: a table that is used by the linker and the run-time system in order to
        !            35: identify built-in functions and connect references to them to the
        !            36: code itself.
        !            37: .PP
        !            38: The problem arises in incorporating the C code in the Icon run-time
        !            39: system. Prior to Version 5.9 of Icon, there were two separate but
        !            40: similar implementations of Icon: a compiler [3] and an interpreter [4].
        !            41: The primary difference between the two systems is that the linker for
        !            42: the compiler generates assembly-language code, while the linker
        !            43: for the interpreter generates code that is ready to be interpreted.
        !            44: The interpreter
        !            45: uses a
        !            46: preconstructed run-time
        !            47: system, so that the assembly and loading phases of the compiler implementation
        !            48: is not needed.
        !            49: .PP
        !            50: The loading phase in the compiler is quite slow, so that when the
        !            51: compiler implementation of Icon is used, there is a substantial delay
        !            52: before getting into execution. This is a significant problem during
        !            53: program debugging. Furthermore, a compiled Icon program runs only
        !            54: slightly faster than an interpreted Icon program. This is due in large part
        !            55: to the fact that most programs spend only a small percentage
        !            56: of their time in
        !            57: code generated for the program itself; most of the time is spent
        !            58: executing code in the run-time system, which is essentially the
        !            59: same in the two implementations.
        !            60: .PP
        !            61: The primary advantage of the compiler is that it is possible to
        !            62: add new functions during the loading phase. In order to communicate
        !            63: the names of new functions to the linker, it is necessary to
        !            64: include ``external'' declarations in the Icon source programs that
        !            65: use these functions. There is no way to do this in the interpreter
        !            66: implementation, since the run-time system is preconstructed, rather
        !            67: than being built when
        !            68: the source-language program is processed.
        !            69: .PP
        !            70: One disadvantage of the external function approach is that every source
        !            71: program that uses an external function must contain a declaration for
        !            72: that function. In addition to the necessity for having to remember
        !            73: these declarations, external functions are, by their nature,
        !            74: not logically part of Icon proper. This results in problems of documentation
        !            75: and distribution of such functions to other users.
        !            76: .PP
        !            77: An alternative method of adding new functions to either the
        !            78: compiler or the interpreter implementation of Icon is to
        !            79: add the corresponding C functions to the Icon system itself
        !            80: and to rebuild the entire system. This approach is impractical
        !            81: for many applications. If the extensions are not of general
        !            82: interest, it is inappropriate to include them in the public
        !            83: version of Icon. On the other hand, Icon is a large and complicated system,
        !            84: and having many private versions may create serious problems of
        !            85: maintenance and disk usage. Furthermore, rebuilding the Icon system
        !            86: is slow, cumbersome, and comparatively complicated. This approach therefore
        !            87: is impractical in a situation
        !            88: such as a class in which students implement their own versions
        !            89: of an extension.
        !            90: .PP
        !            91: To remedy these problems, a mechanism for building ``personalized
        !            92: interpreters'' has been added to Version 5.9 of Icon. This mechanism
        !            93: allows a user to add C functions and to build a corresponding
        !            94: interpreter quickly, easily, and without the necessity to have
        !            95: a copy of the source code for the entire Icon system.
        !            96: .PP
        !            97: To construct a personalized interpreter, the user must perform
        !            98: a one-time set up that copies relevant source files to a
        !            99: directory specified by the user and builds the nucleus of a run-time system. Once this is
        !           100: done, the user can add and modify C functions and include them
        !           101: in the personalized run-time system with little effort.
        !           102: .PP
        !           103: Since the linker must know the names of built-in functions,
        !           104: a personalized linker is constructed. In order to run
        !           105: Icon programs with the personalized run-time system, a
        !           106: personalized command processor, which knows the location of
        !           107: the personalized linker and run-time system, is provided also.
        !           108: .PP
        !           109: The modifications that can be made to Icon via a personalized
        !           110: interpreter essentially are limited to the run-time system: the
        !           111: addition of new functions, modifications to existing functions
        !           112: and operations, and modifications and additions to support routines. There
        !           113: is no provision for changing the syntax of Icon, incorporating
        !           114: new operators, keyword, or control structures.
        !           115: .NH
        !           116: Building and Using a Personalized Interpreter
        !           117: .NH 2
        !           118: Setting Up a Personalized Interpreter System
        !           119: .PP
        !           120: To set up a personalized interpreter, a new directory should
        !           121: be created solely for the use of the interpreter; otherwise
        !           122: files may be accidentally destroyed by the set-up process.
        !           123: For the purpose of example, suppose this directory is
        !           124: named \*Mmyicon\fR. The set-up process consists of
        !           125: .Ds
        !           126: mkdir myicon
        !           127: cd myicon
        !           128: icon\-pi
        !           129: .De
        !           130: Note that \*Micon\-pi\fR must be run in the area in which the personalized
        !           131: interpreter is to be built.
        !           132: The
        !           133: location of \*Micon\-pi\fR may vary from site to site [5].
        !           134: .PP
        !           135: The shell script \*Micon\-pi\fR constructs three subdirectories:
        !           136: \*Mh\fR, \*Mstd\fR, and \*Mpi\fR. The subdirectory \*Mh\fR
        !           137: contains header files that are needed in C routines. The subdirectory
        !           138: \*Mstd\fR contains the portions of the Icon system that are needed
        !           139: to build a personalized interpreter. The subdirectory \*Mpi\fR
        !           140: contains a \*MMakefile\fR for building a personalized interpreter
        !           141: and also is the place where source code for new C functions normally
        !           142: resides. Thus work on the personalized interpreter is done in
        !           143: \*Mmyicon/pi\fR.
        !           144: .PP
        !           145: The \*MMakefile\fR that is constructed by \*Micon\-pi\fR
        !           146: contains two definitions to facilitate building personalized
        !           147: interpreters:
        !           148: .IP \*MOBJS\fR .5i
        !           149: a list of object modules that are to be added to or replaced
        !           150: in the run-time system. \*MOBJS\fR initially is empty.
        !           151: .IP \*MLIB\fR
        !           152: a list of library options that are used when the run-time system
        !           153: is built. \*MLIB\fR initially is empty.
        !           154: .LP
        !           155: See the listing of a generic version of this \*MMakefile\fR in
        !           156: Appendix A.
        !           157: .NH 2
        !           158: Building a Personalized Interpreter
        !           159: .PP
        !           160: Performing a \fImake\fR in \*Mmyicon/pi\fR creates three files
        !           161: in \*Mmyicon\fR:
        !           162: .Ds
        !           163: .ta 1i
        !           164: picont \fRcommand processor\*M
        !           165: pilink \fRlinker\*M
        !           166: piconx \fRrun-time system\*M
        !           167: .De
        !           168: A link to \*Mpicont\fR also is constructed in \*Mmyicon/pi\fR so that
        !           169: the new personalized interpreter can be tested in the directory in
        !           170: which it is made.
        !           171: .PP
        !           172: The file \*Mpicont\fR normally is built only on the first \fImake\fR. The
        !           173: file \*Mpilink\fR is built on the first \fImake\fR and is
        !           174: rebuilt whenever the repertoire of built-in functions is changed.
        !           175: The file \*Mpiconx\fR is rebuilt whenever the source code in the
        !           176: run-time system is changed.
        !           177: .PP
        !           178: The user of the personalized interpreter uses \*Mpicont\fR in
        !           179: the same fashion that the standard \*Micont\fR is used [4].
        !           180: (Note that the accidental use of \*Micont\fR in place of
        !           181: \*Mpicont\fR may produce mysterious results.)
        !           182: In turn, \*Mpicont\fR translates a source program using the
        !           183: standard Icon translator and links it using \*Mpilink\fR.
        !           184: The resulting icode file uses \*Mpiconx\fR.
        !           185: .PP
        !           186: The relocation bits and symbol tables in \*Mpicont\fR, \*Mpilink\fR,
        !           187: and \*Mpiconx\fR can be removed by
        !           188: .Ds
        !           189: make Strip
        !           190: .De
        !           191: in \*Mmyicon/pi\fR. This reduces the sizes of these files substantially
        !           192: but may interfere with debugging.
        !           193: .PP
        !           194: If a \fImake\fR is performed in \*Mmyicon/pi\fR before any
        !           195: run-time files are added or modified, the resulting personalized
        !           196: interpreter is identical to the standard one. Such a \fImake\fR can
        !           197: be performed to verify that the personalized interpreter system
        !           198: is performing properly.
        !           199: .PP
        !           200: Note that a personalized interpreter inherits the parameters and
        !           201: configuration of the locally installed version of Icon in \*Mv5g\fR, including
        !           202: optional language extensions [6].
        !           203: The file \*Mmyicon/h/config.h\fR contains configuration information.
        !           204: The definitions in this file should not be changed.
        !           205: .NH 2
        !           206: Adding a New Function
        !           207: .PP
        !           208: To add a new function to the personalized interpreter, it is first
        !           209: necessary to provide the C code, adhering to the conventions and
        !           210: data structures used throughout Icon. See [2]. Some examples of
        !           211: C functions taken from the Icon program library [7] are included in Appendix B
        !           212: of this report. The source code for these functions is contained in
        !           213: \*Mv5g/pifunc\fR, where \*Mv5g\fR is the root of the Icon system.
        !           214: The location of \*Mv5g\fR varies from site to site [5].
        !           215: The directory
        !           216: \*Mv5g/functions\fR contains the source code for the standard built-in
        !           217: functions, which also can be used as models for new ones.
        !           218: .PP
        !           219: Suppose that \*Mgetenv\fR from the Icon program library is to be
        !           220: added to a personalized interpreter. The source code can be obtained by
        !           221: .Ds
        !           222: cp v5g/pifuncs/getenv.c myicon/pi
        !           223: .De
        !           224: (Note that the actual paths will be different, depending on the
        !           225: local hierarchy.)
        !           226: .PP
        !           227: Three things now need to be done to
        !           228: incorporate this function in the personalized interpreter:
        !           229: .IP 1.
        !           230: Add a line consisting of
        !           231: .Ds
        !           232: PDEF(getenv)
        !           233: .De
        !           234: to \*Mmyicon/h/pdef.h\fR in proper alphabetical order.
        !           235: This causes the linker and the run-time system to know about the new function.
        !           236: .IP 2.
        !           237: Add \*Mgetenv.o\fR to the definition of \*MOBJS\fR in
        !           238: \*Mmyicon/pi/Makefile\fR.
        !           239: This causes \*Mgetenv.c\fR to be compiled and the resulting
        !           240: object file to be loaded with the run-time system when a \fImake\fR is performed.
        !           241: .IP 3.
        !           242: Perform a \fImake\fR in \*Mmyicon/pi\fR. The result is
        !           243: new versions of \*Mpilink\fR and \*Mpiconx\fR in \*Mmyicon\fR.
        !           244: .LP
        !           245: The function \*Mgetenv\fR now can be used like any other built-in
        !           246: function.
        !           247: .PP
        !           248: More than one function can be included in a single source file.
        !           249: See \*Mmath.c\fR in Appendix B. Note that \*Mmath.c\fR uses the
        !           250: math library. To add this module to the run-time system of
        !           251: a personalized interpreter, \*MPDEF\fR entries should be
        !           252: made for each function in \*Mmath.c\fR, \*Mmath.o\fR should be added to
        !           253: \*MOBJS\fR, and \*M\-lm\fR should be added to \*MLIB\fR in
        !           254: the \*MMakefile\fR.
        !           255: .NH 2
        !           256: Modifying the Existing Run-Time System
        !           257: .PP
        !           258: The use of personalized interpreters is not limited to the addition
        !           259: of new functions. Any module in the standard run-time system can
        !           260: be modified as well. The run-time system is divided into five
        !           261: parts:
        !           262: .RS
        !           263: .IP \*Mv5g/functions\fR 1.2i
        !           264: built-in functions
        !           265: .IP \*Mv5g/operators\fR
        !           266: built-in operators
        !           267: .IP \*Mv5g/rt\fR
        !           268: run-time support routines
        !           269: .IP \*Mv5g/lib\fR
        !           270: routines called by the interpreter
        !           271: .IP \*Mv5g/iconx\fR
        !           272: the interpreter and start-up routines
        !           273: .RE
        !           274: .LP
        !           275: For example, storage allocation routines are contained in \*Mv5g/rt/alc.c\fR.
        !           276: .PP
        !           277: To modify an existing portion of the Icon run-time system,
        !           278: copy the source code file from the standard system to \*Mmyicon/pi\fR.
        !           279: (Source code for a few run-time routines is placed in \*Mmyicon/std\fR
        !           280: when a personalized interpreter is set up. Check this directory
        !           281: first and use that file, if appropriate, rather than making
        !           282: another copy in \*Mmyicon/pi\fR.) When a source-code file in
        !           283: \*Mmyicon/pi\fR has been modified, place it in the \*MOBJS\fR
        !           284: list just like a new file and perform a \fImake\fR. Note that
        !           285: an entire module must be replaced, even if a change is made to
        !           286: only one routine.
        !           287: Any module that is replaced must contain all the global variables in
        !           288: the original module to prevent \fIld(1)\fR from also loading the
        !           289: original module. There is no way to delete routines from the run-time
        !           290: system.
        !           291: .PP
        !           292: The directory \*Mmyicon/h\fR contains header files that are included
        !           293: in various source-code files. For example, error message text for
        !           294: a new run-time error can be provided by adding it to \*Mmyicon/h/err.h\fR.
        !           295: The file \*Mmyicon/h/rt.h\fR contains declarations and definitions that
        !           296: are used throughout the run-time system. This is where the declaration
        !           297: for the structure of a new type of data object would be placed.
        !           298: .PP
        !           299: Care
        !           300: must be taken when modifying header files not to make changes that
        !           301: would produce inconsistencies between previously compiled components
        !           302: of the Icon run-time system and new ones.
        !           303: .SH
        !           304: References
        !           305: .IP 1.
        !           306: Griswold, Ralph E. and Griswold, Madge T. \fIThe Icon Programming
        !           307: Language\fR. Prentice-Hall, Inc., Englewood Cliffs, New Jersey. 1983.
        !           308: .IP 2.
        !           309: Griswold, Ralph E., Robert K. McConeghy, and William H. Mitchell.
        !           310: \fIA Tour Through the C Implementation of Icon; Version 5.9\fR.
        !           311: Technical Report TR 84-11, Department of Computer Science,
        !           312: The University of Arizona. August 1984.
        !           313: .IP 3.
        !           314: Griswold, Ralph E. and William H. Mitchell. \fIICONC(1)\fR,
        !           315: manual page for \fIUNIX Programmer's Manual\fR, Department of
        !           316: Computer Science, The University of Arizona. July 1983.
        !           317: .IP 4.
        !           318: Griswold, Ralph E. and William H. Mitchell. \fIICONT(1)\fR,
        !           319: manual page for \fIUNIX Programmer's Manual\fR, Department of
        !           320: Computer Science, The University of Arizona. August 1984.
        !           321: .IP 5.
        !           322: Griswold, Ralph E. and William H. Mitchell.
        !           323: \fIInstallation and Maintenance Guide for Version 5.9 of Icon\fR.
        !           324: Technical Report TR 84-13, Department of Computer Science, The
        !           325: University of Arizona, Tucson, Arizona. August 1984.
        !           326: .IP 6.
        !           327: Griswold, Ralph E., Robert K. McConeghy, and William H. Mitchell.
        !           328: \fIExtensions to Version 5 of the Icon Programming Language\fR.
        !           329: Technical Report TR 84-10a, Department of Computer Science,
        !           330: The University of Arizona. August 1984.
        !           331: .IP 7.
        !           332: Griswold, Ralph E. \fIThe Icon Program Library\fR, Technical Report
        !           333: TR 84-12, Department of Computer Science, The University of
        !           334: Arizona. August 1984.
        !           335: .am Ds
        !           336: .ps 8
        !           337: .vs 9
        !           338: ..
        !           339: .am De
        !           340: .ps 10
        !           341: .vs 12
        !           342: ..
        !           343: .de Ta
        !           344: .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
        !           345: ..
        !           346: .Ap "Appendix A \(em Makefile for Personalized Interpreters"
        !           347: .sp
        !           348: .PP
        !           349: The ``generic'' \*MMakefile\fR for personalized interpreters follows.
        !           350: The values of \*MPATH\fR and \*MDIR\fR are filled in when \*MPimake\fR is run.
        !           351: .Ds
        !           352: CFLAGS=
        !           353: LDFLAGS=
        !           354: LIB=
        !           355: iroot=PATH
        !           356: V5GBIN=$(iroot)/bin
        !           357: DIR=
        !           358: .Dd
        !           359: #
        !           360: # To add or replace object files, add their names to the OBJS list below.
        !           361: #  For example, to add foo.o and bar.o, use:
        !           362: #
        !           363: #      OBJS=foo.o bar.o         (this is a sample line)
        !           364: #
        !           365: # For each object file added to OBJS, add a dependency line to reflect files
        !           366: #  that are depended on.  For example, if foo.c includes rt.h 
        !           367: #  which is located in the h directory use
        !           368: #      
        !           369: #      foo.o:  ../h/rt.h
        !           370: #
        !           371: .Dd
        !           372: OBJS=
        !           373: .Dd
        !           374: PIOBJS=../std/init.o ../std/strprc.o
        !           375: RTOBJS=$(PIOBJS) $(OBJS)
        !           376: .Dd
        !           377: Pi:    ../picont ../piconx ../pilink
        !           378: .Dd
        !           379: ../picont: ../std/icont.c
        !           380:        rm -f ../picont picont
        !           381:        cc -o ../picont -DIntBin="\e"$(DIR)\e"" -DIconx="\e"$(DIR)/piconx\e"" \e
        !           382:                -DIconxEnv="\e"ICONX=$(DIR)/piconx\e"" \e
        !           383:                -DILINK="\e"$(DIR)/pilink\e"" \e
        !           384:                -DITRAN="\e"$(V5GBIN)/itran\e"" -DFORK=QFORK \e
        !           385:                ../std/icont.c
        !           386:        ln ../picont
        !           387: .Dd
        !           388: ../pilink: ../std/linklib ../std/builtin.o
        !           389:        cc $(LDFLAGS) -X -o ../pilink ../std/builtin.o ../std/linklib
        !           390: .Dd
        !           391: ../piconx: ../std/rtlib $(RTOBJS)
        !           392:        cc $(LDFLAGS) -X -o ../piconx -e start -u start $(RTOBJS) ../std/rtlib $(LIB)
        !           393:        
        !           394: ../std/init.o:         ../h/rt.h ../h/err.h ../h/config.h ../h/pdef.h
        !           395:        cd ../std;      cc -c init.c
        !           396: .Dd
        !           397: ../std/builtin.o:      ../std/ilink.h ../h/config.h ../h/pdef.h
        !           398:        cd ../std;      cc -c builtin.c
        !           399: .Dd
        !           400: ../std/strprc.o:       ../h/rt.h ../h/pnames.h ../h/config.h ../h/pdef.h
        !           401:        cd ../std;      cc -c strprc.c
        !           402: .Dd
        !           403: Strip: ../picont ../piconx ../pilink
        !           404:        strip ../picont ../piconx ../pilink
        !           405: .De
        !           406: .Ap "Appendix B \(em C Functions from the Icon Program Library"
        !           407: .sp
        !           408: .SH
        !           409: getenv.c:
        !           410: .LP
        !           411: .Ds
        !           412: /*
        !           413: #      GETENV(3.icon)
        !           414: #
        !           415: #      Get contents of environment variables
        !           416: #
        !           417: #      Stephen B. Wampler
        !           418: #
        !           419: #      Last modified 8/19/84
        !           420: #
        !           421: */
        !           422: .Dd
        !           423: #include "../h/rt.h"
        !           424: .Dd
        !           425: /*
        !           426:  * getenv(s) - return contents of environment variable s
        !           427:  */
        !           428: .Dd
        !           429: Xgetenv(nargs, arg1, arg0)
        !           430: int nargs;
        !           431: struct descrip arg1, arg0;
        !           432:    {
        !           433:    register char *p;
        !           434:    register int len;
        !           435:    char sbuf\^[MAXSTRING];
        !           436:    extern char *getenv();
        !           437:    extern char *alcstr();
        !           438: .Dd
        !           439:    DeRef(arg1)
        !           440: .Dd
        !           441:    if (!QUAL(arg1))                    /* check legality of argument */
        !           442:       runerr(103, &arg1);
        !           443:    if (STRLEN(arg1) \*(<= 0 || STRLEN(arg1) \*(>= MAXSTRING)
        !           444:       runerr(401, &arg1);
        !           445:    qtos(&arg1, sbuf);                  /* convert argument to C-style string */
        !           446: .Dd
        !           447:    if ((p = getenv(sbuf)) != NULL) {           /* get environment variable */
        !           448:       len = strlen(p);
        !           449:       sneed(len);
        !           450:       STRLEN(arg0) = len;
        !           451:       STRLOC(arg0) = alcstr(p, len);
        !           452:       }
        !           453:    else                                /* fail if variable not in environment */
        !           454:       fail();
        !           455:    }
        !           456: .Dd
        !           457: Procblock(getenv,\*b-1)
        !           458: .De
        !           459: .bp
        !           460: .SH
        !           461: math.c:
        !           462: .LP
        !           463: .Ds
        !           464: /*
        !           465: #      MATH(3.icon)
        !           466: #
        !           467: #      Miscellaneous math functions
        !           468: #
        !           469: #      Ralph E. Griswold
        !           470: #
        !           471: #      Last modified 8/19/84
        !           472: #
        !           473: */
        !           474: .Dd
        !           475: #include "../h/rt.h"
        !           476: #include <errno.h>
        !           477: .Dd
        !           478: int errno;
        !           479: /*
        !           480:  * exp(x), x in radians
        !           481:  */
        !           482: Xexp(nargs, arg1, arg0)
        !           483: int nargs;
        !           484: struct descrip arg1, arg0;
        !           485:    {
        !           486:    int t;
        !           487:    double y;
        !           488:    union numeric r;
        !           489:    double exp();
        !           490:    
        !           491:    if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1);
        !           492:    y = exp(r.real);
        !           493:    if (errno == ERANGE) runerr(252, NULL);
        !           494:    mkreal(y,\*b&arg0);
        !           495:    }
        !           496: Procblock(exp,\*b1)
        !           497: .Dd
        !           498: /*
        !           499:  * log(x), x in radians
        !           500:  */
        !           501: Xlog(nargs, arg1, arg0)
        !           502: int nargs;
        !           503: struct descrip arg1, arg0;
        !           504:    {
        !           505:    int t;
        !           506:    double y;
        !           507:    union numeric r;
        !           508:    double log();
        !           509:    
        !           510:    if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1);
        !           511:    y = log(r.real);
        !           512:    if (errno == EDOM) runerr(251, NULL);
        !           513:    mkreal(y,\*b&arg0);
        !           514:    }
        !           515: Procblock(log,\*b1)
        !           516: .Dd
        !           517: /*
        !           518:  * log10(x), x in radians
        !           519:  */
        !           520: Xlog10(nargs, arg1, arg0)
        !           521: int nargs;
        !           522: struct descrip arg1, arg0;
        !           523:    {
        !           524:    int t;
        !           525:    double y;
        !           526:    union numeric r;
        !           527:    double log10();
        !           528:    
        !           529:    if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1);
        !           530:    y = log10(r.real);
        !           531:    if (errno == EDOM) runerr(251, NULL);
        !           532:    mkreal(y,\*b&arg0);
        !           533:    }
        !           534: Procblock(log10,\*b1)
        !           535: .Dd
        !           536: /*
        !           537:  * sqrt(x), x in radians
        !           538:  */
        !           539: Xsqrt(nargs, arg1, arg0)
        !           540: int nargs;
        !           541: struct descrip arg1, arg0;
        !           542:    {
        !           543:    int t;
        !           544:    double y;
        !           545:    union numeric r;
        !           546:    double sqrt();
        !           547:    
        !           548:    if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1);
        !           549:    y = sqrt(r.real);
        !           550:    if (errno == EDOM) runerr(251, NULL);
        !           551:    mkreal(y,\*b&arg0);
        !           552:    }
        !           553: Procblock(sqrt,\*b1)
        !           554: .De
        !           555: .bp
        !           556: .SH
        !           557: seek.c:
        !           558: .Ds
        !           559: /*
        !           560: #      SEEK(3.icon)
        !           561: #
        !           562: #      Seek to position in stream
        !           563: #
        !           564: #      Stephen B. Wampler
        !           565: #
        !           566: #      Last modified 8/19/84
        !           567: #
        !           568: */
        !           569: .Dd
        !           570: #include "../h/rt.h"
        !           571: .Dd
        !           572: /*
        !           573:  * seek(file,\*boffset,\*bstart) - seek to offset byte from start in file.
        !           574:  */
        !           575: .Dd
        !           576: Xseek(nargs, arg3, arg2, arg1, arg0)
        !           577: int nargs;
        !           578: struct descrip arg3, arg2, arg1, arg0;
        !           579:    {
        !           580:    long l1, l2;
        !           581:    int status;
        !           582:    FILE *fd;
        !           583:    long ftell();
        !           584: .Dd
        !           585:    DeRef(arg1)
        !           586:    if (arg1.type != D_FILE)
        !           587:       runerr(106);
        !           588: .Dd
        !           589:    defint(&arg2, &l1, 0);
        !           590:    defshort(&arg3, 0);
        !           591: .Dd
        !           592:    fd = BLKLOC(arg1)->file.fd;
        !           593: .Dd
        !           594:    if ((BLKLOC(arg1)->file.status == 0) ||
        !           595:        (fseek(fd, l1, arg3.value.integr) == -1))
        !           596:       fail();
        !           597:    mkint(ftell(fd), &arg0);
        !           598:    }
        !           599: .Dd
        !           600: Procblock(seek,\*b3)
        !           601: .De
        !           602: .LP

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.