Annotation of 43BSDTahoe/ucb/lisp/franz/lam9.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid =
                      3:    "$Header: lam9.c,v 1.7 85/03/13 17:19:15 sklower Exp $";
                      4: #endif
                      5: 
                      6: /*                                     -[Sat Oct  1 19:44:47 1983 by jkf]-
                      7:  *     lam9.c                          $Locker:  $
                      8:  * lambda functions
                      9:  *
                     10:  * (c) copyright 1982, Regents of the University of California
                     11:  */
                     12: 
                     13: #include "global.h"
                     14: /*
                     15:  * These routines writen in C will allow use of the termcap file
                     16:  * by any lisp program. They are very basic routines which initialize
                     17:  * termcap and allow the lisp to execute any of the termcap functions.
                     18:  */
                     19: 
                     20: #include <stdio.h>             /*add definations for I/O and bandrate */
                     21: #include <sgtty.h>
                     22: #include <sys/types.h>
                     23: #include <sys/stat.h>
                     24: #include <pwd.h>
                     25: 
                     26: 
                     27: #undef putchar
                     28: int    putchar();              /* functions used from the termlib */
                     29: int    tgetflag();
                     30: char   *getenv();
                     31: char   *tgoto();
                     32: char   *tgetstr();
                     33: 
                     34: char   bpbuf[1024];
                     35: char   tstrbuf[100];
                     36: extern short   ospeed;
                     37: extern char    PC;
                     38: extern char   *BC;
                     39: extern char   *UP;
                     40: 
                     41: /*
                     42: /*     This routine will initialize the termcap for the lisp programs.
                     43: /*     If the termcap file is not found, or terminal type is undefined,
                     44: /*     it will print out an error mesg.                                */
                     45: 
                     46: lispval
                     47: Ltci()
                     48: {
                     49: char *cp = getenv("TERM");
                     50: char *pc;
                     51: int found;
                     52: struct sgttyb tty;
                     53: 
                     54: found = tgetent(bpbuf,cp);             /* open ther termcap file */
                     55: switch(found) {
                     56:       case -1:         printf("\nError Termcap File not found \n");break;
                     57:       case 0 : printf("\nError No Termcap Entry for this terminal \n");
                     58:                break;
                     59:       case 1 : {                       /* everything was ok    */
                     60:                gtty(1, &tty);
                     61:                ospeed = tty.sg_ospeed;
                     62:                }
                     63:                break;
                     64:        }
                     65: cp = tstrbuf;
                     66: BC = tgetstr("bc", &cp);
                     67: UP = tgetstr("up", &cp);
                     68: pc = tgetstr("pc", &cp);
                     69: if (pc)
                     70:     PC = *pc;
                     71: return(nil);
                     72: }
                     73: /* This routine will execute any of the termcap functions used by the lisp
                     74: /* program. If the feature is not include in the terminal defined it will
                     75: /* ignore the call.
                     76: /*             option  : feature to execute
                     77: /*             line    : line if is nessery
                     78: /*             colum   : colum if is nessaery
                     79: /*                                                                     */
                     80: lispval
                     81: Ltcx()
                     82: {
                     83:        register struct argent *mylbot = lbot;
                     84:        int line, column;
                     85: 
                     86:        switch(np-lbot) {
                     87:        case 1:
                     88:                line = column = 0;
                     89:                break;
                     90:        case 2:
                     91:                error("Wrong number of Arguments to Termcapexecute",FALSE);
                     92:                break;
                     93:        case 3:
                     94:                line = mylbot[1].val->i;
                     95:                column = mylbot[2].val->i;
                     96:        }
                     97:        return(inewint(show((char *) mylbot->val,&line,&column)));
                     98: }
                     99: 
                    100: 
                    101: static
                    102: show(option,line,colum)
                    103: char *option;
                    104: int  *line,*colum;
                    105: {
                    106: int found;
                    107: char clbuf[20];
                    108: char *clbp = clbuf;
                    109: char *clear;
                    110: 
                    111: /* the tegetflag doesnot work ? */
                    112: clear = tgetstr(option,&clbp);  
                    113: /*printf("option = %d , %s \n",clear,option);*/
                    114: if (!clear) 
                    115:        {found = tgetnum(option);
                    116:         if (found)
                    117:                return(found);
                    118:          return(-1);
                    119:        }
                    120: PC = ' ';
                    121: if (strcmp(option, "cm") == 0) {               /* if cursor motion, do it */
                    122:        clear=tgoto(clear,*colum,*line);
                    123:                if (*clear == 'O')
                    124:                clear = 0;
                    125:        }
                    126: if (clear)                                     /* execute the feature */
                    127:      tputs(clear,0,putchar);
                    128: return (0);
                    129: }
                    130: 
                    131: 
                    132: 
                    133: /*
                    134:  * LIfranzcall :: lisp function int:franz-call
                    135:  *   this function serves many purposes.  It provides access to
                    136:  *   those things that are best done in C or which required a
                    137:  *   C access to unix system calls.
                    138:  *
                    139:  *   Calls to this routine are not error checked, for the most part
                    140:  *   because this is only called from trusted lisp code.
                    141:  *
                    142:  *   The functions in this file may or may not be documented in the manual.
                    143:  *   See the lisp interface to this function for more details. (common2.l)
                    144:  *
                    145:  *  the first argument is always a fixnum index, the other arguments
                    146:  *   depend on the function.
                    147:  */
                    148: 
                    149: #define fc_getpwnam 1
                    150: #define fc_access   2 
                    151: #define fc_chdir    3
                    152: #define fc_unlink   4
                    153: #define fc_time            5
                    154: #define fc_chmod    6
                    155: #define fc_getpid   7
                    156: #define fc_stat     8
                    157: #define fc_gethostname 9
                    158: #define fc_link     10
                    159: #define fc_sleep    11
                    160: #define fc_nice            12
                    161: 
                    162: lispval
                    163: LIfranzcall()
                    164: {
                    165:     register lispval handy;
                    166:     
                    167:     if((np-lbot) <= 0) argerr("int:franz-call");
                    168: 
                    169:     switch (lbot[0].val->i) {
                    170:     
                    171:     case fc_getpwnam:
                    172:        /* arg 1 = user name
                    173:         * return vector of name, uid, gid, dir
                    174:         * or nil if doesn't exist.
                    175:         */
                    176:         {
                    177:             struct passwd *pw, *getpwnam();
                    178:             lispval newvec(), inewint();
                    179:             struct argent *oldnp;
                    180: 
                    181:             pw = getpwnam(verify(lbot[1].val,"int:franz-call: invalid name"));
                    182:             if(pw)
                    183:             {
                    184:                 handy =  newvec(4 * sizeof(long));
                    185:                 oldnp = np;
                    186:                 protect(handy);
                    187:                 handy->v.vector[0] = (lispval) inewstr(pw->pw_name);
                    188:                 handy->v.vector[1] = inewint(pw->pw_uid);
                    189:                 handy->v.vector[2] = inewint(pw->pw_gid);
                    190:                 handy->v.vector[3] = (lispval) inewstr(pw->pw_dir);
                    191:                 np = oldnp;
                    192:                 return(handy);
                    193:             }
                    194:             return(nil);
                    195:         }
                    196:         case fc_access:
                    197:                return(inewint
                    198:                        (access
                    199:                           (verify(lbot[1].val, "i:fc,access: non string"),
                    200:                            lbot[2].val->i)));
                    201:         case fc_chdir:
                    202:                return(inewint
                    203:                       (chdir(verify(lbot[1].val,"i:fc,chdir: non string"))));
                    204: 
                    205:         case fc_unlink:
                    206:                return(inewint
                    207:                       (unlink(verify(lbot[1].val,"i:fc,unlink: non string"))));
                    208: 
                    209:         case fc_time:
                    210:                return(inewint(time(0)));
                    211: 
                    212:         case fc_chmod:
                    213:                return(inewint(chmod(verify(lbot[1].val,
                    214:                                                "i:fc,chmod: non string"),
                    215:                                     lbot[2].val->i)));
                    216: 
                    217:         case fc_getpid:
                    218:                return(inewint(getpid()));
                    219: 
                    220:         case fc_stat:
                    221:                {
                    222:                    struct argent *oldnp;
                    223:                    struct stat statbuf;
                    224: 
                    225:                    if(stat(verify(lbot[1].val,"ifc:stat bad file name "),
                    226:                            &statbuf)
                    227:                        != 0) return(nil);      /* nil on error */
                    228:                    handy = newvec(12 * sizeof(long));
                    229:                    oldnp = np;
                    230:                    protect(handy);
                    231:                    handy->v.vector[0] = inewint(statbuf.st_mode & 07777);
                    232:                    handy->v.vector[1] = inewint(
                    233:                                           (statbuf.st_mode & S_IFMT) >> 12 );
                    234:                    handy->v.vector[2] = inewint(statbuf.st_nlink);
                    235:                    handy->v.vector[3] = inewint(statbuf.st_uid);
                    236:                    handy->v.vector[4] = inewint(statbuf.st_gid);
                    237:                    handy->v.vector[5] = inewint(statbuf.st_size);
                    238:                    handy->v.vector[6] = inewint(statbuf.st_atime);
                    239:                    handy->v.vector[7] = inewint(statbuf.st_mtime);
                    240:                    handy->v.vector[8] = inewint(statbuf.st_ctime);
                    241:                    handy->v.vector[9] = inewint(statbuf.st_dev);
                    242:                    handy->v.vector[10] = inewint(statbuf.st_rdev);
                    243:                    handy->v.vector[11] = inewint(statbuf.st_ino);
                    244:                    np = oldnp;
                    245:                    return(handy);
                    246:                }
                    247:         case fc_gethostname:
                    248:            {
                    249: #if os_4_1a || os_4_1c || os_4_2 || os_4_3
                    250:                char hostname[32];
                    251:                gethostname(hostname,sizeof(hostname));
                    252:                return((lispval) inewstr(hostname));
                    253: #else
                    254:                return((lispval) inewstr(SITE));
                    255: #endif         
                    256:            }
                    257:         case fc_link:
                    258:            return(inewint
                    259:                    (link(verify(lbot[1].val,"i:fc,link: non string"),
                    260:                          verify(lbot[2].val,"i:fc,link: non string"))));
                    261: 
                    262:         /* sleep for the given number of seconds */
                    263:         case fc_sleep:
                    264:            return(inewint(sleep(lbot[1].val->i)));
                    265: 
                    266:         case fc_nice:
                    267:            return(inewint(nice(lbot[1].val->i)));
                    268:            
                    269:         default:
                    270:                return(inewint(-1));
                    271:        } /* end of switch */
                    272: }
                    273: 
                    274:                 
                    275: 
                    276:                 

unix.superglobalmegacorp.com

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