gccls.c
Go to the documentation of this file.
1 /*
2 /* gccls.c
3 /*
4 /* % gccls lisp-file
5 /* Generate-C-Converted-Lisp-Source
6 /* convert a lisp source code into C which is interpretedly
7 /* executed by Euslisp when it is compiled (by cc) and linked.
8 /* Though some lisp source programs, e.g. l/constants.l, must be
9 /* loaded during the make procedure, it is hard to locate the
10 /* file since no file handling functions are available.
11 /* Genlispexec converts "constants.l" into "constants.l.c"
12 /* which should be compiled by 'cc'. The resulted "constants.l.o"
13 /* may be linked with eus, which then interprets the same program
14 /* as defined in "constants.l".
15 /*
16 /* May 1994, (c) Toshihiro Matsui, Electrotechnical Laboratory
17 */
18 
19 #include <stdio.h>
20 #include <sys/types.h>
21 #include <unistd.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #define MAX_LINE_SIZE 256
25 
26 static char buf[MAX_LINE_SIZE];
27 
28 int main(argc,argv)
29 int argc;
30 char *argv[];
31 {
32  char *lispfn, cfn[128], hfn[128], tempfn[128], catcom[256], entryname[128];
33  FILE *in, *out;
34  char *s, *d, ch;
35  int i,j,k, string_count;
36 
37  lispfn=argv[1];
38  sprintf(tempfn, "/tmp/%s.c.%d", lispfn, getpid());
39  sprintf(cfn, "%s.c", lispfn);
40  sprintf(hfn, "/tmp/%s.h.%d", lispfn, getpid());
41  in=fopen(lispfn, "r");
42  out=fopen(tempfn, "w");
43 
44  /* extract basename from lispfn and place it in entryname */
45  s=lispfn; d=entryname;
46  while (*s != '.' && *s != 0) *d++ = *s++;
47  *d = 0;
48 
49  fprintf(out, "/* %s: c-converted lisp source of %s */\n", lispfn, cfn);
50  fprintf(out, "#include \"eus.h\"\n");
51 #ifndef alpha
52  fprintf(out, "#pragma init (init_object_module)\n");
53 #endif
54 #if 0
55  fprintf(out, "extern void eval_c_strings();\n");
56  fprintf(out, "extern void add_module_initializer();\n");
57 #endif
58  fprintf(out, "extern void %s();\n", entryname);
59  fprintf(out, "static void init_object_module()\n");
60  fprintf(out, " {add_module_initializer(\"%s\", (pointer (*)())%s);}\n", entryname, entryname);
61  fprintf(out, "const static char *sexp_strings[NUM_LINES]={\n");
62 
63  string_count=1;
64 
65  s=(char *)fgets(buf, MAX_LINE_SIZE, in);
66  while (s!=NULL) {
67  k=strlen(s);
68  fputc('\"', out);
69  while (ch= *s++) {
70  if (ch=='\n') fputc(' ', out);
71  else {
72  if (ch=='\"' || ch=='\\') fputc('\\', out);
73  fputc(ch, out);}
74  }
75  fprintf(out, "\",\n");
76  s=fgets(buf, MAX_LINE_SIZE, in);
77  string_count++;}
78  fprintf(out, "\"\" };\n\n");
79  fprintf(out, "void %s(ctx)\n", entryname);
80  fprintf(out, "context *ctx;\n");
81  fprintf(out, "{ eval_c_strings(ctx, NUM_LINES, sexp_strings);}\n");
82 
83  fclose(in);
84  fclose(out);
85  out=fopen(hfn, "w");
86  fprintf(out, "#define NUM_LINES %d\n", string_count);
87  fclose(out);
88  sprintf(catcom, "cat %s %s >%s ", hfn, tempfn, cfn);
89  system(catcom);
90  unlink(hfn); unlink(tempfn);
91  exit(0);
92  }
93 
s
short s
Definition: structsize.c:2
MAX_LINE_SIZE
#define MAX_LINE_SIZE
Definition: gccls.c:24
ch
int ch[MAXTHREAD]
Definition: eusstream.c:23
NULL
#define NULL
Definition: transargv.c:8
d
d
buf
static char buf[MAX_LINE_SIZE]
Definition: gccls.c:26
argc
static int argc
Definition: transargv.c:56
main
int main(int argc, argv)
Definition: gccls.c:28


euslisp
Author(s): Toshihiro Matsui
autogenerated on Thu Jun 15 2023 02:06:43