4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-2001
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * Do check out http://www.gromacs.org , or mail us at gromacs@gromacs.org .
34 * Giving Russians Opium May Alter Current Situation
36 static char *SRCID_fgrid_c = "$Id$";
46 static char *type[] = {
47 "button", "radiobuttons", "groupbox", "checkbox",
48 "pixmap", "statictext", "edittext", "defbutton"
51 void ReadDlgError(char *infile,eDLGERR err,char *s,char *file,int line)
53 fprintf(stderr,"Error: ");
56 fprintf(stderr,"Not enough values for %s",s);
59 fprintf(stderr,"'grid' expected instead of %s",s);
62 fprintf(stderr,"'{' expected instead of %s",s);
65 fprintf(stderr,"'}' expected instead of %s",s);
68 fprintf(stderr,"'group' expected instead of %s",s);
71 fprintf(stderr,"item expected instead of %s",s);
74 fprintf(stderr,"grid point for %s already in use",s);
77 fprintf(stderr,"grid too wide for %s",s);
80 fprintf(stderr,"grid too high for %s",s);
83 fprintf(stderr,"quote expected instead of %s",s);
86 fprintf(stderr,"????");
89 fprintf(stderr," in file %s\n",infile);
90 fprintf(stderr,"C-File: %s, line: %d\n",file,line);
94 #define ReadDlgErr(in,er,es) ReadDlgError(in,er,es,__FILE__,__LINE__)
96 static void GetBuf(FILE *in, char *buf)
101 static void ReadAccOpen(char *infile, FILE *in)
106 if (strcmp(buf,"{")!=0)
107 ReadDlgErr(infile,eACCOEXP,buf);
110 static void ReadAccClose(char *infile, FILE *in)
115 if (strcmp(buf,"}")!=0)
116 ReadDlgErr(infile,eACCCEXP,buf);
119 void ReadQuoteString(char *infile, FILE *in, char *buf)
124 /* Read until first quote */
125 while ((c[0]=fgetc(in))!='"')
126 if (!isspace(c[0])) {
128 ReadDlgErr(infile,eQUOTE,c);
130 /* Read until second quote */
131 while ((c[0]=fgetc(in))!='"')
136 static void ReadQuoteStringOrAccClose(FILE *in, char *buf)
141 /* Read until first quote */
151 /* Read until second quote */
152 while ((c=fgetc(in))!='"')
157 static bool bNotAccClose(char *buf)
159 return (strcmp(buf,"}")!=0);
162 static t_fitem *NewFItem(void)
177 static t_fsimple *NewFSimple(void)
186 static void AddFItemName(t_fitem *fitem, char *name)
188 srenew(fitem->name,++fitem->nname);
189 fitem->name[fitem->nname-1]=strdup(name);
192 static t_fgroup *NewFGroup(void)
204 static void AddFGroupFItem(t_fgroup *fgroup, t_fitem *fitem)
206 srenew(fgroup->fitem,++fgroup->nfitem);
207 fgroup->fitem[fgroup->nfitem-1]=fitem;
210 static t_fgroup *AddFGridFGroup(t_fgrid *fgrid)
212 srenew(fgrid->fgroup,++fgrid->nfgroup);
213 fgrid->fgroup[fgrid->nfgroup-1]=NewFGroup();
214 return fgrid->fgroup[fgrid->nfgroup-1];
217 static t_fsimple *AddFGridFSimple(t_fgrid *fgrid)
219 srenew(fgrid->fsimple,++fgrid->nfsimple);
220 fgrid->fsimple[fgrid->nfsimple-1]=NewFSimple();
221 return fgrid->fsimple[fgrid->nfsimple-1];
224 static t_fgrid *NewFGrid(void)
239 static void DoneFItem(t_fitem *fitem)
243 for(i=0; (i<fitem->nname); i++)
244 sfree(fitem->name[i]);
252 static void DoneFGroup(t_fgroup *fgroup)
257 for(i=0; (i<fgroup->nfitem); i++)
258 DoneFItem(fgroup->fitem[i]);
259 sfree(fgroup->fitem);
262 static void DoneFSimple(t_fsimple *fsimple)
264 DoneFItem(fsimple->fitem);
265 sfree(fsimple->fitem);
268 void DoneFGrid(t_fgrid *fgrid)
272 for(i=0; (i<fgrid->nfgroup); i++)
273 DoneFGroup(fgrid->fgroup[i]);
274 sfree(fgrid->fgroup);
275 for(i=0; (i<fgrid->nfsimple); i++)
276 DoneFSimple(fgrid->fsimple[i]);
277 sfree(fgrid->fsimple);
280 static t_fitem *ScanFItem(char *infile, FILE *in, char *buf)
282 char set[STRLEN],get[STRLEN],help[STRLEN],def[STRLEN];
288 for(edlg=(edlgitem)0; (edlg<edlgNR+1); edlg++)
289 if (strcmp(buf,type[edlg])==0)
296 if (edlg==edlgNR+1) {
297 ReadDlgErr(infile,eITEMEXP,buf);
305 ReadQuoteString(infile,in,buf);
306 AddFItemName(fitem,buf);
310 ReadAccOpen(infile,in);
311 ReadQuoteStringOrAccClose(in,buf);
312 while (bNotAccClose(buf)) {
313 AddFItemName(fitem,buf);
314 ReadQuoteStringOrAccClose(in,buf);
319 ReadDlgErr(infile,eITEMEXP,type[edlg]);
324 ReadQuoteString(infile,in,set);
325 ReadQuoteString(infile,in,get);
326 ReadQuoteString(infile,in,def);
327 ReadQuoteString(infile,in,help);
328 fitem->set=strdup(set);
329 fitem->get=strdup(get);
330 fitem->def=strdup(def);
331 fitem->help=strdup(help);
336 t_fgrid *FGridFromFile(char *infile)
341 char newinfile[STRLEN];
348 in = libopen(infile);
350 if (strcmp(buf,"grid")!=0)
351 ReadDlgErr(infile,eGRIDEXP,buf);
353 if ((fscanf(in,"%d%d",&gridx,&gridy))!=2)
354 ReadDlgErr(infile,eNOVALS,"grid w,h");
357 ReadAccOpen(infile,in);
359 while (bNotAccClose(buf)) {
360 if (strcmp(buf,"group")==0) {
361 fgroup=AddFGridFGroup(fgrid);
362 ReadQuoteString(infile,in,buf);
363 fgroup->name=strdup(buf);
364 if ((fscanf(in,"%d%d%d%d",&fgroup->x,&fgroup->y,&fgroup->w,&fgroup->h))!=4)
365 ReadDlgErr(infile,eNOVALS,"group x,y,w,h");
366 if (fgroup->x+fgroup->w > gridx)
367 ReadDlgErr(infile,eTOOWIDE,buf);
368 if (fgroup->y+fgroup->h > gridy)
369 ReadDlgErr(infile,eTOOHIGH,buf);
370 ReadAccOpen(infile,in);
372 while (bNotAccClose(buf)) {
373 AddFGroupFItem(fgroup,ScanFItem(infile,in,buf));
377 else if (strcmp(buf,"simple")==0) {
378 fsimple=AddFGridFSimple(fgrid);
379 if ((fscanf(in,"%d%d%d%d",&fsimple->x,&fsimple->y,&fsimple->w,&fsimple->h))!=4)
380 ReadDlgErr(infile,eNOVALS,"simple x,y,w,h");
381 if (fsimple->x+fsimple->w > gridx)
382 ReadDlgErr(infile,eTOOWIDE,"simple");
383 if (fsimple->y+fsimple->h > gridy)
384 ReadDlgErr(infile,eTOOHIGH,"simple");
385 ReadAccOpen(infile,in);
387 fsimple->fitem=ScanFItem(infile,in,buf);
388 ReadAccClose(infile,in);
397 static void DumpFItem(t_fitem *fitem)
401 printf(" type: %s, set: '%s', get: '%s', def: '%s', help: '%s'\n {",
402 type[fitem->edlg],fitem->set,fitem->get,fitem->def,fitem->help);
403 for(i=0; (i<fitem->nname); i++)
404 printf(" '%s'",fitem->name[i]);
408 static void DumpFSimple(t_fsimple *fsimple)
410 printf("Simple %dx%d at %d,%d\n",fsimple->w,fsimple->h,fsimple->x,fsimple->y);
411 DumpFItem(fsimple->fitem);
414 static void DumpFGroup(t_fgroup *fgroup)
418 printf("Group %dx%d at %d,%d\n",fgroup->w,fgroup->h,fgroup->x,fgroup->y);
419 for(i=0; (i<fgroup->nfitem); i++)
420 DumpFItem(fgroup->fitem[i]);
423 void DumpFGrid(t_fgrid *fgrid)
427 printf("Grid %dx%d\n",fgrid->w,fgrid->h);
428 for(i=0; (i<fgrid->nfgroup); i++)
429 DumpFGroup(fgrid->fgroup[i]);
430 for(i=0; (i<fgrid->nfsimple); i++)
431 DumpFSimple(fgrid->fsimple[i]);