|
|
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.