home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / src / common / long.c < prev    next >
C/C++ Source or Header  |  2001-12-12  |  2KB  |  80 lines

  1. /*
  2.  *  long.c -- functions for handling long values on 16-bit computers.
  3.  */
  4.  
  5. #include "../h/gsupport.h"
  6.  
  7. #if IntBits == 16
  8. /*
  9.  * Long strlen
  10.  */
  11.  
  12. long lstrlen(s)
  13. char *s;
  14. {
  15.     long l = 0;
  16.     while(*s++) l++;
  17.     return l;
  18. }
  19.  
  20. /* Shell sort with some enhancements from Knuth.. */
  21.  
  22. void lqsort( base, nel, width, cmp )
  23. char *base;
  24. int nel;
  25. int width;
  26. int (*cmp)();
  27. {
  28.    register int i, j;
  29.    long int gap;
  30.    int k, tmp ;
  31.    char *p1, *p2;
  32.  
  33.    for( gap=1; gap <= nel; gap = 3*gap + 1 ) ;
  34.  
  35.    for( gap /= 3;  gap > 0  ; gap /= 3 )
  36.        for( i = gap; i < nel; i++ )
  37.            for( j = i-gap; j >= 0 ; j -= gap ) {
  38.                 p1 = base + ( j     * width);
  39.                 p2 = base + ((j+gap) * width);
  40.  
  41.                 if( (*cmp)( p1, p2 ) <= 0 ) break;
  42.  
  43.                 for( k = width; --k >= 0 ;) {
  44.                    tmp   = *p1;
  45.                    *p1++ = *p2;
  46.                    *p2++ = tmp;
  47.                 }
  48.            }
  49. }
  50. #endif                    /* IntBits == 16 */
  51.  
  52. /*
  53.  * Write a long string in int-sized chunks.
  54.  */
  55.  
  56. long longwrite(s,len,file)
  57. FILE *file;
  58. char *s;
  59. long len;
  60. {
  61.    long tally = 0;
  62.    int n = 0;
  63.    int leftover, loopnum;
  64.    char *p;
  65.  
  66.    leftover = (int)(len % (long)MaxInt);
  67.    for (p = s, loopnum = (int)(len / (long)MaxInt); loopnum; loopnum--) {
  68.        n = fwrite(p,sizeof(char),MaxInt,file);
  69.        tally += (long)n;
  70.        p += MaxInt;
  71.    }
  72.    if (leftover) {
  73.       n = fwrite(p,sizeof(char),leftover,file);
  74.       tally += (long)n;
  75.       }
  76.    if (tally != len)
  77.       return -1;
  78.    else return tally;
  79.    }
  80.