|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.