int main() { int n, i, j, m, k, mark, len; while(scanf("%d", &n) == 1) { for(i = 0; i < n; i++) scanf("%s", a[i]); scanf("%s", s); m = strlen(s); for(i = 0; i < n; i++) { len = strlen(a[i]); for(j = 0, k = 0; j < len, k < m; j++, k++) { if(cmpch(a[i][j], s[k])) continue; else { if(s[k] != '[') goto out; else { mark = 0; k = k + 1; while(s[k] != ']') { if(cmpch(a[i][j], s[k])) mark = 1; k++; } if(mark == 0) goto out; } } } out: if((j == len) && (k == m)) printf("%d %s\n", i + 1, a[i]); } } return 0; }
char *stnvar (char *ch, char *vnam, struct gafile *pfi, struct gavar *pvar, struct gastat *pst) { struct gastn *stn; gadouble dmin[5],dmax[5],d,radius; gaint id[6],dim,size,i,rc,rflag,sflag; char *pos; char stid[10]; rflag = 0; sflag = 0; radius = 0; /* We want to finish parsing the variable name by looking at any dimension settings by the user. First initialize the request environment to that found in the pst. */ for (i=0;i<3;i++) { dmin[i] = pst->dmin[i]; dmax[i] = pst->dmax[i]; } dmin[3] = t2gr(pfi->abvals[3],&(pst->tmin)); dmax[3] = t2gr(pfi->abvals[3],&(pst->tmax)); /* Check for user provided dimension expressions */ if (*ch=='(') { ch++; for (i=0;i<6;i++) id[i] = 0; while (*ch!=')') { if (!cmpch(ch,"stid=",5)) { /* special stid= arg */ for (i=0; i<8; i++) stid[i] = ' '; stid[8] = '\0'; pos = ch+5; i=0; while (*pos!=',' && *pos!=')' && i<8) { stid[i] = *pos; pos++; i++; } if (i==0) { gaprnt (0,"Dimension Expression Error: No stid provided\n"); pos=NULL; } if (i>8) { gaprnt (0,"Dimension Expression Error: stid too long\n"); pos=NULL; } dim=11; } else { pos = dimprs(ch, pst, pfi, &dim, &d, 0, &rc); } if (pos==NULL) { sprintf (pout," Variable name = %s\n",vnam); gaprnt (0,pout); return (NULL); } if (dim<6 && id[dim]>1) { gaprnt (0,"Syntax Error: Invalid dimension expression\n"); gaprnt (0," Same dimension specified more than twice "); sprintf (pout,"for variable = %s\n",vnam); gaprnt (0,pout); return (NULL); } if ( dim==pst->idim || dim==pst->jdim || ( dim>3 && (pst->idim==0 || pst->idim==1 || pst->jdim==1))) { gaprnt (0,"Data Request Error: Invalid dimension expression\n"); gaprnt (0," Attempt to set or modify varying dimension\n"); sprintf (pout," Variable = %s, Dimension = %i \n",vnam,dim); gaprnt (0,pout); return (NULL); } if (dim==10) { rflag = 1; radius = d; } else if (dim==11) { sflag = 1; } else { if (id[dim]==0) dmin[dim] = d; dmax[dim] = d; } ch = pos; if (*ch == ',') ch++; id[dim]++; } ch++; } /* Verify that dmin is less than or equal to dmax for all our dims */ for (i=0; i<4; i++) { if ((i!=2 && dmin[i]>dmax[i]) || (i==2 && dmax[i]>dmin[i])) { gaprnt (0,"Data Request Error: Invalid grid coordinates\n"); sprintf (pout," Varying dimension %i decreases: %g to %g \n",i,dmin[i],dmax[i]); gaprnt (0,pout); sprintf (pout," Error ocurred getting variable '%s'\n",vnam); gaprnt (0,pout); return (NULL); } } /* Looks like the user specified good stuff, and we are ready to try to get some data. Allocate and fill in a gastn block. */ size = sizeof(struct gastn); stn = (struct gastn *)galloc(size,"stn"); if (stn==NULL) { gaprnt (0,"Memory Allocation Error: Station Request Block \n"); return (NULL); } stn->rnum = 0; stn->rpt = NULL; stn->pfi = pfi; stn->idim = pst->idim; stn->jdim = pst->jdim; stn->undef = pfi->undef; stn->tmin = dmin[3]; stn->tmax = dmax[3]; stn->ftmin = dmin[3]; stn->ftmax = dmax[3]; stn->pvar = pvar; for (i=0; i<3; i++) { stn->dmin[i] = dmin[i]; stn->dmax[i] = dmax[i]; } stn->rflag = rflag; stn->radius = radius; stn->sflag = sflag; if (sflag) { for (i=0; i<8; i++) stn->stid[i] = stid[i]; } stn->tvals = (gadouble *)galloc(sizeof(gadouble)*8,"stntvals"); if (stn->tvals==NULL) { gree(stn,"f170"); gaprnt (0,"Memory Allocation Error: Station Request Block \n"); return (NULL); } for (i=0; i<8; i++) *(stn->tvals+i) = *(pfi->grvals[3]+i); rc = gagstn (stn); if (rc) { sprintf (pout,"Data Request Error: Variable is '%s'\n",vnam); gaprnt (0,pout); gree(stn,"f171"); return (NULL); } pst->result.stn = stn; pst->type = 0; return (ch); }