home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-3 / LONG1.C < prev    next >
Text File  |  2000-06-30  |  3KB  |  132 lines

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