/* * Copyright (c) 1980, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef lint static char sccsid[] = "@(#)utility.c 8.1 (Berkeley) 5/31/93"; #endif /* not lint */ /* ** ASSORTED UTILITY ROUTINES */ /* ** BLOCK MOVE ** ** Moves a block of storage of length `l' bytes from the data ** area pointed to by `a' to the area pointed to by `b'. ** Returns the address of the byte following the `b' field. ** Overflow of `b' is not tested. */ char *bmove(a, b, l) char *a, *b; int l; { int n; char *p, *q; p = a; q = b; n = l; while (n--) *q++ = *p++; return (q); } /* ** STRING EQUALITY TEST ** null-terminated strings `a' and `b' are tested for ** absolute equality. ** returns one if equal, zero otherwise. */ sequal(a, b) char *a, *b; { char *p, *q; p = a; q = b; while (*p || *q) if (*p++ != *q++) return(0); return(1); } /* ** STRING CONCATENATE ** ** The strings `s1' and `s2' are concatenated and stored into ** `s3'. It is ok for `s1' to equal `s3', but terrible things ** will happen if `s2' equals `s3'. The return value is is a ** pointer to the end of `s3' field. */ char *concat(s1, s2, s3) char *s1, *s2, *s3; { char *p; char *q; p = s3; q = s1; while (*q) *p++ = *q++; q = s2; while (*q) *p++ = *q++; *p = 0; return (p); } /* ** FIND STRING LENGTH ** ** The length of string `s' (excluding the null byte which ** terminates the string) is returned. */ length(s) char *s; { int l; char *p; l = 0; p = s; while (*p++) l++; return(l); } /* ** SYSTEM ERROR */ syserr(p0, p1, p2, p3, p4, p5) { extern int errno; printf("\n\07TREK SYSERR: "); printf(p0, p1, p2, p3, p4, p5); printf("\n"); if (errno) printf("\tsystem error %d\n", errno); exit(1); }