/* defexec.c
* Copyright (c) MIT/JGOFS
A version of def which allows subshells to be executed rather than files
- All columns must be tab separated - spaces will be incorporated into
the strings
- Where def normally expects a filename, one can put a command
enclosed in parentheses. This command will be executed as the
stdout from the command will be treated as the contents of the file.
Example:
toplevel file:
# The physics here is a two-dimensional turbulence calculation
# in a 64x64 psuedospectral model.
#
experiment description mpeg_movie >
time
u0 "Passive particles " "u0_mpeg" (/d5/glenn/qgmod/patch/modhtml1 u0)
u3 "Attracting particles (u=3)" "u3_mpeg" (/d5/glenn/qgmod/patch/modhtml1 u3)
u6 "Attracting particles (u=6)" "u6_mpeg" (/d5/glenn/qgmod/patch/modhtml1 u6)
t0 "Tracer patch (only filtering)" "t0_mpeg" (/d5/glenn/qgmod/patch/modhtml1 t0)
t2f "Tracer patch (hyperviscosity)" "t2f_mpeg" (/d5/glenn/qgmod/patch/modhtml1 t2f)
script modhtml1
#!/bin/csh -f
cd /d5/glenn/qgmod/patch
echo "time"
foreach g ($1.*.Z)
set h=$g:r
set n=$h:e
echo \"\$n\\"
end
___________________
September 1995 Christine Hammond
change to add field width determination based on width of
the label in the data. Preparer must determine max width
of column from inspection of data column width.
Ex: event___ , sta__ ,bot
will give lengths of 8, 5, and 3 for the respective cols
September 1995 Christine Hammond
change to allow subfiles to be located in different
directories from header file, based on absolute filename
given as the sub-filename
*/
#include
#include
double atof();
#define DIRSEP '/'
/* #define DEBUG */
#define TOKEN 80
#define NVAR 250
#define COMMENTSIZE 2430
#define SEPARATOR "\t,\n"
#define W_EXTEND '_'
char tabnames[NVAR][TOKEN];
char tabvalues[NVAR][TOKEN];
char tabattributes[NVAR][TOKEN];
char tabcomments[COMMENTSIZE];
int tabwidths[NVAR];
int nvarlevel[6];
int fileopen[5] = {0,0,0,0,0};
FILE *fl[5];
int maxlev;
int pointers[NVAR];
char dirstring[80];
err(s,t)
char *s,*t;
{
printf("&x %s%s\n",s,t);
exit(1);
}
proclabel(n, ptr, attr)
int n;
char *ptr, attr[];
/*
routine to determine the length of the title string indexed at 'n' and
pointed to by 'ptr', and based on the idea that the user preparing the
data has placed W_EXTEND characters to pad the title to the desired
width. An attribute is constructed to be saved in the calling routine,
beginning with 'width='. Then, the W_EXTEND characters must be
stripped from the tabnames. Same name separators are used as before
(space, tab, comma, newline).
*/
{
int len;
/* so as not to overwrite an attribute,
and to check for an explicit width attribute */
if (attr == NULL || strncmp(attr,"width=",6) != 0) {
/* assign to field width the len of (possibly) extended label */
len = strlen(ptr);
sprintf(attr, "width=%d", len);
}
/* strip off the column extenders from the label */
striptoken(ptr);
/* and save label name without the extra W_EXTEND characters */
strcpy(tabnames[n], ptr);
return;
}
striptoken(p)
char *p;
{
char *tp;
int i;
/* if there are extending characters at end of string, strip them */
i = strlen(p);
while ( (tp = strrchr(p,W_EXTEND)) == p+i-1) {
*tp = '\0'; /* shorten string by that one extend char */
i = strlen(p);
};
return;
}
int scanheader(lev)
int lev;
{
int ncnt,i,j,k,m;
char tmp[1258],*tok,attrsav[TOKEN],*attr;
ncnt= 0;
i=0;j=1;
if(lev>0){
for(i=nvarlevel[lev-1];i")) {
for(k=nvarlevel[lev-1];k') ncnt--; else j=0;
nvarlevel[i]=ncnt;
if(j) i++;
} else j=0;
};
if(lev==0)maxlev=i; else
for(i=lev;i=0;i--)if (*vn >= nvarlevel[i]) return i+1;
return 0;
}
int ioattrout_(vn,str)
int *vn;
char *str;
{
char *at;
int j;
j= *vn;
/* if there IS an attribute, find one and move next one to front of string */
if (tabattributes[j][0]){
at=strchr(tabattributes[j],';');
if(at){
*at = '\0';
strcpy(str,tabattributes[j]);
if (strncmp(str,"width=",6) == 0) { /* width attr, use it for tabwidths */
getwidth(&j,str);
str = '\0'; /* don't show the width attr */
}
strcpy(tabattributes[j],at+1);
} else { /* this is the only attribute for variable vn */
strcpy(str,tabattributes[j]);
if (strncmp(str,"width=",6) == 0) {
getwidth(&j,str);
str = '\0';
}
tabattributes[j][0]='\0';
};
return 1;
} else return 0;
}
iovalreal_(vn,f)
int *vn;
float *f;
{
int i;
i=pointers[*vn];
if(i<0){*f= -9999.0;return;};
if(strspn(tabvalues[i],"0123456789.+-"))
*f=atof(tabvalues[i]);
else
*f= -9999.0;
#ifdef DEBUG
printf("iovalreal %d %f\n",*vn,f);
#endif
}
iovalstr_(vn,tmp)
int *vn;
char *tmp;
{
static char *s;
int i;
i=pointers[*vn];
if(i<0){strcpy(tmp,"nd");return;};
s=tabvalues[i];
s=s+strspn(s," ");
strcpy(tmp,s);
#ifdef DEBUG
printf("iovalstr %d %s\n",*vn,tmp);
#endif
}
static char subfilename[80];
FILE *fin;
int ioreadrec_(level)
int *level;
{
char tmp[1258],*tok;
int i,j,k;
#ifdef DEBUG
printf("ioreadrec %d\n",*level);
#endif
k= *level;
if (! fileopen[k]) {
#ifdef DEBUG
printf("open %s\n",subfilename);
#endif
if(*subfilename == '('){
subfilename[strlen(subfilename)-1]=0;
startchild(subfilename+1,&fin,fl+k);
}
else if((fl[k]=fopen(subfilename,"r")) == NULL)
err("Missing file ",subfilename);
scanheader(k);
fileopen[k]=1;
};
j=1;
while(j){
if(fgets(tmp,1257,fl[k]) == NULL){
#ifdef DEBUG
printf("eof at level %d\n",k);
#endif
fclose(fl[k]);
fileopen[k]=0;
return 0;
};
i=strspn(tmp,SEPARATOR);
if(i