00001
00002
00003
00004 #include "machine.h"
00005 #include "MALLOC.h"
00006 #include "stack-c.h"
00007 #include "do_xxprintf.h"
00008 #include "do_xxscanf.h"
00009 #include "fileio.h"
00010
00011
00012 int NumTokens __PARAMS((char *string))
00013 {
00014 char buf[128];
00015 int n=1;
00016 int lnchar=0,ntok=-1;
00017 int length = strlen(string)+1;
00018
00019 if (string != 0)
00020 {
00022 sscanf(string,"%*[ \t\n]%n",&lnchar);
00023 while ( n != 0 && n != EOF && lnchar <= length )
00024 {
00025 int nchar1=0,nchar2=0;
00026 ntok++;
00027 n= sscanf(&(string[lnchar]),"%[^ \n\t]%n%*[ \t\n]%n",buf,&nchar1,&nchar2);
00028 lnchar += (nchar2 <= nchar1) ? nchar1 : nchar2 ;
00029 }
00030
00031 return(ntok);
00032 }
00033 return(FAIL);
00034 }
00035
00036
00037
00038 int StringConvert(char *str)
00039
00040 {
00041 char *str1;
00042 int count=0;
00043 str1 = str;
00044
00045 while ( *str != 0)
00046 {
00047 if ( *str == '\\' )
00048 {
00049 switch ( *(str+1))
00050 {
00051 case 'n' : *str1 = '\n' ; str1++; str += 2;count++;break;
00052 case 't' : *str1 = '\t' ; str1++; str += 2;break;
00053 case 'r' : *str1 = '\r' ; str1++; str += 2;break;
00054 default : *str1 = *str; str1++; str++;break;
00055 }
00056 }
00057 else
00058 {
00059 *str1 = *str; str1++; str++;
00060 }
00061 }
00062 *str1 = '\0';
00063 return count;
00064 }
00065
00066 int Sci_Store __PARAMS((int nrow, int ncol, entry *data, sfdir *type, int retval_s))
00067 {
00068 int cur_i,i,j,i1,one=1,zero=0,k,l,iarg,colcount;
00069 sfdir cur_type;
00070 char ** temp;
00071
00072
00073
00074 if (ncol+Rhs > intersiz ){
00075 Scierror(998,"Error:\ttoo many directive in scanf\r\n");
00076 return RET_BUG;
00077 }
00078 iarg=Rhs;
00079 if (Lhs > 1) {
00080 if (nrow==0) {
00081 CreateVar(++iarg, "d", &one, &one, &l);
00082 LhsVar(1) = iarg;
00083 *stk(l) = -1.0;
00084 for ( i = 2; i <= Lhs ; i++)
00085 {
00086 iarg++;
00087 CreateVar(iarg,"d",&zero,&zero,&l);
00088 LhsVar(i) = iarg;
00089 }
00090 PutLhsVar();
00091 return 0;
00092 }
00093 CreateVar(++iarg, "d", &one, &one, &l);
00094 *stk(l) = (double) retval_s;
00095 LhsVar(1)=iarg;
00096 if (ncol==0) goto Complete;
00097
00098 for ( i=0 ; i < ncol ; i++) {
00099 if ( (type[i] == SF_C) || (type[i] == SF_S) ) {
00100 if( (temp = (char **) MALLOC(nrow*ncol*sizeof(char **)))==NULL) return MEM_LACK;
00101 k=0;
00102 for (j=0;j<nrow;j++) temp[k++]=data[i+ncol*j].s;
00103 CreateVarFromPtr(++iarg, "S", &nrow, &one, temp);
00104 FREE(temp);
00105
00106 }
00107 else {
00108 CreateVar(++iarg, "d", &nrow, &one, &l);
00109 for ( j=0 ; j < nrow ; j++)
00110 *stk(l+j)= data[i+ncol*j].d;
00111 }
00112
00113 LhsVar(i+2)=iarg;
00114 }
00115
00117 Complete:
00118 for ( i = ncol+2; i <= Lhs ; i++)
00119 {
00120 iarg++;
00121 CreateVar(iarg,"d",&zero,&zero,&l);
00122 LhsVar(i) = iarg;
00123 }
00124 }
00125 else {
00126 char *ltype="cblock";
00127 int multi=0,endblk,ii,n;
00128
00129 cur_type=type[0];
00130
00131 for (i=0;i<ncol;i++)
00132 if (type[i] != cur_type) {
00133 multi=1;
00134 break;
00135 }
00136 if (multi) {
00137 i=strlen(ltype);
00138 iarg=Rhs;
00139 CreateVarFromPtr(++iarg, "c", &one, &i, <ype);
00140 cur_type=type[0];
00141 i=0;cur_i=i;
00142
00143 while (1) {
00144 if (i < ncol)
00145 endblk=(type[i] != cur_type);
00146 else
00147 endblk=1;
00148 if (endblk) {
00149 colcount=i - cur_i;
00150 if (nrow==0) {
00151 CreateVar(++iarg, "d", &zero, &zero, &l);}
00152 else if ( (cur_type == SF_C) || (cur_type == SF_S) ) {
00153 if( (temp = (char **) MALLOC(nrow*colcount*sizeof(char **)))==NULL) return MEM_LACK;
00154 k=0;
00155 for (i1=cur_i;i1<i;i1++)
00156 for (j=0;j<nrow;j++) temp[k++]=data[i1+ncol*j].s;
00157 CreateVarFromPtr(++iarg, "S", &nrow, &colcount,temp);
00158 FREE(temp);
00159
00160
00161 }
00162 else {
00163 CreateVar(++iarg, "d", &nrow, &colcount, &l);
00164 ii=0;
00165 for (i1=cur_i;i1<i;i1++) {
00166 for ( j=0 ; j < nrow ; j++)
00167 *stk(l+j+nrow*ii)= data[i1+ncol*j].d;
00168 ii++;
00169 }
00170 }
00171 if (i>=ncol) break;
00172 cur_i=i;
00173 cur_type=type[i];
00174
00175 }
00176 i++;
00177 }
00178 n=iarg-Rhs;
00179
00180 iarg++;
00181 i=Rhs+1;
00182 C2F(mkmlistfromvars)(&i,&n);
00183 LhsVar(1)=i;
00184 }
00185 else {
00186 if (nrow==0) {
00187 CreateVar(Rhs+1, "d", &zero, &zero, &l);}
00188 else if ( (cur_type == SF_C) || (cur_type == SF_S) ) {
00189 if( (temp = (char **) MALLOC(nrow*ncol*sizeof(char **)))==NULL) return MEM_LACK;
00190 k=0;
00191 for (i1=0;i1<ncol;i1++)
00192 for (j=0;j<nrow;j++) temp[k++]=data[i1+ncol*j].s;
00193 CreateVarFromPtr(Rhs+1, "S", &nrow, &ncol, temp);
00194 FREE(temp);
00195
00196
00197 }
00198 else {
00199 CreateVar(Rhs+1, "d", &nrow, &ncol, &l);
00200 ii=0;
00201 for (i1=0;i1<ncol;i1++) {
00202 for ( j=0 ; j < nrow ; j++)
00203 *stk(l+j+nrow*ii)= data[i1+ncol*j].d;
00204 ii++;
00205 }
00206 }
00207 }
00208 LhsVar(1)=Rhs+1;
00209 }
00210 PutLhsVar();
00211 return 0;
00212 }
00213
00214
00215
00216
00217
00218 int Store_Scan __PARAMS((int *nrow, int *ncol, sfdir *type_s, sfdir *type, int *retval, int *retval_s, rec_entry *buf, entry **data, int rowcount, int n))
00219 {
00220 int i,j,nr,nc,err;
00221 entry * Data;
00222 int blk=20;
00223 nr=*nrow;
00224 nc=*ncol;
00225
00226 if (rowcount==0) {
00227 for ( i=0 ; i < MAXSCAN ; i++) type_s[i]=SF_F;
00228 if (nr<0) nr=blk;
00229 nc=n;
00230 *ncol=nc;
00231 *retval_s=*retval;
00232 if (n==0) {
00233 return 0;
00234 }
00235 if ( (*data = (entry *) MALLOC(nc*nr*sizeof(entry)))==NULL) {
00236 err= MEM_LACK;
00237 goto bad1;
00238 }
00239 for ( i=0 ; i < nc ; i++) type_s[i]=type[i];
00240
00241 }
00242 else {
00243
00244 if ( (n !=nc ) || (*retval_s != *retval) ){
00245 err=MISMATCH;
00246 goto bad2;
00247 }
00248
00249 for ( i=0 ; i < nc ; i++)
00250 if (type[i] != type_s[i]) {
00251 err=MISMATCH;
00252 goto bad2;
00253 }
00254
00255
00256 if (rowcount>= nr) {
00257 nr=nr+blk;
00258 *nrow=nr;
00259 if ( (*data = (entry *) REALLOC(*data,nc*nr*sizeof(entry)))==NULL) {
00260 err= MEM_LACK;
00261 goto bad2;
00262 }
00263 }
00264 }
00265 Data=*data;
00266
00267 for ( i=0 ; i < nc ; i++)
00268 {
00269 switch ( type_s[i] )
00270 {
00271 case SF_C:
00272 case SF_S:
00273 Data[i+nc*rowcount].s=buf[i].c;
00274 break;
00275 case SF_LUI:
00276 Data[i+nc*rowcount].d=(double)buf[i].lui;
00277 break;
00278 case SF_SUI:
00279 Data[i+nc*rowcount].d=(double)buf[i].sui;
00280 break;
00281 case SF_UI:
00282 Data[i+nc*rowcount].d=(double)buf[i].ui;
00283 break;
00284 case SF_LI:
00285 Data[i+nc*rowcount].d=(double)buf[i].li;
00286 break;
00287 case SF_SI:
00288 Data[i+nc*rowcount].d=(double)buf[i].si;
00289 break;
00290 case SF_I:
00291 Data[i+nc*rowcount].d=(double)buf[i].i;
00292 break;
00293 case SF_LF:
00294 Data[i+nc*rowcount].d=buf[i].lf;
00295 break;
00296 case SF_F:
00297 Data[i+nc*rowcount].d=(double)buf[i].f;
00298 break;
00299 }
00300 }
00301 return 0;
00302 bad1:
00303
00304 for ( j=0 ; j < MAXSCAN ; j++)
00305 if ( (type_s[j] == SF_C) || (type_s[j] == SF_S)) FREE(buf[j].c);
00306
00307 bad2:
00308 return err;
00309 }
00310
00311 void Free_Scan __PARAMS((int nrow, int ncol, sfdir *type_s, entry **data))
00312 {
00313 int i,j;
00314 entry * Data;
00315 Data=*data;
00316
00317 if (nrow != 0) {
00318 for ( j=0 ; j < ncol ; j++)
00319 if ( (type_s[j] == SF_C) || (type_s[j] == SF_S) )
00320
00321 for ( i=0 ; i < nrow ; i++) {
00322 FREE(Data[j+ncol*i].s);
00323 }
00324 }
00325
00326 if (ncol>0) FREE(Data);
00327 }
00328
00329
00330
00331
00332
00333
00334
00335 int SciStrtoStr __PARAMS((int *Scistring, int *nstring, int *ptrstrings, char **strh))
00336 {
00337 char *s,*p;
00338 int li,ni,*SciS,i,job=1;
00339
00340 li=ptrstrings[0];
00341 ni=ptrstrings[*nstring] - li + *nstring +1;
00342 p=(char *) MALLOC(ni);
00343 if (p ==NULL) return MEM_LACK;
00344 SciS= Scistring;
00345 s=p;
00346 for ( i=1 ; i<*nstring+1 ; i++)
00347 {
00348 ni=ptrstrings[i]-li;
00349 li=ptrstrings[i];
00350 F2C(cvstr)(&ni,SciS,s,&job,(long int)ni);
00351 SciS += ni;
00352 s += ni;
00353 if (i<*nstring) {
00354 *s='\n';
00355 s++;
00356 }
00357 }
00358 *s='\0';
00359 *strh=p;
00360 return 0;
00361 }
00362
00363