/* $Id: loaddata.c,v 1.1 1996/05/04 19:08:18 yoneyama Exp yoneyama $ */ /************************************************************************ * SameGame for X Window (sxsame) * * Copyleft (c) 1994-1996 Software Research Academy * ************************************************************************/ #include #include #include #include #include "config.h" #include "sxsame.h" static char *NextLineGets( #if NeedFunctionPrototypes char *, int, FILE * #endif ); static void StrSmall( #if NeedFunctionPrototypes char * #endif ); static DataFile **datafiles; int CheckSameDataFile(data) DataFile ***data; { FILE *fp; char fname[MAXPATHLEN]; char buf[256]; char str1[256]; char str2[256]; char *entry_name = OTHER_DATA_FILE; int entries = 0; char *p; int i; if (MAXPATHLEN <= strlen(entry_name)) { fprintf(stderr,"Error: data file name too long.\n"); return 0; } strcpy(fname,entry_name); fp = fopen(fname, "r"); if(fp == NULL) { if (MAXPATHLEN <= snprintf(fname, MAXPATHLEN ,"%s/%s", SAME_DIR, entry_name)) { fprintf(stderr,"Error: data file name too long.\n"); return 0; } fp = fopen(fname, "r"); if(fp == NULL) return(0); } while(fgets(buf,256,fp)!=NULL) { if((p=(char *)strchr(buf,'#'))!=NULL) *p = '\0'; if(sscanf(buf,"%s%s",str1,str2)<2) continue; entries++; } if(entries == 0) return(0); rewind(fp); datafiles = (DataFile **)malloc(sizeof(DataFile *)*(entries+1)); for(i=0;ititle = (char *)malloc(strlen(str1)+1); datafiles[i]->fname = (char *)malloc(strlen(str2)+1); datafiles[i]->lock = 0; strcpy(datafiles[i]->title, str1); strcpy(datafiles[i]->fname, str2); } datafiles[i] = 0; fclose(fp); *data = datafiles; return(entries); } int file_line; int LoadSameData(data, fname) ImportSameData *data; char *fname; { FILE *fp; char tmpfname[MAXPATHLEN]; char buf[256]; char str1[256],str2[256]; int val, i, j; data->box = 0; data->box_color = 0; data->selected = 0; data->pushed = 0; for(i=0;i<3;i++) { for(j=0;j<5;j++) { data->xpm_data[i][j] = 0; } } data->bg_data = 0; data->frame_data = 0; fp = fopen(fname,"r"); if(fp == NULL) { if (MAXPATHLEN <= snprintf(tmpfname, MAXPATHLEN, "%s/%s", SAME_DIR, fname)) { fprintf(stderr,"Error: data file name too long.\n", fname); return -1; } fp = fopen(tmpfname, "r"); if(fp == NULL) { fprintf(stderr,"Error: can't open file '%s'.\n", fname); return(-1); } } file_line = 0; while(NextLineGets(buf,256,fp)!=NULL) { val = sscanf(buf,"%s%s",str1,str2); if(val == 2) { StrSmall(str1); if(strcmp(str1,"box")==NULL) { data->box = 1; data->box_color=(char *)malloc(strlen(str2)+1); strcpy(data->box_color, str2); } else if(strcmp(str1,"width")==NULL) { data->width = atoi(str2); if(data->width < 0) goto error_return; } else if(strcmp(str1,"height")==NULL) { data->height = atoi(str2); if(data->height < 0) goto error_return; } else fprintf(stderr,"Warning: '%s': unknown keyword '%s' line %d.\n", fname, str1, file_line); } else if(val == 1) { StrSmall(str1); if(strcmp(str1,"default")==NULL) { for(i=0;i<5;i++) { if(NextLineGets(buf,256,fp)==NULL) goto error_return; sscanf(buf,"%s",str2); data->xpm_data[0][i] = (char *)malloc(strlen(str2)+1); strcpy(data->xpm_data[0][i], str2); } } else if(strcmp(str1,"selected")==NULL) { data->selected = 1; for(i=0;i<5;i++) { if(NextLineGets(buf,256,fp)==NULL) goto error_return; sscanf(buf,"%s",str2); data->xpm_data[1][i] = (char *)malloc(strlen(str2)+1); strcpy(data->xpm_data[1][i], str2); } } else if(strcmp(str1,"pushed")==NULL) { data->pushed = 1; for(i=0;i<5;i++) { if(NextLineGets(buf,256,fp)==NULL) goto error_return; sscanf(buf,"%s",str2); data->xpm_data[2][i] = (char *)malloc(strlen(str2)+1); strcpy(data->xpm_data[2][i], str2); } } else if(strcmp(str1,"background")==NULL) { if(NextLineGets(buf,256,fp)==NULL) goto error_return; sscanf(buf,"%s",str2); data->bg_data = (char *)malloc(strlen(str2)+1); strcpy(data->bg_data, str2); } else if(strcmp(str1,"frame")==NULL) { if(NextLineGets(buf,256,fp)==NULL) goto error_return; sscanf(buf,"%s",str2); data->frame_data = (char *)malloc(strlen(str2)+1); strcpy(data->frame_data, str2); } else fprintf(stderr,"Warning: '%s': unknown keyword '%s' line %d.\n", fname, str1, file_line); } } if(data->box == 1 && data->box_color == 0) { data->box_color = (char *)malloc(6); strcpy(data->box_color,"white"); } return(0); error_return: fprintf(stderr,"Error: invalid value '%s' line %d.\n", fname, file_line); return(-1); } static char *NextLineGets(buf, len, fp) char *buf; int len; FILE *fp; { char *p; int i; do { if(fgets(buf, len, fp) == NULL) return(NULL); file_line ++; if((p = (char *)strchr(buf, '#')) != NULL) *p = '\0'; for(i=0;i ' ') break; } while(buf[i] <= ' '); return(buf); } static void StrSmall(str) char *str; { while(*str != '\0') { if(*str >= 'A' && *str <= 'Z') *str |= 0x20; str++; } }