// given a valid XSTR() tag piece of text, extract the id# portion, return the value in out, nonzero on success int lcl_ext_get_id(const SCP_string &xstr, int *out) { char id_buf[10]; size_t p, pnext; // find the first quote p = xstr.find('\"'); if (p == SCP_string::npos) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } p++; // continue searching until we find the close quote while(1) { pnext = xstr.find('\"', p); if (pnext == SCP_string::npos) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } // if the previous char is a \, we know its not the "end-of-string" quote if (xstr[pnext - 1] != '\\') { p = pnext; break; } // continue p = pnext; } // search until we find a , pnext = xstr.find(',', p); if (pnext == SCP_string::npos) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } pnext++; // find the close parenthesis p = pnext; pnext = xstr.find(')', p); if (pnext == SCP_string::npos) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } pnext--; // get only the number while (is_white_space(xstr[p]) && p <= pnext) p++; while (is_white_space(xstr[pnext]) && p <= pnext) pnext--; if (p > pnext) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } // now get the id string if ((pnext - p + 1) > 9) { error_display(0, "Error parsing id# in XSTR() tag %s\n", xstr.c_str()); return 0; } memset(id_buf, 0, 10); xstr.copy(id_buf, pnext - p + 1, p); // get the value and we're done *out = atoi(id_buf); // success return 1; }
// CommanderDJ - same as generic_anim_init, just with an SCP_string void generic_anim_init(generic_anim *ga, const SCP_string& filename) { generic_anim_init(ga); filename.copy(ga->filename, MAX_FILENAME_LEN - 1); }