char *wordtab_to_str(const char **wordtab) { char *string; int word_n; int i; int j; if (wordtab == NULL) return (NULL); if (!(string = malloc(sizeof(char) * (get_string_len(wordtab))))) { fprintf(stderr, "%s\n", "Error malloc\n"); return (NULL); } j = 0; word_n = 0; while (wordtab[word_n]) { i = 0; while (wordtab[word_n][i] != '\0') string[j++] = wordtab[word_n][i++]; string[j++] = ' '; ++word_n; } string[j] = '\0'; return (string); }
/* * process_ecma_array The onMetaData sub type named ECMA Array * data, the data will be parsed * * return the offset of the data */ int process_ecma_array(unsigned char *data) { int ecma_array_len = 0; int keyname_len = 0; unsigned char keyname[32]; unsigned char *p = data; int i = 0; ecma_array_len = get_key_len(p); p += 4; for (i = 0; i < ecma_array_len; i++) { keyname_len = get_string_len(p); p += 2; memset(keyname, 0, sizeof(keyname)); strncpy((char *)keyname, (const char *)p, keyname_len); fprintf(stdout, "keyname = [%s]\n", keyname); p += keyname_len; p += script_type_parse(p); } if (*p == 0 && *(p + 1) == 0 && *(p + 2) == 9) { p += 3; } return p - data; }
/* * script_type_parse parse the script object type and parse the data * data, the data will be parsed * * return the data offset */ int script_type_parse(unsigned char *data) { int ret = 0; unsigned char *p = data; unsigned char string_output[512]; unsigned long long number = 0; double double_number = 0.0; switch (*p) { case Number: p++; number = get_double(p); double_number = int2double(number); fprintf(stdout, "number = [%.2f]\n", double_number); p += 8; break; case Boolean: p++; ret = get_bool_value(p); p++; break; case String: p++; memset(string_output, 0, sizeof(string_output)); ret = get_string_len(p); p += 2; strncpy((char *)string_output, (const char *)p, ret); fprintf(stdout, "String = [%s]\n", string_output); p += ret; break; case Object: p++; break; case MovieClip: p++; break; case Null: p++; break; case Undefined: p++; break; case Reference: p++; break; case EcmaArray: p++; ret = process_ecma_array(p); p += ret; break; case ObjectEndMarker: p++; break; case StringArray: p++; break; case Date: p++; break; case LongString: p++; break; default: break; } return p - data; }