pac.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. *
  5. * This product is part of the Amsterdam Compiler Kit.
  6. *
  7. * Permission to use, sell, duplicate or disclose this software must be
  8. * obtained in writing. Requests for such permissions may be sent to
  9. *
  10. * Dr. Andrew S. Tanenbaum
  11. * Wiskundig Seminarium
  12. * Vrije Universiteit
  13. * Postbox 7161
  14. * 1007 MC Amsterdam
  15. * The Netherlands
  16. *
  17. */
  18. /* Author: J.W. Stevenson */
  19. #include <pc_err.h>
  20. extern _trp();
  21. #define assert(x) /* nothing */
  22. #ifndef EM_WSIZE
  23. #define EM_WSIZE _EM_WSIZE
  24. #endif
  25. struct descr {
  26. int low;
  27. int diff;
  28. int size;
  29. };
  30. _pac(ad,zd,zp,i,ap) int i; struct descr *ad,*zd; char *zp,*ap; {
  31. if (zd->diff > ad->diff ||
  32. (i -= ad->low) < 0 ||
  33. (i+zd->diff) > ad->diff)
  34. _trp(EPACK);
  35. ap += (i * ad->size);
  36. i = (zd->diff + 1) * zd->size;
  37. if (zd->size == 1) {
  38. int *aptmp = (int *)ap;
  39. assert(ad->size == EM_WSIZE);
  40. while (--i >= 0)
  41. *zp++ = *aptmp++;
  42. #if EM_WSIZE > 2
  43. } else if (zd->size == 2) {
  44. int *aptmp = (int *)ap;
  45. short *zptmp = (short *) zp;
  46. assert(ad->size == EM_WSIZE);
  47. while (--i >= 0)
  48. *zptmp++ = *aptmp++;
  49. #endif
  50. } else {
  51. assert(ad->size == zd->size);
  52. while (--i >= 0)
  53. *zp++ = *ap++;
  54. }
  55. }