resbin.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 2,388 行 · 第 1/4 页
C
2,388 行
put_16 (big_endian, 1, first->data + 2); first->next = NULL; pp = &first->next; c = 0; for (gi = group_icons; gi != NULL; gi = gi->next) { struct bindata *d; ++c; d = (struct bindata *) reswr_alloc (sizeof *d); d->length = 14; d->data = (unsigned char *) reswr_alloc (14); d->data[0] = gi->width; d->data[1] = gi->height; d->data[2] = gi->colors; d->data[3] = 0; put_16 (big_endian, gi->planes, d->data + 4); put_16 (big_endian, gi->bits, d->data + 6); put_32 (big_endian, gi->bytes, d->data + 8); put_16 (big_endian, gi->index, d->data + 12); d->next = NULL; *pp = d; pp = &d->next; } put_16 (big_endian, c, first->data + 4); return first;}/* Convert a menu resource to binary. */static struct bindata *res_to_bin_menu (menu, big_endian) const struct menu *menu; int big_endian;{ int menuex; struct bindata *d; menuex = extended_menu (menu); d = (struct bindata *) reswr_alloc (sizeof *d); d->length = menuex ? 8 : 4; d->data = (unsigned char *) reswr_alloc (d->length); if (! menuex) { put_16 (big_endian, 0, d->data); put_16 (big_endian, 0, d->data + 2); d->next = res_to_bin_menuitems (menu->items, big_endian); } else { put_16 (big_endian, 1, d->data); put_16 (big_endian, 4, d->data + 2); put_32 (big_endian, menu->help, d->data + 4); d->next = res_to_bin_menuexitems (menu->items, big_endian); } return d;}/* Convert menu items to binary. */static struct bindata *res_to_bin_menuitems (items, big_endian) const struct menuitem *items; int big_endian;{ struct bindata *first, **pp; const struct menuitem *mi; first = NULL; pp = &first; for (mi = items; mi != NULL; mi = mi->next) { struct bindata *d; int flags; d = (struct bindata *) reswr_alloc (sizeof *d); d->length = mi->popup == NULL ? 4 : 2; d->data = (unsigned char *) reswr_alloc (d->length); flags = mi->type; if (mi->next == NULL) flags |= MENUITEM_ENDMENU; if (mi->popup != NULL) flags |= MENUITEM_POPUP; put_16 (big_endian, flags, d->data); if (mi->popup == NULL) put_16 (big_endian, mi->id, d->data + 2); *pp = d; pp = &d->next; *pp = unicode_to_bin (mi->text, big_endian); pp = &(*pp)->next; if (mi->popup != NULL) { *pp = res_to_bin_menuitems (mi->popup, big_endian); while (*pp != NULL) pp = &(*pp)->next; } } return first;}/* Convert menuex items to binary. */static struct bindata *res_to_bin_menuexitems (items, big_endian) const struct menuitem *items; int big_endian;{ struct bindata *first, **pp; unsigned long length; const struct menuitem *mi; first = NULL; pp = &first; length = 0; for (mi = items; mi != NULL; mi = mi->next) { struct bindata *d; int flags; dword_align_bin (&pp, &length); d = (struct bindata *) reswr_alloc (sizeof *d); d->length = 12; d->data = (unsigned char *) reswr_alloc (12); length += 12; put_32 (big_endian, mi->type, d->data); put_32 (big_endian, mi->state, d->data + 4); put_16 (big_endian, mi->id, d->data + 8); flags = 0; if (mi->next == NULL) flags |= 0x80; if (mi->popup != NULL) flags |= 1; put_16 (big_endian, flags, d->data + 10); *pp = d; pp = &d->next; *pp = unicode_to_bin (mi->text, big_endian); length += (*pp)->length; pp = &(*pp)->next; if (mi->popup != NULL) { dword_align_bin (&pp, &length); d = (struct bindata *) reswr_alloc (sizeof *d); d->length = 4; d->data = (unsigned char *) reswr_alloc (4); put_32 (big_endian, mi->help, d->data); *pp = d; pp = &d->next; *pp = res_to_bin_menuexitems (mi->popup, big_endian); while (*pp != NULL) { length += (*pp)->length; pp = &(*pp)->next; } } } return first;}/* Convert an rcdata resource to binary. This is also used to convert other information which happens to be stored in rcdata_item lists to binary. */static struct bindata *res_to_bin_rcdata (items, big_endian) const struct rcdata_item *items; int big_endian;{ struct bindata *first, **pp; const struct rcdata_item *ri; first = NULL; pp = &first; for (ri = items; ri != NULL; ri = ri->next) { struct bindata *d; d = (struct bindata *) reswr_alloc (sizeof *d); switch (ri->type) { default: abort (); case RCDATA_WORD: d->length = 2; d->data = (unsigned char *) reswr_alloc (2); put_16 (big_endian, ri->u.word, d->data); break; case RCDATA_DWORD: d->length = 4; d->data = (unsigned char *) reswr_alloc (4); put_32 (big_endian, ri->u.dword, d->data); break; case RCDATA_STRING: d->length = ri->u.string.length; d->data = (unsigned char *) ri->u.string.s; break; case RCDATA_WSTRING: { unsigned long i; d->length = ri->u.wstring.length * 2; d->data = (unsigned char *) reswr_alloc (d->length); for (i = 0; i < ri->u.wstring.length; i++) put_16 (big_endian, ri->u.wstring.w[i], d->data + i * 2); break; } case RCDATA_BUFFER: d->length = ri->u.buffer.length; d->data = (unsigned char *) ri->u.buffer.data; break; } d->next = NULL; *pp = d; pp = &d->next; } return first;}/* Convert a stringtable resource to binary. */static struct bindata *res_to_bin_stringtable (st, big_endian) const struct stringtable *st; int big_endian;{ struct bindata *first, **pp; int i; first = NULL; pp = &first; for (i = 0; i < 16; i++) { int slen, j; struct bindata *d; unichar *s; slen = st->strings[i].length; s = st->strings[i].string; d = (struct bindata *) reswr_alloc (sizeof *d); d->length = 2 + slen * 2; d->data = (unsigned char *) reswr_alloc (d->length); put_16 (big_endian, slen, d->data); for (j = 0; j < slen; j++) put_16 (big_endian, s[j], d->data + 2 + j * 2); d->next = NULL; *pp = d; pp = &d->next; } return first;}/* Convert an ASCII string to a unicode binary string. This always returns exactly one bindata structure. */static struct bindata *string_to_unicode_bin (s, big_endian) const char *s; int big_endian;{ size_t len, i; struct bindata *d; len = strlen (s); d = (struct bindata *) reswr_alloc (sizeof *d); d->length = len * 2 + 2; d->data = (unsigned char *) reswr_alloc (d->length); for (i = 0; i < len; i++) put_16 (big_endian, s[i], d->data + i * 2); put_16 (big_endian, 0, d->data + i * 2); d->next = NULL; return d; }/* Convert a versioninfo resource to binary. */static struct bindata *res_to_bin_versioninfo (versioninfo, big_endian) const struct versioninfo *versioninfo; int big_endian;{ struct bindata *first, **pp; unsigned long length; struct ver_info *vi; first = (struct bindata *) reswr_alloc (sizeof *first); first->length = 6; first->data = (unsigned char *) reswr_alloc (6); length = 6; if (versioninfo->fixed == NULL) put_16 (big_endian, 0, first->data + 2); else put_16 (big_endian, 52, first->data + 2); put_16 (big_endian, 0, first->data + 4); pp = &first->next; *pp = string_to_unicode_bin ("VS_VERSION_INFO", big_endian); length += (*pp)->length; pp = &(*pp)->next; dword_align_bin (&pp, &length); if (versioninfo->fixed != NULL) { const struct fixed_versioninfo *fi; struct bindata *d; d = (struct bindata *) reswr_alloc (sizeof *d); d->length = 52; d->data = (unsigned char *) reswr_alloc (52); length += 52; fi = versioninfo->fixed; put_32 (big_endian, 0xfeef04bd, d->data); put_32 (big_endian, 0x10000, d->data + 4); put_32 (big_endian, fi->file_version_ms, d->data + 8); put_32 (big_endian, fi->file_version_ls, d->data + 12); put_32 (big_endian, fi->product_version_ms, d->data + 16); put_32 (big_endian, fi->product_version_ls, d->data + 20); put_32 (big_endian, fi->file_flags_mask, d->data + 24); put_32 (big_endian, fi->file_flags, d->data + 28); put_32 (big_endian, fi->file_os, d->data + 32); put_32 (big_endian, fi->file_type, d->data + 36); put_32 (big_endian, fi->file_subtype, d->data + 40); put_32 (big_endian, fi->file_date_ms, d->data + 44); put_32 (big_endian, fi->file_date_ls, d->data + 48); d->next = NULL; *pp = d; pp = &d->next; } for (vi = versioninfo->var; vi != NULL; vi = vi->next) { struct bindata *vid; unsigned long vilen; dword_align_bin (&pp, &length); vid = (struct bindata *) reswr_alloc (sizeof *vid); vid->length = 6; vid->data = (unsigned char *) reswr_alloc (6); length += 6; vilen = 6; put_16 (big_endian, 0, vid->data + 2); put_16 (big_endian, 0, vid->data + 4); *pp = vid; pp = &vid->next; switch (vi->type) { default: abort (); case VERINFO_STRING: { unsigned long hold, vslen; struct bindata *vsd; const struct ver_stringinfo *vs; *pp = string_to_unicode_bin ("StringFileInfo", big_endian); length += (*pp)->length; vilen += (*pp)->length; pp = &(*pp)->next; hold = length; dword_align_bin (&pp, &length); vilen += length - hold; vsd = (struct bindata *) reswr_alloc (sizeof *vsd); vsd->length = 6; vsd->data = (unsigned char *) reswr_alloc (6); length += 6; vilen += 6; vslen = 6; put_16 (big_endian, 0, vsd->data + 2); put_16 (big_endian, 0, vsd->data + 4); *pp = vsd; pp = &vsd->next; *pp = unicode_to_bin (vi->u.string.language, big_endian); length += (*pp)->length; vilen += (*pp)->length; vslen += (*pp)->length; pp = &(*pp)->next; for (vs = vi->u.string.strings; vs != NULL; vs = vs->next) { struct bindata *vssd; unsigned long vsslen; hold = length; dword_align_bin (&pp, &length); vilen += length - hold; vslen += length - hold; vssd = (struct bindata *) reswr_alloc (sizeof *vssd); vssd->length = 6; vssd->data = (unsigned char *) reswr_alloc (6); length += 6; vilen += 6; vslen += 6; vsslen = 6; put_16 (big_endian, 1, vssd->data + 4); *pp = vssd; pp = &vssd->next; *pp = unicode_to_bin (vs->key, big_endian); length += (*pp)->length; vilen += (*pp)->length; vslen += (*pp)->length; vsslen += (*pp)->length; pp = &(*pp)->next; hold = length; dword_align_bin (&pp, &length); vilen += length - hold; vslen += length - hold; vsslen += length - hold; *pp = unicode_to_bin (vs->value, big_endian); put_16 (big_endian, (*pp)->length / 2, vssd->data + 2); length += (*pp)->length; vilen += (*pp)->length; vslen += (*pp)->length; vsslen += (*pp)->length; pp = &(*pp)->next; put_16 (big_endian, vsslen, vssd->data); } put_16 (big_endian, vslen, vsd->data); break; } case VERINFO_VAR: { unsigned long hold, vvlen, vvvlen; struct bindata *vvd; const struct ver_varinfo *vv; *pp = string_to_unicode_bin ("VarFileInfo", big_endian); length += (*pp)->length; vilen += (*pp)->length; pp = &(*pp)->next; hold = length; dword_align_bin (&pp, &length); vilen += length - hold; vvd = (struct bindata *) reswr_alloc (sizeof *vvd); vvd->length = 6; vvd->data = (unsigned char *) reswr_alloc (6); length += 6; vilen += 6; vvlen = 6; put_16 (big_endian, 0, vvd->data + 4); *pp = vvd; pp = &vvd->next; *pp = unicode_to_bin (vi->u.var.key, big_endian); length += (*pp)->length; vilen += (*pp)->length; vvlen += (*pp)->length; pp = &(*pp)->next; hold = length; dword_align_bin (&pp, &length); vilen += length - hold; vvlen += length - hold; vvvlen = 0; for (vv = vi->u.var.var; vv != NULL; vv = vv->next) { struct bindata *vvsd; vvsd = (struct bindata *) reswr_alloc (sizeof *vvsd); vvsd->length = 4; vvsd->data = (unsigned char *) reswr_alloc (4); length += 4; vilen += 4; vvlen += 4; vvvlen += 4; put_16 (big_endian, vv->language, vvsd->data); put_16 (big_endian, vv->charset, vvsd->data + 2); vvsd->next = NULL; *pp = vvsd; pp = &vvsd->next; } put_16 (big_endian, vvlen, vvd->data); put_16 (big_endian, vvvlen, vvd->data + 2); break; } } put_16 (big_endian, vilen, vid->data); } put_16 (big_endian, length, first->data); return first;}/* Convert a generic resource to binary. */static struct bindata *res_to_bin_generic (length, data) unsigned long length; const unsigned char *data;{ struct bindata *d; d = (struct bindata *) reswr_alloc (sizeof *d); d->length = length; d->data = (unsigned char *) data; d->next = NULL; return d;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?