4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * Great Red Oystrich Makes All Chemists Sane
29 static char *SRCID_fgrid_c = "$Id$";
40 static char *type[] = {
41 "button", "radiobuttons", "groupbox", "checkbox",
42 "pixmap", "statictext", "edittext", "defbutton"
45 void ReadDlgError(char *infile,eDLGERR err,char *s,char *file,int line)
47 fprintf(stderr,"Error: ");
50 fprintf(stderr,"Not enough values for %s",s);
53 fprintf(stderr,"'grid' expected instead of %s",s);
56 fprintf(stderr,"'{' expected instead of %s",s);
59 fprintf(stderr,"'}' expected instead of %s",s);
62 fprintf(stderr,"'group' expected instead of %s",s);
65 fprintf(stderr,"item expected instead of %s",s);
68 fprintf(stderr,"grid point for %s already in use",s);
71 fprintf(stderr,"grid too wide for %s",s);
74 fprintf(stderr,"grid too high for %s",s);
77 fprintf(stderr,"quote expected instead of %s",s);
80 fprintf(stderr,"????");
83 fprintf(stderr," in file %s\n",infile);
84 fprintf(stderr,"C-File: %s, line: %d\n",file,line);
88 #define ReadDlgErr(in,er,es) ReadDlgError(in,er,es,__FILE__,__LINE__)
90 static void GetBuf(FILE *in, char *buf)
95 static void ReadAccOpen(char *infile, FILE *in)
100 if (strcmp(buf,"{")!=0)
101 ReadDlgErr(infile,eACCOEXP,buf);
104 static void ReadAccClose(char *infile, FILE *in)
109 if (strcmp(buf,"}")!=0)
110 ReadDlgErr(infile,eACCCEXP,buf);
113 void ReadQuoteString(char *infile, FILE *in, char *buf)
118 /* Read until first quote */
119 while ((c[0]=fgetc(in))!='"')
120 if (!isspace(c[0])) {
122 ReadDlgErr(infile,eQUOTE,c);
124 /* Read until second quote */
125 while ((c[0]=fgetc(in))!='"')
130 static void ReadQuoteStringOrAccClose(FILE *in, char *buf)
135 /* Read until first quote */
145 /* Read until second quote */
146 while ((c=fgetc(in))!='"')
151 static bool bNotAccClose(char *buf)
153 return (strcmp(buf,"}")!=0);
156 static t_fitem *NewFItem(void)
171 static t_fsimple *NewFSimple(void)
180 static void AddFItemName(t_fitem *fitem, char *name)
182 srenew(fitem->name,++fitem->nname);
183 fitem->name[fitem->nname-1]=strdup(name);
186 static t_fgroup *NewFGroup(void)
198 static void AddFGroupFItem(t_fgroup *fgroup, t_fitem *fitem)
200 srenew(fgroup->fitem,++fgroup->nfitem);
201 fgroup->fitem[fgroup->nfitem-1]=fitem;
204 static t_fgroup *AddFGridFGroup(t_fgrid *fgrid)
206 srenew(fgrid->fgroup,++fgrid->nfgroup);
207 fgrid->fgroup[fgrid->nfgroup-1]=NewFGroup();
208 return fgrid->fgroup[fgrid->nfgroup-1];
211 static t_fsimple *AddFGridFSimple(t_fgrid *fgrid)
213 srenew(fgrid->fsimple,++fgrid->nfsimple);
214 fgrid->fsimple[fgrid->nfsimple-1]=NewFSimple();
215 return fgrid->fsimple[fgrid->nfsimple-1];
218 static t_fgrid *NewFGrid(void)
233 static void DoneFItem(t_fitem *fitem)
237 for(i=0; (i<fitem->nname); i++)
238 sfree(fitem->name[i]);
246 static void DoneFGroup(t_fgroup *fgroup)
251 for(i=0; (i<fgroup->nfitem); i++)
252 DoneFItem(fgroup->fitem[i]);
253 sfree(fgroup->fitem);
256 static void DoneFSimple(t_fsimple *fsimple)
258 DoneFItem(fsimple->fitem);
259 sfree(fsimple->fitem);
262 void DoneFGrid(t_fgrid *fgrid)
266 for(i=0; (i<fgrid->nfgroup); i++)
267 DoneFGroup(fgrid->fgroup[i]);
268 sfree(fgrid->fgroup);
269 for(i=0; (i<fgrid->nfsimple); i++)
270 DoneFSimple(fgrid->fsimple[i]);
271 sfree(fgrid->fsimple);
274 static t_fitem *ScanFItem(char *infile, FILE *in, char *buf)
276 char set[STRLEN],get[STRLEN],help[STRLEN],def[STRLEN];
282 for(edlg=(edlgitem)0; (edlg<edlgNR+1); edlg++)
283 if (strcmp(buf,type[edlg])==0)
290 if (edlg==edlgNR+1) {
291 ReadDlgErr(infile,eITEMEXP,buf);
299 ReadQuoteString(infile,in,buf);
300 AddFItemName(fitem,buf);
304 ReadAccOpen(infile,in);
305 ReadQuoteStringOrAccClose(in,buf);
306 while (bNotAccClose(buf)) {
307 AddFItemName(fitem,buf);
308 ReadQuoteStringOrAccClose(in,buf);
313 ReadDlgErr(infile,eITEMEXP,type[edlg]);
318 ReadQuoteString(infile,in,set);
319 ReadQuoteString(infile,in,get);
320 ReadQuoteString(infile,in,def);
321 ReadQuoteString(infile,in,help);
322 fitem->set=strdup(set);
323 fitem->get=strdup(get);
324 fitem->def=strdup(def);
325 fitem->help=strdup(help);
330 t_fgrid *FGridFromFile(char *infile)
335 char newinfile[STRLEN];
342 in = libopen(infile);
344 if (strcmp(buf,"grid")!=0)
345 ReadDlgErr(infile,eGRIDEXP,buf);
347 if ((fscanf(in,"%d%d",&gridx,&gridy))!=2)
348 ReadDlgErr(infile,eNOVALS,"grid w,h");
351 ReadAccOpen(infile,in);
353 while (bNotAccClose(buf)) {
354 if (strcmp(buf,"group")==0) {
355 fgroup=AddFGridFGroup(fgrid);
356 ReadQuoteString(infile,in,buf);
357 fgroup->name=strdup(buf);
358 if ((fscanf(in,"%d%d%d%d",&fgroup->x,&fgroup->y,&fgroup->w,&fgroup->h))!=4)
359 ReadDlgErr(infile,eNOVALS,"group x,y,w,h");
360 if (fgroup->x+fgroup->w > gridx)
361 ReadDlgErr(infile,eTOOWIDE,buf);
362 if (fgroup->y+fgroup->h > gridy)
363 ReadDlgErr(infile,eTOOHIGH,buf);
364 ReadAccOpen(infile,in);
366 while (bNotAccClose(buf)) {
367 AddFGroupFItem(fgroup,ScanFItem(infile,in,buf));
371 else if (strcmp(buf,"simple")==0) {
372 fsimple=AddFGridFSimple(fgrid);
373 if ((fscanf(in,"%d%d%d%d",&fsimple->x,&fsimple->y,&fsimple->w,&fsimple->h))!=4)
374 ReadDlgErr(infile,eNOVALS,"simple x,y,w,h");
375 if (fsimple->x+fsimple->w > gridx)
376 ReadDlgErr(infile,eTOOWIDE,"simple");
377 if (fsimple->y+fsimple->h > gridy)
378 ReadDlgErr(infile,eTOOHIGH,"simple");
379 ReadAccOpen(infile,in);
381 fsimple->fitem=ScanFItem(infile,in,buf);
382 ReadAccClose(infile,in);
391 static void DumpFItem(t_fitem *fitem)
395 printf(" type: %s, set: '%s', get: '%s', def: '%s', help: '%s'\n {",
396 type[fitem->edlg],fitem->set,fitem->get,fitem->def,fitem->help);
397 for(i=0; (i<fitem->nname); i++)
398 printf(" '%s'",fitem->name[i]);
402 static void DumpFSimple(t_fsimple *fsimple)
404 printf("Simple %dx%d at %d,%d\n",fsimple->w,fsimple->h,fsimple->x,fsimple->y);
405 DumpFItem(fsimple->fitem);
408 static void DumpFGroup(t_fgroup *fgroup)
412 printf("Group %dx%d at %d,%d\n",fgroup->w,fgroup->h,fgroup->x,fgroup->y);
413 for(i=0; (i<fgroup->nfitem); i++)
414 DumpFItem(fgroup->fitem[i]);
417 void DumpFGrid(t_fgrid *fgrid)
421 printf("Grid %dx%d\n",fgrid->w,fgrid->h);
422 for(i=0; (i<fgrid->nfgroup); i++)
423 DumpFGroup(fgrid->fgroup[i]);
424 for(i=0; (i<fgrid->nfsimple); i++)
425 DumpFSimple(fgrid->fsimple[i]);