home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols100 / vol144 / long.c < prev    next >
Encoding:
Text File  |  1994-07-13  |  2.5 KB  |  128 lines

  1. /*    LONG-INTEGER PACKAGE    */
  2.  
  3. /*    C-Source for Long (32-bit signed) Integer Package
  4.  *    Rob Shostak
  5.  *    August, 1982            
  6.  */
  7.  
  8. char *itol(result,n)            /* integer to long */
  9. char *result;
  10. int n;
  11. {
  12. return(long(0,result,n));
  13. }
  14.  
  15. int ltoi(l)                /* converts long to integer */
  16. char l[];
  17. {
  18. return(l[3] + (l[2] << 8));
  19. }
  20.  
  21. lcomp(op1,op2)                /* compares two longs */
  22. char *op1,*op2;
  23. {
  24. return(long(1,op1,op2));
  25. }
  26.  
  27. char *ladd(result,op1,op2)        /* adds two longs */
  28. char *result,*op1,*op2;
  29. {
  30. return(long(2,result,op1,op2));
  31. }
  32.  
  33. char *lsub(result,op1,op2)        /* subtracts two longs */
  34. char *result,*op1,*op2;
  35. {
  36. return(long(3,result,op1,op2));
  37. }
  38.  
  39. char *lmul(result,op1,op2)        /* multiplies two longs */
  40. char *result,*op1,*op2;
  41. {
  42. return(long(4,result,op1,op2));
  43. }
  44.  
  45. char *ldiv(result,op1,op2)        /* "long" division */
  46. char *result,*op1,*op2;
  47. {
  48. return(long(5,result,op1,op2));
  49. }
  50.  
  51. char *lmod(result,op1,op2)        /* long multiplication */
  52. char *result,*op1,*op2;
  53. {
  54. return(long(6,result,op1,op2));
  55. }
  56.  
  57. char *atol(result,s)            /* ascii to long */
  58. char *result,*s;
  59. {
  60. char ten[4], temp[4], sign;
  61.  
  62. itol(ten,10); itol(result,0);
  63.  
  64. if(sign=(*s == '-')) s++;
  65.  
  66. while(isdigit(*s))
  67.   ladd(result,lmul(result,result,ten),itol(temp,*s++ - '0'));
  68.  
  69. return(sign? lsub(result,itol(temp,0),result) : result);
  70. }
  71.  
  72. char *ltoa(result,op1)                /* long to ascii string */
  73. char *result,*op1;
  74. {
  75. char absval[4], temp[4];
  76. char work[15], *workptr, sign;
  77. char ten[4], zero[4], *rptr;
  78.  
  79. rptr = result;
  80. itol(ten,10); itol(zero,0);            /* init these */
  81.  
  82. if(sign = *op1 & 0x80)                /* negative operand */
  83.   {
  84.   *rptr++ = '-';
  85.   lsub(absval,zero,op1);
  86.   }
  87. else lassign(absval,op1);
  88.  
  89. *(workptr = work+14) = '\0';        /* generate digits in reverse order */
  90. do                    
  91.   *(--workptr) = '0'+ *(lmod(temp,absval,ten) + 3);
  92. while
  93.   (lcomp(ldiv(absval,absval,ten),zero) > 0);
  94.  
  95. strcpy(rptr,workptr);
  96. return(result);
  97. }
  98.  
  99. /* lassign(ldest,lsource) assigns long lsource to ldest, returns
  100.    ptr to ldest */
  101.  
  102. char *lassign(ldest,lsource)
  103. unsigned *ldest, *lsource;
  104. {
  105. *ldest++ = *lsource++;    /* copy first two bytes */
  106. *ldest = *lsource;    /* then last two */
  107. return(ldest);
  108. }
  109.  
  110. /* ltou(l) converts long l to an unsigned (by truncating) */
  111.  
  112. unsigned ltou(l)
  113. char l[];
  114. {
  115. return(l[3] + (l[2] << 8));
  116. }
  117.  
  118. /* utol(l,u) converts unsigned to long */
  119.  
  120. utol(l,u)
  121. char l[];
  122. unsigned u;
  123. {
  124. itol(l, u & 0x7FFF);            /* convert integer part */
  125. if(u > 0x7FFF) l[2] += 0x80;        /* take care of leftmost bit */
  126. return(l);
  127. }
  128.