/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ABERED (AberMUD Dirt3 editor) * * * * The IO from loc_io.c, obj_io.c and mob_io.c are just linked together here * * * * Copyright (C) 1993 James Willie. All rights reseved. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include <stdio.h> #include <ctype.h> #include "types.h" #include "macros.h" #include "extern.h" #include "prototyp.h" int line = 1; /* Counts current line number for error reports */ extern char *glob_table[]; /* ** save data in dirt format */ void save_dirt() { FILE *f; char buf[30]; POBJ o; PLOC l; PMOB m; if (EMPTY(arg[0])) strcpy(buf,fzn); else strcpy(buf,arg[0]); f = fopen(buf, "w"); if (f == NULL) { printf("Error opening the save file %s",buf); return; } printf("Saving.\n"); if (comment != NULL) { fprintf(f, "/*%s*/\n\n", comment); } fprintf(f, "#include \"ctypes.h\"\n"); fprintf(f, "#include \"undef.h\"\n"); fprintf(f, "#include \"exits.h\"\n"); fprintf(f, "\n%%mobiles\n\n"); for (m = mob; m != NULL; m = m->next) write_dirt_mob(m,f); fprintf(f, "%%objects\n\n"); for (o = obj; o != NULL; o = o->next) write_dirt_obj(f,o); fprintf(f, "%%locations\n\n"); for (l = loc; l != NULL; l = l->next) write_dirt_loc(l,f); fclose(f); modified = FALSE; return; } /* ** Reads the controlling parts of the dirt zone file which specify ** if we have a group of locations, object etc. Also in general ignores ** anything it doesn't understand, except the very first comment */ void load_dirt() { PLOC L, l; POBJ O, o; PMOB M, m; FILE *f; char buf[81]; char *s; if (arg[0] == NULL) strcpy(buf,fzn); else strcpy(buf,arg[0]); f = fopen(buf,"r"); if (f == NULL) { printf("Couldn't open file %s.",buf); return; } line = 1; while((s = fgets(buf, 81, f)) != NULL) { /* Take into account IBM's \n\r EOLn */ if ((strlen(s) < 80) || (s[79] == '\n') || (s[80] == '\n')) line ++; if (strncasecmp("%LOCATIONS", buf, 10) == 0) { printf("Locations found on line %d. Reading ...\n", line-1); L = load_dirt_locs(f); if (L == NULL) continue; /* Add L to main list of locations */ if (loc == NULL) loc = L; else /* Join the 2 lists */ { l = loc; while (l->next != NULL) l = l->next; l->next = L; } } else if (strncasecmp("%MOBILES", buf, 8) == 0) { printf("Mobiles found on line %d. Reading ...\n", line-1); M = read_dirt_mobiles(f); if (M == NULL) continue; if (mob == NULL) mob = M; else /* Join the 2 lists */ { m = mob; while (m->next != NULL) m = m->next; m->next = M; } } else if (strncasecmp("%OBJECTS", buf, 8) == 0) { printf("Objects found on line %d. Reading ...\n", line-1); O = read_dirt_objects(f); if (O == NULL) continue; if (obj == NULL) obj = O; else /* Join the 2 lists */ { o = obj; while (o->next != NULL) o = o->next; o->next = O; } } else { #ifndef PCC_286 s = buf; while (isspace(*s)) s++; if ((*s == '/') && (*(s+1) == '*')) { s += 2; read_comment(s, f); } #endif #ifdef DEBUG else printf("%s", buf); #endif } } fclose(f); printf("Fixing exits...\n"); fix_exits(); printf("Fixing mobiles...\n"); fix_mobs(); printf("Fixing objects...\n\n"); fix_objs(); return; } /* ** load_config reads file CONFIG_FILE and sets some booleans accordingly */ void load_config() { FILE *f; char buf[80]; int k; f = fopen(CONFIG_FILE, "r"); if (f == NULL) { printf("Could not open config file %s. Using default values\n", CONFIG_FILE); return; } while (get_word(buf, f) >= 0) { k = lookup(glob_table, buf); buf[0] = '\0'; switch(k) { case 0: brief = read_truth(f); break; case 1: o_counters = read_truth(f); break; case 2: /* New oflags */ printf("Defining Oflags:"); new_flags(f, o_flags); break; case 3: /* Lflags */ printf("Defining Lflags:"); new_flags(f, l_flags); break; case 4: printf("Defining Pflags:"); new_flags(f, p_flags); break; case 5: printf("Defining Mflags:"); new_flags(f, m_flags); break; case 6: printf("Defining Sflags:"); new_flags(f, s_flags); break; case 7: verbose = read_truth(f); break; case 8: #ifdef _NO_WFLAGS read_truth(f); #else wear_flags = read_truth(f); #endif break; case 9: #ifdef _NO_WFLAGS printf("Defining Wflags: (compiled out) skipping\n"); for (k = getc(f); k != '}'; k = getc(f)); #else printf("Defining Wflags:"); new_flags(f, w_flags); #endif break; default: printf("Whats that?\n"); } buf[0] = '\0'; NEWLINE(f); } fclose(f); return; } /* ** save globals will do that */ void save_glob() { FILE *f; f = fopen(CONFIG_FILE, "w"); if (f == NULL) { printf("Could not write config file\n"); return; } fprintf(f, "Brief %s \nCounter %s \nVerbose %s \n", btos(brief), btos(o_counters), btos(verbose)); #ifndef _NO_WFLAGS fprintf(f, "Wear_flags %s\n", btos(wear_flags)); #endif fprintf(f, "OFLAGS { "); write_config_flags(f, o_flags); #ifndef _NO_WFLAGS fprintf(f, "}\nWFLAGS { "); write_config_flags(f, w_flags); #endif fprintf(f, "}\nLFLAGS { "); write_config_flags(f, l_flags); fprintf(f, "}\nPFLAGS { "); write_config_flags(f, p_flags); fprintf(f, "}\nMFLAGS { "); write_config_flags(f, m_flags); fprintf(f, "}\nSFLAGS { "); write_config_flags(f, s_flags); fprintf(f, "}\n"); fclose(f); return; } /* ** write the table of strings, each line being less than 80 chars, but as ** many as possible without spliting entries. */ void write_config_flags(f, table) FILE *f; char **table; { int i, j; for (i = 0, j = 0; table[i] != TABLE_END; i++) { if (!EMPTY(table[i])) { j += strlen(table[i]) + 1; if (j > 69) { fprintf(f, "\n "); j = strlen(table[i]); } fprintf(f, "%s ", table[i]); } } return; } Bool read_truth(f) FILE *f; { char buf[80]; buf[0] = '\0'; get_word(buf, f); if (ABREV_EQ("TRUE", buf)) return TRUE; else if (ABREV_EQ("FALSE", buf)) return FALSE; else printf("Error, expecting TRUE/FALSE.\n"); return FALSE; } /* ** Read flags from config and try to add them */ void new_flags(f, table) FILE *f; char **table; { int c; char flag[80]; char *t; for (c = getc(f); (c != EOF) && (c != '{'); c = getc(f)); for (c = getc(f); c != '}'; c = getc(f)) { if (c == EOF) return; if (!isalpha(c)) continue; for (t = flag; isalpha(c); c = getc(f)) *t++ = (char)c; ungetc(c,f); *t = 0; create_flag(flag, table); putc('.', stdout); } printf("\n"); return; } /* ** This function was designed to read the leading comment from the file ** in such a way as to preserve it (hopefully!) ** It should be noted that comments in general are NOT supported. */ void read_comment(s, f) char *s; FILE *f; { char *t; char *p; char *q; char buf[82]; int z; if (!EMPTY(s)) { z = strlen(s); t = COPY(s); } else { t = COPY("\n"); z = strlen(t); } while((p = fgets(buf, 81, f)) != NULL) { line++; if (EMPTY(p)) continue; q = p; while (isspace(*q)) q++; if ((*q == '*') && (*(q+1) == '/')) { if (p != q) { z += (p-q); *q = '\0'; q = (char *)realloc(t, z); strcat(q, p); t = q; } break; } z += strlen(p); q = (char *)realloc(t, z); strcat(q, p); t = q; } comment = t; return; }