00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "head.h"
00036 #include <stdio.h>
00037 #include <stdlib.h>
00038 #if defined(BUILD_OS_DARWIN)
00039 #include <stdlib.h>
00040 #else
00041 #include <malloc.h>
00042 #endif
00043 #include <string.h>
00044 #include <sys/types.h>
00045
00046
00047 int fnamesize = 0;
00048
00049 char *procn;
00050
00051
00052
00053 extern char *
00054 getfilename (char *ptr)
00055 {
00056 char *get = NULL;
00057 int i = -1;
00058 int last, j,k;
00059 int onsize;
00060
00061
00062 if (ptr != NULL) {
00063 while ((++i < LINESIZE) && (ptr[i] != '\0'));
00064
00065
00066
00067
00068 last = i - 2;
00069
00070 while ((--i > -1) && (ptr[i] != ' ') && (ptr[i] != '*'));
00071 onsize = last -i +5;
00072 get = (char *) calloc(1, onsize);
00073 procn = (char *) calloc(1, last - i + 1);
00074
00075 j = 0;
00076
00077
00078
00079
00080
00081
00082
00083 k = 0;
00084 while (i < last) {
00085 get[j++] = ptr[++i];
00086 procn[k++] = ptr[i];
00087 }
00088
00089
00090
00091
00092
00093
00094 get[j++] = '_';
00095 get[j++] = '.';
00096 get[j++] = 'f';
00097 get[j++] = 'c';
00098 get[j++] = '\0';
00099
00100 fnamesize = j ;
00101 if (onsize != fnamesize) {
00102 fprintf(stderr,"ERROR: bad internal file name size \n");
00103 fprintf(stderr," callocd: %d, realsize: %d\n",onsize,fnamesize);
00104 }
00105 }
00106
00107 return(get);
00108 }
00109
00110
00111
00112
00113
00114 extern void
00115 flushout (struct table *p)
00116
00117 {
00118 char *name;
00119 FILE *outfile;
00120 struct llist *lptr;
00121 int i,j;
00122 char *newvar1,*newvar2;
00123 int printed;
00124
00125 name = getfilename(p->procname);
00126
00127 #ifdef DEBUG
00128 printf("\n\n name: %s\n",name);
00129 printf("entry: \n");
00130 printtable(p);
00131 #endif
00132
00133
00134 outfile = fopen(name,"w");
00135 if (outfile == NULL) {
00136 fprintf(stderr,"ERROR: unable to open %s\n",name);
00137 exit(1);
00138 }
00139
00140
00141
00142
00143 for (lptr = p->includs; lptr != NULL; lptr= lptr->nextl)
00144 fprintf(outfile,"#include %s\n",lptr->entry);
00145
00146
00147
00148 fprintf(outfile,"\n%s",p->procname);
00149
00150
00151
00152
00153 for (i = 0; i< p->declnum; i++){
00154 fprintf(outfile," x%d",i);
00155 if (i != p->declnum-1)
00156 fprintf(outfile,",");
00157 }
00158 fprintf(outfile,")\n");
00159
00160
00161
00162 i = 0;
00163 for (lptr = p->decls; lptr != NULL; lptr= lptr->nextl){
00164 printed = FALSE;
00165 for (j=0; lptr->entry[j] != '\0'; j++){
00166 if (lptr->entry[j] == '[') {
00167 printed = TRUE;
00168 newvar1 = (char *) calloc(1,40);
00169 strncpy(newvar1,lptr->entry,j);
00170 newvar2 = (char *) calloc(1,40);
00171 strcpy(newvar2,&(lptr->entry[j]));
00172 fprintf(outfile,"%s x%d %s;\n",newvar1,i++,newvar2);
00173 }
00174 }
00175
00176 if (!printed) fprintf(outfile,"%s x%d;\n",lptr->entry,i++);
00177 }
00178
00179
00180
00181
00182 fprintf(outfile,"{\n");
00183
00184
00185
00186 fprintf(outfile,"\nreturn(%s(",procn);
00187
00188 for (i=0; i< p->declnum; i++){
00189 fprintf(outfile," x%d",i);
00190 if (i != p->declnum-1)
00191 fprintf(outfile,",");
00192 }
00193 fprintf(outfile,"));\n}\n");
00194
00195
00196 if (fclose(outfile) != 0)
00197 perror(name);
00198 }
00199