|
|
1.1 ! root 1: /* w_resrc.c: Get resources (from files) ! 2: * ! 3: * Micropolis, Unix Version. This game was released for the Unix platform ! 4: * in or about 1990 and has been modified for inclusion in the One Laptop ! 5: * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If ! 6: * you need assistance with this program, you may contact: ! 7: * http://wiki.laptop.org/go/Micropolis or email [email protected]. ! 8: * ! 9: * This program is free software: you can redistribute it and/or modify ! 10: * it under the terms of the GNU General Public License as published by ! 11: * the Free Software Foundation, either version 3 of the License, or (at ! 12: * your option) any later version. ! 13: * ! 14: * This program is distributed in the hope that it will be useful, but ! 15: * WITHOUT ANY WARRANTY; without even the implied warranty of ! 16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 17: * General Public License for more details. You should have received a ! 18: * copy of the GNU General Public License along with this program. If ! 19: * not, see <http://www.gnu.org/licenses/>. ! 20: * ! 21: * ADDITIONAL TERMS per GNU GPL Section 7 ! 22: * ! 23: * No trademark or publicity rights are granted. This license does NOT ! 24: * give you any right, title or interest in the trademark SimCity or any ! 25: * other Electronic Arts trademark. You may not distribute any ! 26: * modification of this program using the trademark SimCity or claim any ! 27: * affliation or association with Electronic Arts Inc. or its employees. ! 28: * ! 29: * Any propagation or conveyance of this program must include this ! 30: * copyright notice and these terms. ! 31: * ! 32: * If you convey this program (or any modifications of it) and assume ! 33: * contractual liability for the program to recipients of it, you agree ! 34: * to indemnify Electronic Arts for any liability that those contractual ! 35: * assumptions impose on Electronic Arts. ! 36: * ! 37: * You may not misrepresent the origins of this program; modified ! 38: * versions of the program must be marked as such and not identified as ! 39: * the original program. ! 40: * ! 41: * This disclaimer supplements the one included in the General Public ! 42: * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS ! 43: * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY ! 44: * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF ! 45: * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS ! 46: * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES, ! 47: * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, ! 48: * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY ! 49: * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING, ! 50: * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST ! 51: * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL ! 52: * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE ! 53: * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE ! 54: * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE ! 55: * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR ! 56: * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME ! 57: * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED ! 58: * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A ! 59: * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY ! 60: * NOT APPLY TO YOU. ! 61: */ ! 62: #include "sim.h" ! 63: ! 64: ! 65: #ifdef MSDOS ! 66: #define PATHSTR "%s\\%c%c%c%c.%d" ! 67: #define PERMSTR "rb" ! 68: #else ! 69: #define PATHSTR "%s/%c%c%c%c.%d" ! 70: #define PERMSTR "r" ! 71: #endif ! 72: ! 73: ! 74: char *HomeDir, *ResourceDir, *KeyDir, *HostName; ! 75: ! 76: struct Resource *Resources = NULL; ! 77: ! 78: struct StringTable { ! 79: QUAD id; ! 80: int lines; ! 81: char **strings; ! 82: struct StringTable *next; ! 83: } *StringTables; ! 84: ! 85: ! 86: Handle GetResource(char *name, QUAD id) ! 87: { ! 88: struct Resource *r = Resources; ! 89: char fname[256]; ! 90: struct stat st; ! 91: FILE *fp = NULL; ! 92: ! 93: while (r != NULL) { ! 94: if ((r->id == id) && ! 95: (strncmp(r->name, name, 4) == 0)) { ! 96: return ((Handle)&r->buf); ! 97: } ! 98: r = r->next; ! 99: } ! 100: ! 101: r = (struct Resource *)ckalloc(sizeof(struct Resource)); ! 102: ! 103: r->name[0] = name[0]; ! 104: r->name[1] = name[1]; ! 105: r->name[2] = name[2]; ! 106: r->name[3] = name[3]; ! 107: r->id = id; ! 108: ! 109: sprintf(fname, PATHSTR, ResourceDir, ! 110: r->name[0], r->name[1], r->name[2], r->name[3], ! 111: r->id); ! 112: ! 113: if ((stat(fname, &st) < 0) || ! 114: ((r->size = st.st_size) == 0) || ! 115: ((r->buf = (char *)ckalloc(r->size)) == NULL) || ! 116: ((fp = fopen(fname, PERMSTR)) == NULL) || ! 117: (fread(r->buf, sizeof(char), r->size, fp) != r->size)) { ! 118: if (fp) ! 119: fclose(fp); ! 120: r->buf = NULL; ! 121: r->size = 0; ! 122: fprintf(stderr, "Can't find resource file \"%s\"!\n", fname); ! 123: perror("GetResource"); ! 124: return(NULL); ! 125: } ! 126: fclose(fp); ! 127: r->next = Resources; Resources = r; ! 128: return ((Handle)&r->buf); ! 129: } ! 130: ! 131: ! 132: void ! 133: ReleaseResource(Handle r) ! 134: { ! 135: } ! 136: ! 137: ! 138: QUAD ! 139: ResourceSize(Handle h) ! 140: { ! 141: struct Resource *r = (struct Resource *)h; ! 142: ! 143: return (r->size); ! 144: } ! 145: ! 146: ! 147: char * ! 148: ResourceName(Handle h) ! 149: { ! 150: struct Resource *r = (struct Resource *)h; ! 151: ! 152: return (r->name); ! 153: } ! 154: ! 155: ! 156: QUAD ! 157: ResourceID(Handle h) ! 158: { ! 159: struct Resource *r = (struct Resource *)h; ! 160: ! 161: return (r->id); ! 162: } ! 163: ! 164: ! 165: GetIndString(char *str, int id, short num) ! 166: { ! 167: struct StringTable **tp, *st = NULL; ! 168: Handle h; ! 169: ! 170: tp = &StringTables; ! 171: ! 172: while (*tp) { ! 173: if ((*tp)->id == id) { ! 174: st = *tp; ! 175: break; ! 176: } ! 177: tp = &((*tp)->next); ! 178: } ! 179: if (!st) { ! 180: QUAD i, lines, size; ! 181: char *buf; ! 182: ! 183: st = (struct StringTable *)ckalloc(sizeof (struct StringTable)); ! 184: st->id = id; ! 185: h = GetResource("stri", id); ! 186: size = ResourceSize(h); ! 187: buf = (char *)*h; ! 188: for (i=0, lines=0; i<size; i++) ! 189: if (buf[i] == '\n') { ! 190: buf[i] = 0; ! 191: lines++; ! 192: } ! 193: st->lines = lines; ! 194: st->strings = (char **)ckalloc(size * sizeof(char *)); ! 195: for (i=0; i<lines; i++) { ! 196: st->strings[i] = buf; ! 197: buf += strlen(buf) + 1; ! 198: } ! 199: st->next = StringTables; ! 200: StringTables = st; ! 201: } ! 202: if ((num < 1) || (num > st->lines)) { ! 203: fprintf(stderr, "Out of range string index: %d\n", num); ! 204: strcpy(str, "Well I'll be a monkey's uncle!"); ! 205: } { ! 206: strcpy(str, st->strings[num-1]); ! 207: } ! 208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.