long.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "raster3d_intern.h"
  2. /*---------------------------------------------------------------------------*/
  3. int Rast3d_long_encode(long *source, unsigned char *dst, int nofNums)
  4. {
  5. long *src, d;
  6. int eltLength, nBytes;
  7. unsigned char *dstStop, tmp;
  8. eltLength = RASTER3D_LONG_LENGTH;
  9. nBytes = 8;
  10. d = 1;
  11. while (eltLength--) {
  12. dstStop = dst + nofNums;
  13. src = source;
  14. while (dst != dstStop) {
  15. tmp = ((*src++ / d) % 256);
  16. if (tmp != 0)
  17. nBytes = RASTER3D_MIN(nBytes, eltLength);
  18. *dst++ = tmp;
  19. }
  20. d *= 256;
  21. }
  22. return RASTER3D_LONG_LENGTH - nBytes;
  23. }
  24. /*---------------------------------------------------------------------------*/
  25. void
  26. Rast3d_long_decode(unsigned char *source, long *dst, int nofNums, int longNbytes)
  27. {
  28. long *dest;
  29. int eltLength;
  30. unsigned char *srcStop;
  31. eltLength = longNbytes;
  32. source += nofNums * eltLength - 1;
  33. eltLength--;
  34. srcStop = source - nofNums;
  35. dest = dst;
  36. dest += nofNums - 1;
  37. while (source != srcStop) {
  38. *dest = *source--;
  39. if ((eltLength >= RASTER3D_LONG_LENGTH) && (*dest != 0))
  40. Rast3d_fatal_error("Rast3d_long_decode: decoded long too long");
  41. dest--;
  42. }
  43. while (eltLength--) {
  44. srcStop = source - nofNums;
  45. dest = dst;
  46. dest += nofNums - 1;
  47. while (source != srcStop) {
  48. *dest *= 256;
  49. *dest += *source--;
  50. if ((eltLength >= RASTER3D_LONG_LENGTH) && (*dest != 0))
  51. Rast3d_fatal_error("Rast3d_long_decode: decoded long too long");
  52. dest--;
  53. }
  54. }
  55. }