⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 par.c

📁 进行Palm开发时
💻 C
📖 第 1 页 / 共 3 页
字号:
    if (PRC_IS_RESOURCE(prc)) {        return extract_resources(prc, argv);    } else if (PRC_IS_STREAM(prc)) {        return extract_stream(prc, argv);    } else {        int n = extract_info(prc, argv);        if (n == -1)            return n;        return extract_records(prc, &argv[n]);    }}static intdelete_records(prc_t* prc, char** argv){    int i;    prc_uint16_t index;    prc_record_t* record;    unsigned      nRecords = prcgetnrecords(prc);    prc_byte_t*   record_deletes;    int           rv = 0;    record_deletes = (prc_byte_t*)calloc(nRecords, sizeof(prc_byte_t));    for (i = 0; argv[i] != NULL; i++) {        char* a = argv[i];                index = atoi(a);        record_deletes[index] = 1;    }    index = nRecords;    do {        index--;        if (!record_deletes[index])            continue;                record = prcgetrecord(prc, index);        if (!record) {            fprintf(stderr, "index %d not found\n", index);            rv = -1;            break;        }        /* remove the record from the prc, the destroy */        record = prcremoverecord(prc, record);        if (!record) {            fprintf(stderr, "problem deleting record, inbdex=%d\n", index);            rv = -1;            break;        } else {            prcdestroyrecord(record);        }    } while (index > 0);    free(record_deletes);    return rv;}static intdelete_resources(prc_t* prc, char** argv){    int i;    prc_resource_t* resource;    /* type id */    for (i = 0; argv[i] != NULL;) {        prc_uint16_t  id;        prc_type_t type;        char* type_s;        char* id_s;        type_s = argv[i++];        id_s = argv[i++];                type = prcstrtotype(type_s);        id = prcstrtoid(id_s);        resource = prcgetresource(prc, type, id);        if (!resource) {            fprintf(stderr, "resource, type='%s', id=0x%x not found\n",                    type_s, id);            return -1;        }        /* remove the record from the prc, the destroy */        resource = prcremoveresource(prc, resource);        if (!resource) {            fprintf(stderr, "problem deleting resource, type='%s', id=0x%x\n",                    type_s, id);            return -1;        } else {            prcdestroyresource(resource);        }    }        return 0;}static intprcdelete(prc_t* prc, char** argv){    if (PRC_IS_RESOURCE(prc)) {        return delete_resources(prc, argv);    } else {        unsigned dAppInfo;        unsigned dSortInfo;        unsigned n = parse_info_args(argv, 0, &dAppInfo, 0, &dSortInfo);        if (dAppInfo)            prcsetappinfo(prc, NULL, 0);        if (dSortInfo)            prcsetsortinfo(prc, NULL, 0);        return delete_records(prc, &argv[n]);    }}const char*prcbasename(const char* s){    char* p = strrchr(s, '/');    if (p != NULL) {        return (const char*)(p + 1);    } else {        return s;    }}const char*prcsuffixname(const char* s){    char* p = strrchr(s, '.');    if (p != NULL) {        return (const char*)(p + 1);    } else {        return s;    }}const unsignedprcfileisprc(const char* s){    /* this is only a guess, need to open file */    const char* suf = prcsuffixname(s);    if (strcmp(suf, "prc") == 0 || strcmp(suf, "PRC") == 0 ||        strcmp(suf, "pdb") == 0 || strcmp(suf, "PDB") == 0)        return 1;    else        return 0;}static unsignedparse_record_args(char** argv,                  unsigned* category, unsigned* flags, prc_uint32_t* uid,                  unsigned* isPrc_r){    unsigned n;    unsigned options = 0;    char* f;    *isPrc_r = 0;    for (n = 0; (f = argv[n]) != NULL && f[0] == '-';) {        if (strcmp(f, "-c") == 0) {            *category = atoi(argv[n+1]);            n += 2;            options++;        } else if (strcmp(f, "-u") == 0) {            *uid = atoi(argv[n+1]);            n += 2;            options++;        } else if (strcmp(f, "-a") == 0) {            *flags = prcstrprecordattr(argv[n+1]);            n += 2;            options++;        } else if (strcmp(f, "-p") == 0) {            *isPrc_r = 1;            return n;        } else {            break;        }    }    if (options == 0) {        unsigned flag;        prc_uint32_t id;        unsigned index;        unsigned foo;        if (prcfileisprc(argv[0])) { /* I think it's a prc */            *isPrc_r = 1;            return n;        }        foo = sscanf(f, "%d.%x.%ld", &index, &flag, &id);        if (foo == 3) {            *category = PRC_REC_FLAGS_GET_CATEGORY(flag);            *flags = flag & 0xF0;            *uid = id;        }    }        return n;}static intappend_info(prc_t* prc, char** argv){    int n = 0;    char* appInfo = NULL;    char* sortInfo = NULL;    prc_byte_t*  data;	prc_uint32_t datalen;    n += parse_info_args(argv, &appInfo, 0, &sortInfo, 0);    if (appInfo != NULL) { /* set app info from file */        data = file_to_data(appInfo, &datalen);        prcsetappinfo(prc, data, datalen);        free(data);    }    if (sortInfo != NULL) { /* set sort info from file */        data = file_to_data(sortInfo, &datalen);        prcsetsortinfo(prc, data, datalen);        free(data);    }    return n;}static intappend_one_record(prc_t* prc,                  prc_uint32_t id,                  prc_byte_t   flags,                  prc_byte_t*  data,                  prc_uint32_t datalen){    prc_record_t* rec = prcnewrecord();    prcrecordset(rec, data, datalen);    rec->flags = flags;    rec->id = id;        rec = prcappendrecord(prc, rec);    if (rec == NULL) {        fprintf(stderr, "could not append record\n");        return -1;    }    return 0;}static intappend_record_mappee(prc_record_t* m_record, void* arg){    prc_t* prc = (prc_t*)arg;        return append_one_record(prc,                             m_record->id,                             m_record->flags,                             m_record->data,                             m_record->datalen);}static intappend_records(prc_t* prc, char** argv){    int n;    for (n = 0; argv[n] != NULL; n++) {        prc_byte_t*  data;        prc_uint32_t datalen;        unsigned     category = 0;        unsigned     flags = 0;        prc_uint32_t uid = 0;        unsigned     isPrc;        int x;        n += parse_record_args(&argv[n], &category, &flags, &uid, &isPrc);        if (isPrc) {            prc_t* a_prc = prcopen(argv[n], PRC_OPEN_READ);            if (a_prc == NULL) {                fprintf(stderr, "could not open: %s\n", argv[n]);                return -1;            }            if (PRC_IS_RESOURCE(a_prc)) {                fprintf(stderr, "%s is a resource file\n", argv[n]);                prcclose(a_prc);                return -1;            }            x = prcmaprecords(a_prc, append_record_mappee, prc);            prcclose(a_prc);            if (x == -1)                return -1;        } else {            prc_byte_t flags_b;            data = file_to_data(argv[n], &datalen);            if (!data)                return -1;            flags_b = (prc_byte_t)PRC_REC_FLAGS_MAKE(flags, category);            x = append_one_record(prc,                                  uid,                                  flags_b,                                  data,                                  datalen);            free(data);            if (x != 0)                return -1;        }    }    return n;}static unsignedfilename_to_type_id(const char* s, prc_uint32_t* type_r, prc_uint16_t* id_r){    if (!s || strlen(s) < 8)        return 0;    if (!(isxdigit((unsigned)s[4]) &&          isxdigit((unsigned)s[5]) &&          isxdigit((unsigned)s[6]) &&          isxdigit((unsigned)s[7])))        return 0;    *type_r = prcstrtotype((char*)s);    *id_r = (prc_uint16_t)strtol((char*)&s[4], NULL, 16);    return 1;}static intparse_resource_args(char** argv,                    prc_uint32_t* type_r,                    prc_uint16_t* id_r,                    char** filename_r,                    unsigned* isPrc_r){    int n = 1;    prc_uint32_t type;    prc_uint16_t id;    char* filename;    unsigned isPrc = 0;    /* [-T type id ] filename */    if (strcmp("-T", argv[0]) == 0) {        type = prcstrtotype(argv[n++]);        id = prcstrtoid(argv[n++]);        filename = argv[n++];    } else if (strcmp("-p", argv[0]) == 0) {        filename = argv[n++];        isPrc = 1;    } else { /* try to decode type & id from filename */        if (prcfileisprc(argv[0])) { /* I think it's a prc */            isPrc = 1;        } else {            /* TTTTiiii[.suffix] */            const char* base = prcbasename(argv[0]);            if (!filename_to_type_id(base, &type, &id)) {                fprintf(stderr,                        "Unable to determine the resource type and id from "                        "filename: %s (expected form is TTTTxxxx[.suffix])\n",                        argv[0]);                return -1;            }        }        filename = argv[0];    }    *type_r = type;    *id_r = id;    *filename_r = filename;    *isPrc_r = isPrc;    return n;}static intappend_one_resource(prc_t* prc,                           prc_uint32_t type,                           prc_uint16_t id,                           prc_byte_t*  data,                           prc_uint32_t datalen){    prc_resource_t* resource;    unsigned        append = 0;    if ((resource = prcgetresource(prc, type, id)) == NULL) {        resource = prcnewresource();        append++;    } else {        fprintf(stderr,                "replacing resource %s 0x%04x\n",                prctypetostr(NULL, type), id);    }        prcresourceset(resource, type, id, data, datalen);        if (append)        resource = prcappendresource(prc, resource);        if (resource == NULL) {        fprintf(stderr,                "could not append resource %s 0x%04x\n",                prctypetostr(NULL, type), id);        return -1;    }    return 0;} static intappend_mappee(prc_resource_t* m_resource, void* arg){    prc_t* prc = (prc_t*)arg;        return append_one_resource(prc,                               m_resource->type,                               m_resource->id,                               m_resource->data,                               m_resource->datalen);}static intappend_resources(prc_t* prc, char** argv){    int n;    for (n = 0; argv[n] != NULL;) {        prc_byte_t*  data;        prc_uint32_t datalen;        prc_uint32_t type;        prc_uint16_t id;        char* filename;        int x;        unsigned isPrc;        x = parse_resource_args(&argv[n], &type, &id, &filename, &isPrc);        if (x == -1)            return -1;        n += x;        if (isPrc) {            prc_t* m_prc = prcopen(filename, PRC_OPEN_READ);            if (m_prc == NULL) {                fprintf(stderr, "could not open: %s\n", filename);                return -1;            }            if (!PRC_IS_RESOURCE(m_prc)) {                fprintf(stderr, "%s is not a resource file\n", filename);                prcclose(m_prc);                return -1;            }            x = prcmapresources(m_prc, append_mappee, prc);            prcclose(m_prc);            if (x == -1)                return -1;        } else {            data = file_to_data(filename, &datalen);            if (!data)                return -1;            x = append_one_resource(prc,                                    type,                                    id,                                    data,                                    datalen);            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -