#include "../stack-c.h"
/*
int C2F(test)()
{
int sz[3],nz,nf,retval;
char* fnames[2];
printf("ici\n");
sz[0]=2;
sz[1]=3;
sz[2]=2;
nz=3;
fnames[0]="A";
fnames[1]="Foo";
nf=2;
Top = Top +1;
C2F(structcreate)(&Top, &nz, sz, &nf, fnames, &retval);
printf("la\n");
}
*/
#define memused(it,mn) ((((mn)*( it % 10))/sizeof(int))+1)
#include "../stack-c.h"
/* Table of constant values */
static integer c17 = 17;
static integer c1 = 1;
static integer c4 = 4;
int C2F(structcreate)(lw, nz, sz, nf, fnames,retval)
integer *lw, *nz, *sz, *nf, *retval;
char *fnames[];
{
integer next,k,lr;
static integer l;
static integer l0, n1, il;
*retval = 0;
l0 = *Lstk(*lw);
C2F(intersci).ntypes[*lw -Top + Rhs - 1] = '$';
C2F(intersci).iwhere[*lw -Top + Rhs - 1] = *Lstk(*lw);
if (*lw > intersiz) {
Scierror(998,"Too many arguments in the stack edit stack.h and enlarge intersiz\r\n");
return 1;
}
/* size of first entry of the mlist (type) */
structtyp(&n1, "size");
*retval = 1;
/* create the mlist header */
il = iadr(l0);
Err = sadr(il+6) + n1 - *Lstk(Bot);
if (Err > 0) {
C2F(error)(&c17);
return 1;
}
*istk(il) = 17;
*istk(il+1) = 3+*nf;
*istk(il + 2) = 1;
/* set mlist type entry */
l = sadr(il+6+*nf);
structtyp(istk(iadr(l)), "set");
*istk(il + 3) = *istk(il + 2) + n1;
l += n1;
/* set dims entry (int32 matrix) */
if (!C2F(creimati)("structcreate", &l, &c4, nz, &c1, &lr, &c1, 12L)) return 1;
C2F(icopy)(nz,sz,&c1,istk(lr),&c1);
n1 = sadr(iadr(l)+4) + memused(c4,*nz) - l;
*istk(il + 4) = *istk(il + 3) + n1;
l += n1;
/* set fields names entry (vector of strings)*/
if (!cre_smat_from_str_i("structcreate", &l, nf, &c1, fnames, 12L ,&next)) return 1;
n1 = next - l;
*istk(il + 5) = *istk(il + 4) + n1;
l += n1;
/* set struct fields (empty lists)*/
for (k=0;k<*nf;k++)
{
creemptylist(&l,&next);
n1 = next - l;
l += n1;
*istk(il + 6 + k) = *istk(il + 5 + k) + n1;
}
*Lstk(*lw+1)=l;
}
int creemptylist(slw,lw)
integer *slw, *lw;
{
integer ix1;
integer il;
il = iadr(*slw);
*istk(il ) = 15;
*istk(il + 1) = 0;
*istk(il + 2) = 1;
ix1 = il + + 3;
*lw = sadr(ix1);
return 0;
}
int structtyp(ivt, job)
integer *ivt;
char *job;
{
/* Local variables */
static integer l;
/* definition of first field of tlist's type: struct */
/* tlist fields are: */
/* dims */
/* fields */
/* Parameter adjustments */
--ivt;
if (strcmp(job, "size") == 0) {
/* size of the data structure */
ivt[1] = 24;
} else if (strcmp(job, "nchar") == 0) {
/* number of chars defining the type field */
ivt[1] = 16;
} else if (strcmp(job, "nfield") == 0) {
/* number of fields in the tlist */
ivt[1] = 3;
} else if (strcmp(job, "ptr") == 0) {
/* pointers on individual strings */
ivt[1] = 1;
ivt[2] = 7;
ivt[3] = 11;
ivt[4] = 17;
} else {
/* Character string Variable header */
ivt[1] = 10;
ivt[2] = 1;
ivt[3] = 3;
ivt[4] = 0;
ivt[5] = 1;
l = 8;
/* entry (1,1) = "struct" */
ivt[l + 1] = 28;
ivt[l + 2] = 29;
ivt[l + 3] = 27;
ivt[l + 4] = 30;
ivt[l + 5] = 12;
ivt[l + 6] = 29;
ivt[6] = ivt[5] + 6;
l += 6;
/* entry (2,1) = "dims" */
ivt[l + 1] = 13;
ivt[l + 2] = 18;
ivt[l + 3] = 22;
ivt[l + 4] = 28;
ivt[7] = ivt[6] + 4;
l += 4;
/* entry (3,1) = "fields" */
ivt[l + 1] = 15;
ivt[l + 2] = 18;
ivt[l + 3] = 14;
ivt[l + 4] = 21;
ivt[l + 5] = 13;
ivt[l + 6] = 28;
ivt[8] = ivt[7] + 6;
l += 6;
}
return 0;
} /* structtyp_ */
syntax highlighted by Code2HTML, v. 0.9.1