aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xbsd/Berklib.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/Xbsd/Berklib.c')
-rw-r--r--nx-X11/lib/Xbsd/Berklib.c331
1 files changed, 331 insertions, 0 deletions
diff --git a/nx-X11/lib/Xbsd/Berklib.c b/nx-X11/lib/Xbsd/Berklib.c
new file mode 100644
index 000000000..0e36c2e61
--- /dev/null
+++ b/nx-X11/lib/Xbsd/Berklib.c
@@ -0,0 +1,331 @@
+/* $Xorg: Berklib.c,v 1.4 2001/02/09 02:03:48 xorgcvs Exp $ */
+/*
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+/* $XFree86: xc/lib/Xbsd/Berklib.c,v 3.8 2001/07/25 15:04:49 dawes Exp $ */
+
+
+/*
+ * These are routines found in BSD but not on all other systems. The core
+ * MIT distribution does not use them except for ffs in the server, unless
+ * the system is seriously deficient. You should enable only the ones that
+ * you need for your system. Use Xfuncs.h in clients to avoid using the
+ * slow versions of bcopy, bcmp, and bzero provided here.
+ */
+
+#include <sys/types.h>
+
+#ifdef hpux
+#define WANT_RANDOM
+#define WANT_QUE
+#endif
+
+#ifdef macII
+/* silly bcopy in A/UX does not handle overlaps */
+#define WANT_BFUNCS
+#define WANT_MEMMOVE
+#define NO_BZERO
+#define WANT_RANDOM
+#endif
+
+#if defined(SVR4) && !defined(__UNIXWARE__)
+#define WANT_BFUNCS
+#define WANT_FFS
+#define WANT_RANDOM
+#endif
+
+#ifdef hcx
+#define WANT_FFS
+#endif
+
+#ifdef SYSV
+#ifdef i386
+#if !defined(__SCO__) && !defined(__UNIXWARE__)
+#define WANT_FFS
+#define WANT_MEMMOVE
+#endif
+#endif
+#endif
+
+#ifdef _SEQUENT_
+#define WANT_GTOD
+#define WANT_FFS
+#endif /* _SEQUENT_ */
+
+/* you should use Xfuncs.h in code instead of relying on Berklib */
+#ifdef WANT_BFUNCS
+
+#include <X11/Xosdefs.h>
+
+#if (__STDC__) || defined(SVR4) || defined(hpux)
+
+#include <string.h>
+
+void bcopy (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ memmove(b2, b1, (size_t)length);
+}
+
+int bcmp (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ return memcmp(b1, b2, (size_t)length);
+}
+
+void bzero (b, length)
+ register char *b;
+ register int length;
+{
+ memset(b, 0, (size_t)length);
+}
+
+#else
+
+void bcopy (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ if (b1 < b2) {
+ b2 += length;
+ b1 += length;
+ while (length--)
+ *--b2 = *--b1;
+ } else {
+ while (length--)
+ *b2++ = *b1++;
+ }
+}
+
+#if defined(SYSV)
+
+#include <memory.h>
+
+int bcmp (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ return memcmp(b1, b2, length);
+}
+
+#ifndef NO_BZERO
+
+bzero (b, length)
+ register char *b;
+ register int length;
+{
+ memset(b, 0, length);
+}
+
+#endif
+
+#else
+
+int bcmp (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ while (length--) {
+ if (*b1++ != *b2++) return 1;
+ }
+ return 0;
+}
+
+void bzero (b, length)
+ register char *b;
+ register int length;
+{
+ while (length--)
+ *b++ = '\0';
+}
+
+#endif
+#endif
+#endif /* WANT_BFUNCS */
+
+#ifdef WANT_MEMMOVE
+char *memmove (b1, b2, length)
+ register char *b1, *b2;
+ register int length;
+{
+ char *sb1 = b1;
+
+ if (b2 < b1) {
+ b1 += length;
+ b2 += length;
+ while (length--)
+ *--b1 = *--b2;
+ } else {
+ while (length--)
+ *b1++ = *b2++;
+ }
+ return sb1;
+}
+#endif
+
+#ifdef WANT_FFS
+int
+ffs(mask)
+unsigned int mask;
+{
+ register i;
+
+ if ( ! mask ) return 0;
+ i = 1;
+ while (! (mask & 1)) {
+ i++;
+ mask = mask >> 1;
+ }
+ return i;
+}
+#endif
+
+#ifdef WANT_RANDOM
+#if defined(SYSV) || defined(SVR4) || defined(hpux)
+
+long lrand48();
+
+long random()
+{
+ return (lrand48());
+}
+
+void srandom(seed)
+ int seed;
+{
+ srand48(seed);
+}
+
+#else
+
+long random()
+{
+ return (rand());
+}
+
+void srandom(seed)
+ int seed;
+{
+ srand(seed);
+}
+
+#endif
+#endif /* WANT_RANDOM */
+
+/*
+ * insque, remque - insert/remove element from a queue
+ *
+ * DESCRIPTION
+ * Insque and remque manipulate queues built from doubly linked
+ * lists. Each element in the queue must in the form of
+ * ``struct qelem''. Insque inserts elem in a queue immedi-
+ * ately after pred; remque removes an entry elem from a queue.
+ *
+ * SEE ALSO
+ * ``VAX Architecture Handbook'', pp. 228-235.
+ */
+
+#ifdef WANT_QUE
+struct qelem {
+ struct qelem *q_forw;
+ struct qelem *q_back;
+ char *q_data;
+ };
+
+insque(elem, pred)
+register struct qelem *elem, *pred;
+{
+ register struct qelem *q;
+ /* Insert locking code here */
+ if ( elem->q_forw = q = (pred ? pred->q_forw : pred) )
+ q->q_back = elem;
+ if ( elem->q_back = pred )
+ pred->q_forw = elem;
+ /* Insert unlocking code here */
+}
+
+remque(elem)
+register struct qelem *elem;
+{
+ register struct qelem *q;
+ if ( ! elem ) return;
+ /* Insert locking code here */
+
+ if ( q = elem->q_back ) q->q_forw = elem->q_forw;
+ if ( q = elem->q_forw ) q->q_back = elem->q_back;
+
+ /* insert unlocking code here */
+}
+#endif /* WANT_QUE */
+
+/*
+ * gettimeofday emulation
+ * Caution -- emulation is incomplete
+ * - has only second, not microsecond, resolution.
+ * - does not return timezone info.
+ */
+
+#ifdef WANT_GTOD
+
+#ifdef _SEQUENT_
+#include <X11/Xos.h>
+#endif /* _SEQUENT_ */
+
+int gettimeofday (tvp, tzp)
+ struct timeval *tvp;
+ struct timezone *tzp;
+{
+#ifdef _SEQUENT_
+ /*
+ * Sequent has microsecond resolution. Need to link with -lseq
+ */
+ get_process_stats (tvp, -1, NULL, NULL);
+#ifndef SVR4
+ if (tzp)
+ {
+ tzset ();
+ tzp->tz_minuteswest = timezone / 60;
+ tzp->tz_dsttime = daylight;
+ }
+#endif /* SVR4 */
+ return (0);
+#else /* _SEQUENT_ */
+ time (&tvp->tv_sec);
+ tvp->tv_usec = 0L;
+
+#ifndef SVR4
+ if (tzp) {
+ fprintf( stderr,
+ "Warning: gettimeofday() emulation does not return timezone\n"
+ );
+ }
+#endif /* SVR4 */
+#endif /* _SEQUENT_ */
+}
+#endif /* WANT_GTOD */