decode.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "pbc.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "readfile.h"
  6. static void
  7. decode_all(void *ud , int type, const char * typename , union pbc_value *v, int id, const char *key) {
  8. printf("%s : ", key ) ;
  9. switch(type & ~PBC_REPEATED) {
  10. case PBC_MESSAGE:
  11. printf("[%s] -> \n" , typename);
  12. pbc_decode(ud, typename, &(v->s), decode_all, ud);
  13. printf("---------\n");
  14. break;
  15. case PBC_INT:
  16. printf("%d\n", (int)v->i.low);
  17. break;
  18. case PBC_REAL:
  19. printf("%lf\n", v->f);
  20. break;
  21. case PBC_BOOL:
  22. printf("<%s>\n", v->i.low ? "true" : "false");
  23. break;
  24. case PBC_ENUM:
  25. printf("[%s:%d]\n", v->e.name , v->e.id);
  26. break;
  27. case PBC_STRING: {
  28. char buffer[v->s.len+1];
  29. memcpy(buffer, v->s.buffer, v->s.len);
  30. buffer[v->s.len] = '\0';
  31. printf("\"%s\"\n", buffer);
  32. break;
  33. }
  34. case PBC_BYTES: {
  35. int i;
  36. uint8_t *buffer = v->s.buffer;
  37. for (i=0;i<v->s.len;i++) {
  38. printf("%02X ",buffer[i]);
  39. }
  40. printf("\n");
  41. break;
  42. }
  43. case PBC_INT64: {
  44. printf("0x%x%08x\n",v->i.hi, v->i.low);
  45. break;
  46. }
  47. case PBC_UINT:
  48. printf("%u\n",v->i.low);
  49. break;
  50. default:
  51. printf("!!! %d\n", type);
  52. break;
  53. }
  54. }
  55. void
  56. test_decode(struct pbc_env * env , const char * pb)
  57. {
  58. struct pbc_slice slice;
  59. read_file(pb, &slice);
  60. pbc_decode(env, "google.protobuf.FileDescriptorSet", &slice, decode_all , env);
  61. int ret = pbc_register(env, &slice);
  62. printf("Register %d\n",ret);
  63. free(slice.buffer);
  64. }
  65. int
  66. main(int argc, char *argv[])
  67. {
  68. struct pbc_env * env = pbc_new();
  69. test_decode(env,argv[1]);
  70. pbc_delete(env);
  71. return 0;
  72. }