// Compile with // gcc -m32 -I src/char -I src/common charfrob.c -o charfrob src/common/timer.o src/common/malloc.o src/common/socket.o src/common/lock.o src/common/db.o src/char/int_pet.o src/char/int_storage.o src/char/inter.o src/char/int_party.o src/char/int_guild.o #include #include #include "../common/mmo.h" // Yes, this is intentional #include "../char/char.c" // Well, this is not terribly elegant, but I don't have that much time. #define MAX_ITEM_ID 65535 int inv_translate[MAX_ITEM_ID]; void transform_char (struct mmo_charstatus *p) { int k; for (k = 0; k < MAX_INVENTORY; k++) p->inventory[k].nameid = inv_translate[p->inventory[k].nameid]; } int mmo_char_convert () { char line[965536]; int ret; struct mmo_charstatus char_dat; FILE *ifp, *ofp; ifp = stdin; ofp = stdout; while (fgets (line, 65535, ifp)) { memset (&char_dat, 0, sizeof (struct mmo_charstatus)); ret = mmo_char_fromstr (line, &char_dat); if (ret) { transform_char (&char_dat); mmo_char_tostr (line, &char_dat); fprintf (ofp, "%s" RETCODE, line); } } return 0; } #define PARSE_MODE_NEXTNUM 0 #define PARSE_MODE_RANGE 1 int init (char *source, char *dest) { int i; char *end_of_num; int dest_nr = strtol (dest, &end_of_num, 0); int range_start; int mode = PARSE_MODE_NEXTNUM; if (*end_of_num) { fprintf (stderr, "Invalid inventory ID: `%s'\n", dest); return 1; } /* init */ for (i = 0; i < MAX_ITEM_ID; i++) inv_translate[i] = i; while (*source) { int nr = strtol (source, &end_of_num, 0); char sep; if (end_of_num == source) { fprintf (stderr, "Invalid source range description: `%s'\n", source); return 1; } switch (mode) { case PARSE_MODE_NEXTNUM: inv_translate[nr] = dest_nr; break; case PARSE_MODE_RANGE: for (i = range_start; i <= nr; i++) inv_translate[i] = dest_nr; break; default: fprintf (stderr, "Internal error at %d\n", __LINE__); return 1; }; sep = *end_of_num++; switch (sep) { case '-': range_start = nr; mode = PARSE_MODE_RANGE; break; case ',': mode = PARSE_MODE_NEXTNUM; break; case 0: return 0; default: fprintf (stderr, "Invalid token in range spec: `%c'\n", sep); return 1; } source = end_of_num; } return 0; } int main (int argc, char *argv[]) { if (argc < 3) { printf ("Usage: %s \n", argv[0]); printf ("e.g., %s 501-555 701\n", argv[0]); exit (0); } if (init (argv[1], argv[2])) return 1; mmo_char_convert (); return 0; }