static Group *_LoadGroupList(FILE *file, Group *parent, int expected_indent, struct gcontext *gc) { Group *g; char *n; int i, ch; Group **glist=NULL; int gmax = 0; if ( expected_indent!=gc->found_indent ) return( NULL ); n = loadString(file,gc); if ( n==NULL ) return( NULL ); g = chunkalloc(sizeof(Group)); g->parent = parent; g->name = n; if ( (ch = getc(file))==':' ) ch = getc(file); while ( ch==' ' ) ch = getc(file); if ( ch=='1' ) g->unique = true; else if ( ch!='0' ) { GroupFree(g); return( NULL ); } while ( (ch = getc(file))==' ' ); if ( ch=='"' ) { ungetc(ch,file); g->glyphs = loadString(file,gc); if ( g->glyphs==NULL ) { GroupFree(g); return( NULL ); } lineCountIndent(file,gc); } else if ( ch=='\n' || ch=='\r' ) { ungetc(ch,file); lineCountIndent(file,gc); for ( i=0 ;; ++i ) { if ( i>=gmax ) { gmax += 10; glist = realloc(glist,gmax*sizeof(Group *)); } glist[i] = _LoadGroupList(file, g, expected_indent+1, gc); if ( glist[i]==NULL ) break; } g->kid_cnt = i; if ( i!=0 ) { g->kids = malloc(i*sizeof(Group *)); memcpy(g->kids,glist,i*sizeof(Group *)); free(glist); } } return( g ); }
void LoadGroupList(void) { char *groupfilename; FILE *groups; struct gcontext gc; groupfilename = getPfaEditGroups(); if ( groupfilename==NULL ) return; groups = fopen(groupfilename,"r"); if ( groups==NULL ) return; memset(&gc,0,sizeof(gc)); gc.found_indent = countIndent(groups); group_root = _LoadGroupList(groups,NULL,0,&gc); if ( !feof(groups)) LogError( _("Unparsed characters found after end of groups file (last line parsed was %d).\n"), gc.lineno ); fclose(groups); }