home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / lib / Berk / Berklib.c.orig < prev    next >
Encoding:
Text File  |  1991-07-09  |  4.0 KB  |  246 lines

  1. /* $XConsortium: Berklib.c,v 1.14 91/07/09 14:49:33 rws Exp $ */
  2.  
  3. /*
  4.  * These are routines found in BSD but not on all other systems.  The core
  5.  * MIT distribution does not use them except for ffs in the server.  You
  6.  * should enable only the ones that you need for your system.  Use Xfuncs.h
  7.  * in clients to avoid using the slow versions of bcopy, bcmp, and bzero
  8.  * provided here.
  9.  */
  10.  
  11. #include <sys/types.h>
  12.  
  13. #ifdef hpux
  14. #define WANT_BFUNCS
  15. #define WANT_FFS
  16. #define WANT_RANDOM
  17. #endif
  18.  
  19. #ifdef macII
  20. #define WANT_RANDOM
  21. #endif
  22.  
  23. #ifdef SVR4
  24. #define WANT_BFUNCS
  25. #define WANT_FFS
  26. #define WANT_RANDOM
  27. #endif
  28.  
  29. #ifdef hcx
  30. #define WANT_FFS
  31. #endif
  32.  
  33. #ifdef SYSV386
  34. #ifdef SYSV
  35. #define WANT_FFS
  36. #endif
  37. #endif
  38.  
  39. /* you should use Xfuncs.h in code instead of relying on Berklib */
  40. #ifdef WANT_BFUNCS
  41.  
  42. #include <X11/Xosdefs.h>
  43.  
  44. #if (__STDC__ && defined(X_NOT_STDC_ENV)) || defined(SVR4) || defined(hpux)
  45.  
  46. #include <string.h>
  47.  
  48. void bcopy (b1, b2, length)
  49.     register char *b1, *b2;
  50.     register int length;
  51. {
  52.     memmove(b2, b1, (size_t)length);
  53. }
  54.  
  55. int bcmp (b1, b2, length)
  56.     register char *b1, *b2;
  57.     register int length;
  58. {
  59.     return memcmp(b1, b2, (size_t)length);
  60. }
  61.  
  62. void bzero (b, length)
  63.     register char *b;
  64.     register int length;
  65. {
  66.     memset(b, 0, (size_t)length);
  67. }
  68.  
  69. #else
  70.  
  71. void bcopy (b1, b2, length)
  72.     register char *b1, *b2;
  73.     register int length;
  74. {
  75.     if (b1 < b2) {
  76.     b2 += length;
  77.     b1 += length;
  78.     while (length--)
  79.         *--b2 = *--b1;
  80.     } else {
  81.     while (length--)
  82.         *b2++ = *b1++;
  83.     }
  84. }
  85.  
  86. #if defined(SYSV)
  87.  
  88. #include <memory.h>
  89.  
  90. int bcmp (b1, b2, length)
  91.     register char *b1, *b2;
  92.     register int length;
  93. {
  94.     return memcmp(b1, b2, length);
  95. }
  96.  
  97. bzero (b, length)
  98.     register char *b;
  99.     register int length;
  100. {
  101.     memset(b, 0, length);
  102. }
  103.  
  104. #else
  105.  
  106. int bcmp (b1, b2, length)
  107.     register char *b1, *b2;
  108.     register int length;
  109. {
  110.     while (length--) {
  111.     if (*b1++ != *b2++) return 1;
  112.     }
  113.     return 0;
  114. }
  115.  
  116. void bzero (b, length)
  117.     register char *b;
  118.     register int length;
  119. {
  120.     while (length--)
  121.     *b++ = '\0';
  122. }
  123.  
  124. #endif
  125. #endif
  126. #endif /* WANT_BFUNCS */
  127.  
  128. #ifdef WANT_FFS
  129. int
  130. ffs(mask)
  131. unsigned int    mask;
  132. {
  133.     register i;
  134.  
  135.     if ( ! mask ) return 0;
  136.     i = 1;
  137.     while (! (mask & 1)) {
  138.     i++;
  139.     mask = mask >> 1;
  140.     }
  141.     return i;
  142. }
  143. #endif
  144.  
  145. #ifdef WANT_RANDOM
  146. #if defined(SYSV) || defined(SVR4)
  147.  
  148. long lrand48();
  149.  
  150. long random()
  151. {
  152.    return (lrand48());
  153. }
  154.  
  155. void srandom(seed)
  156.     int seed;
  157. {
  158.    srand48(seed);
  159. }
  160.  
  161. #else
  162.  
  163. long random()
  164. {
  165.    return (rand());
  166. }
  167.  
  168. void srandom(seed)
  169.     int seed;
  170. {
  171.    srand(seed);
  172. }
  173.  
  174. #endif
  175. #endif /* WANT_RANDOM */
  176.  
  177. /*
  178.  * insque, remque - insert/remove element from a queue
  179.  *
  180.  * DESCRIPTION
  181.  *      Insque and remque manipulate queues built from doubly linked
  182.  *      lists.  Each element in the queue must in the form of
  183.  *      ``struct qelem''.  Insque inserts elem in a queue immedi-
  184.  *      ately after pred; remque removes an entry elem from a queue.
  185.  *
  186.  * SEE ALSO
  187.  *      ``VAX Architecture Handbook'', pp. 228-235.
  188.  */
  189.  
  190. #ifdef WANT_QUE
  191. struct qelem {
  192.     struct    qelem *q_forw;
  193.     struct    qelem *q_back;
  194.     char *q_data;
  195.     };
  196.  
  197. insque(elem, pred)
  198. register struct qelem *elem, *pred;
  199. {
  200.     register struct qelem *q;
  201.     /* Insert locking code here */
  202.     if ( elem->q_forw = q = (pred ? pred->q_forw : pred) )
  203.     q->q_back = elem;
  204.     if ( elem->q_back = pred )
  205.     pred->q_forw = elem;
  206.     /* Insert unlocking code here */
  207. }
  208.  
  209. remque(elem)
  210. register struct qelem *elem;
  211. {
  212.     register struct qelem *q;
  213.     if ( ! elem ) return;
  214.     /* Insert locking code here */
  215.  
  216.     if ( q = elem->q_back ) q->q_forw = elem->q_forw;
  217.     if ( q = elem->q_forw ) q->q_back = elem->q_back;
  218.  
  219.     /* insert unlocking code here */
  220. }
  221. #endif /* WANT_QUE */
  222.  
  223. /*
  224.  * gettimeofday emulation
  225.  * Caution -- emulation is incomplete
  226.  *  - has only second, not microsecond, resolution.
  227.  *  - does not return timezone info.
  228.  */
  229.  
  230. #if WANT_GTOD
  231. int gettimeofday (tvp, tzp)
  232.     struct timeval *tvp;
  233.     struct timezone *tzp;
  234. {
  235.     time (&tvp->tv_sec);
  236.     tvp->tv_usec = 0L;
  237.  
  238.     if (tzp) {
  239.     fprintf( stderr,
  240.          "Warning: gettimeofday() emulation does not return timezone\n"
  241.         );
  242.     }
  243. }
  244. #endif /* WANT_GTOD */
  245.  
  246.