|
|
1.1 root 1: #ifndef lint
2: static char *rcsid =
3: "$Header: lam9.c 1.4 83/06/24 10:56:30 sklower Exp $";
4: #endif
5:
6: /* -[Thu Mar 3 11:41:27 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:
160: lispval
161: LIfranzcall()
162: {
163: register lispval handy;
164:
165: if((np-lbot) <= 0) argerr("int:franz-call");
166:
167: switch (lbot[0].val->i) {
168:
169: case fc_getpwnam:
170: /* arg 1 = user name
171: * return vector of name, uid, gid, dir
172: * or nil if doesn't exist.
173: */
174: {
175: struct passwd *pw, *getpwnam();
176: lispval newvec(), inewint();
177: struct argent *oldnp;
178:
179: pw = getpwnam(verify(lbot[1].val,"int:franz-call: invalid name"));
180: if(pw)
181: {
182: handy = newvec(4 * sizeof(long));
183: oldnp = np;
184: protect(handy);
185: handy->v.vector[0] = (lispval) inewstr(pw->pw_name);
186: handy->v.vector[1] = inewint(pw->pw_uid);
187: handy->v.vector[2] = inewint(pw->pw_gid);
188: handy->v.vector[3] = (lispval) inewstr(pw->pw_dir);
189: np = oldnp;
190: return(handy);
191: }
192: return(nil);
193: }
194: case fc_access:
195: return(inewint
196: (access
197: (verify(lbot[1].val, "i:fc,access: non string"),
198: lbot[2].val->i)));
199: case fc_chdir:
200: return(inewint
201: (chdir(verify(lbot[1].val,"i:fc,chdir: non string"))));
202:
203: case fc_unlink:
204: return(inewint
205: (unlink(verify(lbot[1].val,"i:fc,unlink: non string"))));
206:
207: case fc_time:
208: return(inewint(time(0)));
209:
210: case fc_chmod:
211: return(inewint(chmod(verify(lbot[1].val,
212: "i:fc,chmod: non string"),
213: lbot[2].val->i)));
214:
215: case fc_getpid:
216: return(inewint(getpid()));
217:
218: case fc_stat:
219: {
220: struct argent *oldnp;
221: struct stat statbuf;
222:
223: if(stat(verify(lbot[1].val,"ifc:stat bad file name "),
224: &statbuf)
225: != 0) return(nil); /* nil on error */
226: handy = newvec(12 * sizeof(long));
227: oldnp = np;
228: protect(handy);
229: handy->v.vector[0] = inewint(statbuf.st_mode & 07777);
230: handy->v.vector[1] = inewint(
231: (statbuf.st_mode & S_IFMT) >> 12 );
232: handy->v.vector[2] = inewint(statbuf.st_nlink);
233: handy->v.vector[3] = inewint(statbuf.st_uid);
234: handy->v.vector[4] = inewint(statbuf.st_gid);
235: handy->v.vector[5] = inewint(statbuf.st_size);
236: handy->v.vector[6] = inewint(statbuf.st_atime);
237: handy->v.vector[7] = inewint(statbuf.st_mtime);
238: handy->v.vector[8] = inewint(statbuf.st_ctime);
239: handy->v.vector[9] = inewint(statbuf.st_dev);
240: handy->v.vector[10] = inewint(statbuf.st_rdev);
241: handy->v.vector[11] = inewint(statbuf.st_ino);
242: np = oldnp;
243: return(handy);
244: }
245: case fc_gethostname:
246: {
247: #if os_4_1a || os_4_1c || os_4_2
248: char hostname[32];
249: gethostname(hostname,sizeof(hostname));
250: return((lispval) inewstr(hostname));
251: #else
252: return((lispval) inewstr(SITE));
253: #endif
254: }
255: case fc_link:
256: return(inewint
257: (link(verify(lbot[1].val,"i:fc,link: non string"),
258: verify(lbot[2].val,"i:fc,link: non string"))));
259:
260: default:
261: return(inewint(-1));
262: } /* end of switch */
263: }
264:
265:
266:
267:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.