Start development on 386BSD 0.0
[unix-history] / .ref-BSD-4_3_Net_2 / usr / src / usr.bin / lisp / franz / lam9.c
CommitLineData
2103c4c6
C
1#ifndef lint
2static 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
28int putchar(); /* functions used from the termlib */
29int tgetflag();
30char *getenv();
31char *tgoto();
32char *tgetstr();
33
34char bpbuf[1024];
35char tstrbuf[100];
36extern short ospeed;
37extern char PC;
38extern char *BC;
39extern 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
46lispval
47Ltci()
48{
49char *cp = getenv("TERM");
50char *pc;
51int found;
52struct sgttyb tty;
53
54found = tgetent(bpbuf,cp); /* open ther termcap file */
55switch(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 }
65cp = tstrbuf;
66BC = tgetstr("bc", &cp);
67UP = tgetstr("up", &cp);
68pc = tgetstr("pc", &cp);
69if (pc)
70 PC = *pc;
71return(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/* */
80lispval
81Ltcx()
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
101static
102show(option,line,colum)
103char *option;
104int *line,*colum;
105{
106int found;
107char clbuf[20];
108char *clbp = clbuf;
109char *clear;
110
111/* the tegetflag doesnot work ? */
112clear = tgetstr(option,&clbp);
113/*printf("option = %d , %s \n",clear,option);*/
114if (!clear)
115 {found = tgetnum(option);
116 if (found)
117 return(found);
118 return(-1);
119 }
120PC = ' ';
121if (strcmp(option, "cm") == 0) { /* if cursor motion, do it */
122 clear=tgoto(clear,*colum,*line);
123 if (*clear == 'O')
124 clear = 0;
125 }
126if (clear) /* execute the feature */
127 tputs(clear,0,putchar);
128return (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
162lispval
163LIfranzcall()
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