asize.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #define DUK /* Modifications by Duk Bekema. */
  2. /* @(#)asize.c 1.2 */
  3. /* $Header$ */
  4. #define ushort unsigned short
  5. #include <stdio.h>
  6. #include "out.h"
  7. /*
  8. asize -- determine object size
  9. */
  10. main(argc, argv)
  11. char **argv;
  12. {
  13. struct outhead buf;
  14. struct outsect sbuf;
  15. ushort nrsect;
  16. long sum;
  17. int gorp;
  18. FILE *f;
  19. if (--argc == 0) {
  20. argc = 1;
  21. argv[1] = "a.out";
  22. }
  23. gorp = argc;
  24. while(argc--) {
  25. if ((f = fopen(*++argv, "r"))==NULL) {
  26. fprintf(stderr, "asize: cannot open %s\n", *argv);
  27. continue;
  28. }
  29. getofmt ((char *)&buf, SF_HEAD , f);
  30. if(BADMAGIC(buf)) {
  31. fprintf(stderr, "asize: %s-- bad format\n", *argv);
  32. fclose(f);
  33. continue;
  34. }
  35. nrsect = buf.oh_nsect;
  36. if (nrsect == 0) {
  37. fprintf(stderr, "asize: %s-- no sections\n", *argv);
  38. fclose(f);
  39. continue;
  40. }
  41. if (gorp > 1)
  42. printf("%s: ", *argv);
  43. sum = 0;
  44. while (nrsect-- > 0) {
  45. getofmt ((char *)&sbuf, SF_SECT , f);
  46. printf("%ld", sbuf.os_size);
  47. sum += sbuf.os_size;
  48. if (nrsect > 0)
  49. putchar('+');
  50. }
  51. printf(" = %ld = 0x%lx\n", sum, sum);
  52. fclose(f);
  53. }
  54. }
  55. getofmt(p, s, f)
  56. register char *p;
  57. register char *s;
  58. register FILE *f;
  59. {
  60. register i;
  61. register long l;
  62. for (;;) {
  63. switch (*s++) {
  64. /* case '0': p++; continue; */
  65. case '1':
  66. *p++ = getc(f);
  67. continue;
  68. case '2':
  69. i = getc(f);
  70. i |= (getc(f) << 8);
  71. #ifndef DUK
  72. *((short *)p)++ = i;
  73. #else DUK
  74. *((short *)p) = i;
  75. p += sizeof(short);
  76. #endif DUK
  77. continue;
  78. case '4':
  79. l = (long)getc(f);
  80. l |= (long)(getc(f) << 8);
  81. l |= ((long)getc(f) << 16);
  82. l |= ((long)getc(f) << 24);
  83. #ifndef DUK
  84. *((long *)p)++ = l;
  85. #else DUK
  86. *((long *)p) = l;
  87. p += sizeof(long);
  88. #endif DUK
  89. continue;
  90. default:
  91. case '\0':
  92. break;
  93. }
  94. break;
  95. }
  96. }