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 + -
显示快捷键?