diff options
| author | tv <tv@NetBSD.org> | 1998-09-13 22:23:02 +0000 |
|---|---|---|
| committer | tv <tv@NetBSD.org> | 1998-09-13 22:23:02 +0000 |
| commit | a2e65ee4f14ce9193eabdd3ac64a0fd3aa646ef8 (patch) | |
| tree | ccb81392b287910e9ead6764486d64491434ef5a /gnu/lib | |
| parent | 9adeb9bb841f499f9cbf25e3ebc524670daa595d (diff) | |
Nuke libg++, leaving only libstdc++ for GCC 2.7-based systems.
Diffstat (limited to 'gnu/lib')
121 files changed, 136 insertions, 36870 deletions
diff --git a/gnu/lib/libg++/Makefile b/gnu/lib/libg++/Makefile index 0baf5672634..443a2b44604 100644 --- a/gnu/lib/libg++/Makefile +++ b/gnu/lib/libg++/Makefile @@ -1,6 +1,6 @@ -# $NetBSD: Makefile,v 1.24 1997/05/31 21:21:19 cjs Exp $ +# $NetBSD: Makefile,v 1.25 1998/09/13 22:23:02 tv Exp $ -SUBDIR= libg++ libstdc++ # libio libiostream +SUBDIR= libstdc++ HEADERS= cassert cctype cerrno cfloat ciso646 climits clocale cmath complex \ csetjmp csignal cstdarg cstddef cstdio cstdlib cstring ctime \ @@ -8,20 +8,11 @@ HEADERS= cassert cctype cerrno cfloat ciso646 climits clocale cmath complex \ algorithm deque list map queue set stack vector utility functional \ iterator memory numeric +INCS= _G_config.h +INCSDIR= /usr/include/${MACHINE} -includes: - @echo installing includes from libg++/src - @(cd libg++/src ; for j in *.[ih]; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/$$j; \ - done) - @echo installing includes from include/gen - @(cd include/gen ; for j in *.*P; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/gen/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/gen/$$j; \ - done) +incinstall:: other-includes +other-includes: @echo installing includes from libio @(cd libio ; for j in *.h; do \ cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ @@ -47,4 +38,5 @@ includes: ${DESTDIR}/usr/include/g++/$$j; \ done) +.include <bsd.inc.mk> .include <bsd.subdir.mk> diff --git a/gnu/lib/libg++/_G_config.h b/gnu/lib/libg++/_G_config.h new file mode 100644 index 00000000000..0806ed75f15 --- /dev/null +++ b/gnu/lib/libg++/_G_config.h @@ -0,0 +1,121 @@ +/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ +#ifndef _G_config_h +#define _G_config_h +#define _G_LIB_VERSION "2.7.2" +#if ! defined(__alpha__) && !defined(__mips) /* ELF */ +#define _G_NAMES_HAVE_UNDERSCORE 1 +#else /* ELF */ +#define _G_NAMES_HAVE_UNDERSCORE 0 +#endif /* ELF */ +#define _G_VTABLE_LABEL_HAS_LENGTH 1 +#if ! defined(__alpha__) && !defined(__mips) /* ELF */ +#define _G_VTABLE_LABEL_PREFIX "__vt$" +#else /* ELF */ +#define _G_VTABLE_LABEL_PREFIX "_vt$" +#endif /* ELF */ +#define _G_HAVE_ST_BLKSIZE 1 +#ifndef __alpha__ +typedef unsigned long _G_clock_t; +#else /* __alpha__ */ +typedef int _G_clock_t; +#endif /* __alpha__ */ +typedef int _G_dev_t; +#ifndef __alpha__ +typedef long long _G_fpos_t; +#else /* __alpha__ */ +typedef long _G_fpos_t; +#endif /* __alpha__ */ +typedef unsigned int _G_gid_t; +typedef unsigned int _G_ino_t; +typedef unsigned short _G_mode_t; +typedef unsigned short _G_nlink_t; +#ifndef __alpha__ +typedef long long _G_off_t; +#else /* __alpha__ */ +typedef long _G_off_t; +#endif /* __alpha__ */ +typedef int _G_pid_t; +#ifndef __PTRDIFF_TYPE__ +#ifndef __alpha__ +#define __PTRDIFF_TYPE__ int +#else /* __alpha__ */ +#define __PTRDIFF_TYPE__ long +#endif /* __alpha__ */ +#endif +typedef __PTRDIFF_TYPE__ _G_ptrdiff_t; +typedef unsigned int _G_sigset_t; +#ifndef __SIZE_TYPE__ +#ifndef __alpha__ +#define __SIZE_TYPE__ unsigned int +#else /* __alpha__ */ +#define __SIZE_TYPE__ unsigned long +#endif /* __alpha__ */ +#endif +typedef __SIZE_TYPE__ _G_size_t; +#ifndef __alpha__ +typedef long _G_time_t; +#else /* __alpha__ */ +typedef int _G_time_t; +#endif /* __alpha__ */ +typedef unsigned int _G_uid_t; +typedef int _G_wchar_t; +#ifndef __alpha__ +typedef int _G_ssize_t; +typedef int /* default */ _G_wint_t; +#ifndef __powerpc__ +typedef char * _G_va_list; +#else +#define _G_NEED_STDARG_H 1 +#endif /* __powerpc__ */ +#else /* __alpha__ */ +typedef long _G_ssize_t; +typedef unsigned int /* default */ _G_wint_t; +#define _G_NEED_STDARG_H +#define _G_va_list va_list +#endif /* __alpha__ */ +#define _G_signal_return_type void +#define _G_sprintf_return_type int + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +typedef int _G_int8_t __attribute__((__mode__(__QI__))); +typedef unsigned int _G_uint8_t __attribute__((__mode__(__QI__))); +typedef int _G_int16_t __attribute__((__mode__(__HI__))); +typedef unsigned int _G_uint16_t __attribute__((__mode__(__HI__))); +typedef int _G_int32_t __attribute__((__mode__(__SI__))); +typedef unsigned int _G_uint32_t __attribute__((__mode__(__SI__))); +typedef int _G_int64_t __attribute__((__mode__(__DI__))); +typedef unsigned int _G_uint64_t __attribute__((__mode__(__DI__))); +#else +typedef short _G_int16_t; +typedef unsigned short _G_uint16_t; +typedef int _G_int32_t; +typedef unsigned int _G_uint32_t; +#endif + +#define _G_BUFSIZ 1024 +#define _G_FOPEN_MAX 20 +#define _G_FILENAME_MAX 1024 +#define _G_NULL 0 /* default */ +#if defined (__cplusplus) || defined (__STDC__) +#define _G_ARGS(ARGLIST) ARGLIST +#else +#define _G_ARGS(ARGLIST) () +#endif +#if !defined (__GNUG__) || defined (__STRICT_ANSI__) +#define _G_NO_NRV +#endif +#if !defined (__GNUG__) +#define _G_NO_EXTERN_TEMPLATES +#endif +#define _G_HAVE_ATEXIT 1 +#define _G_HAVE_SYS_RESOURCE 1 +#define _G_HAVE_SYS_TIMES 1 +#define _G_HAVE_SYS_SOCKET 1 +#define _G_HAVE_SYS_CDEFS 1 +#define _G_HAVE_SYS_WAIT 1 +#define _G_HAVE_UNISTD 1 +#define _G_HAVE_DIRENT 1 +#define _G_HAVE_CURSES 1 +#define _G_MATH_H_INLINES 0 +#define _G_HAVE_BOOL 1 +#endif /* !_G_config_h */ diff --git a/gnu/lib/libg++/libg++/Makefile b/gnu/lib/libg++/libg++/Makefile deleted file mode 100644 index dd8759f2517..00000000000 --- a/gnu/lib/libg++/libg++/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# $NetBSD: Makefile,v 1.26 1996/03/09 00:19:06 phil Exp $ -SUBDIR = src genclass - -.include <bsd.subdir.mk> diff --git a/gnu/lib/libg++/libg++/genclass/Makefile b/gnu/lib/libg++/libg++/genclass/Makefile deleted file mode 100644 index ba495a92f1b..00000000000 --- a/gnu/lib/libg++/libg++/genclass/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# $NetBSD: Makefile,v 1.4 1997/03/24 22:06:06 christos Exp $ -# Makefile for g++ library genclass - -BINDIR?= /usr/bin -SCRIPTS=genclass.sh - -.include <bsd.prog.mk> diff --git a/gnu/lib/libg++/libg++/genclass/genclass.sh b/gnu/lib/libg++/libg++/genclass/genclass.sh deleted file mode 100644 index b740a317d51..00000000000 --- a/gnu/lib/libg++/libg++/genclass/genclass.sh +++ /dev/null @@ -1,452 +0,0 @@ -#!/bin/sh - -# Copyright (C) 1989 Free Software Foundation, Inc. -# -# genclass program enhanced by Wendell C. Baker -# (original by Doug Lea (dl@rocky.oswego.edu)) - -#This file is part of GNU libg++. - -#GNU libg++ is free software; you can redistribute it and/or modify -#it under the terms of the GNU General Public License as published by -#the Free Software Foundation; either version 1, or (at your option) -#any later version. - -#GNU libg++ is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. - -#You should have received a copy of the GNU General Public License -#along with GNU libg++; see the file COPYING. If not, write to -#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - - -# -# genclass -list [proto ...] -# genclass -catalog [proto ...] -# genclass type1 {ref|val} proto [out_prefix] -# genclass -2 type1 {ref|val} type2 {ref, val} proto [out_prefix] -# -# Generate classes from prototypes -# -name=genclass ; -usage=" - $name -list [proto ...] - $name -catalog [proto ...] - $name type1 {ref|val} proto [out_prefix] - $name -2 type1 {ref|val} type2 {ref|val} proto [out_prefix]" ; - -case "$1" in --usage) - # - # -usage - # - echo "usage: $usage" 1>&2 ; - exit 0; - ;; --version) - # - # -version - # - # 2.7.2 is substituted by the build process. - # We currently use the libg++ version number (extracted from ../Makefile). - echo "$name: version 2.7.2" ; - exit 0; - ;; --requires) - # - # -requires - # - # The following line should contain any nonstandard programs - # which must be in the users's path (i.e. not referenced by a - # fullpath);it allows one to check a script for dependencies - # without exhaustively testing its usages. - # ... in this case genclass depends on nothing else. - echo ; - exit 0; - ;; -esac ; - -# pull it in from the environment -[ "$TRACE" = "" ] || set -xv - -# Search in standard g++ prototype directory and in the current directory -# NOTE: this variable is edited by the install process -PROTODIR=/usr/include/g++/gen - -pwd=`pwd` - -case "$1" in --catalog*|-list*) - # - # genclass -catalog [proto ...] - # genclass -list [proto ...] - # - option="$1" ; - shift ; - - case $# in - 0) - # - # -catalog - # -list - # - select=all ; - select_pattern=p ; - ;; - *) - # - # -catalog proto ... - # -list proto ... - # - select="$@" ; - select_pattern= ; - for i in $@ ; do - select_pattern="\ -$select_pattern -/.*$i\$/ p -" ; - done ; - - ;; - esac ; - - # - # select_pattern is now a (possibly-vacuous) newline- - # separated list of patterns of the form: - # - # /.*Proto1$/ p - # /.*Proto2$/ p - # /.*Proto3$/ p - # - # or select_pattern is simply ``p'' to select everything - - # Hmmm... not all systems have a fmt program; should we - # just go ahead and use ``nroff -Tcrt | cat -s'' here? - fmt='nroff -Tcrt | cat -s' - #fmt=fmt ; - - case "$option" in - -catalog*) - # - # -catalog [proto ...] - # - echo "\ -Catalog of ${name} class templates -directories searched: - $PROTODIR - $pwd -selecting: $select -classes available:" ; - ;; - -list*) - # - # -list [proto ...] - # - # no need to do anything (the list is coming out next) - ;; - esac ; - -# The sed script does the following: -# - If it does not end in a .ccP or .hP then -# it's not a template and we are not intereseted. -# - Get rid of pathname components [s;.*/;;] -# - Just take the template names -# - change quoting conventions and select off what we want to see -# -if it did not pass the patterns, kill it - - ls $pwd $PROTODIR | sed -e ' -/\.ccP$/ !{ - /\.hP$/ !{ - d - } -} -s;.*/;; -s/\.ccP$// -s/\.hP$// -' -e "$select_pattern -d -" | sort -u | case "$option" in - -catalog*) - # The library catalog information preceded the list - # format the list, and tab in in a bit to make it readable. - # Re-evaluate $fmt because it might contain a shell command - eval $fmt | sed -e 's/.*/ &/' ; - ;; - -list*) - # nothing special, just let the sorted list dribble out - # we must use cat to receive (and reproduce) the incoming list - cat ; - ;; - esac ; - exit 0; - ;; --2) - # - # genclass -2 type1 {ref|val} type2 {ref|val} proto [out_prefix] - # - N=2 ; - - case $# in - 6) # genclass -2 type1 {ref|val} type2 {ref|val} proto - ;; - 7) # genclass -2 type1 {ref|val} type2 {ref|val} proto out_prefix - ;; - *) - echo "usage: $usage" 1>&2 ; - exit 1; - esac ; - shift ; - ;; -*) - # - # genclass type1 {ref|val} proto [out_prefix] - # - N=1 ; - - case $# in - 3) # genclass type1 {ref|val} proto - ;; - 4) # genclass type1 {ref|val} proto out_prefix - ;; - *) - echo "usage: $usage" 1>&2 ; - exit 1; - esac ; - ;; -esac - -# -# Args are now (the point being the leading ``-2'' is gone) -# -# type1 {ref|val} proto [out_prefix] -# type1 {ref|val} type2 {ref|val} proto [out_prefix] -# - -# -# Quote all of the $1 $2 etc references to guard against -# dynamic syntax errors due to vacuous arguments (i.e. '') -# as sometimes occurs when genclass is used from a Makefile -# - -T1="$1"; -T1NAME="$T1." ; -T1SEDNAME="$T1" ; - -case "$2" in -ref) - T1ACC="\&" ; - ;; -val) - T1ACC=" " ; - ;; -*) - echo "${name}: Must specify type1 access as ref or val" 1>&2 ; - echo "usage: $usage" 1>&2 ; - exit 1; - ;; -esac - -# N is either 1 or 2 - -case $N in -1) - # - # type1 {ref|val} proto [out_prefix] - # - class="$3" ; - - T2="" ; - T2ACC="" ; - ;; -2) - # - # type1 {ref|val} type2 {ref|val} proto [out_prefix] - # - class="$5" ; - - T2="$3"; - T2NAME="$T2." ; - T2SEDNAME="$T2" ; - - case "$4" in - ref) - T2ACC="\&" ; - ;; - val) - T2ACC=" " ; - ;; - *) - echo "${name}: Must specify type2 access: ref or val" 1>&2 ; - echo "usage: $usage" 1>&2 ; - exit 1;; - esac; - ;; -esac - -defaultprefix="$T1NAME$T2NAME" ; - -case $# in -3) # type1 {ref|val} proto - replaceprefix="N" ; - prefix="$defaultprefix" ; - ;; -5) # type1 {ref|val} type2 {ref|val} proto - replaceprefix="N" ; - prefix="$defaultprefix" ; - ;; -4) # type1 {ref|val} proto out_prefix - prefix="$4" ; - replaceprefix="Y" ; - ;; -6) # type1 {ref|val} type2 {ref|val} proto out_prefix - prefix="$6" ; - replaceprefix="Y" ; - ;; -*) - echo "${name}: too many arguments" 1>&2 ; - echo "usage: $usage" 1>&2 ; - exit 1; - ;; -esac ; - -src_h=$class.hP -src_cc=$class.ccP -out_h=$prefix$class.h; -out_cc=$prefix$class.cc ; - -# -# Note #1: The .h and .cc parts are done separately -# in case only a .h exists for the prototype -# -# Note #2: Bind the .h and .cc parts to the fullpath -# directories at the same time to ensure consistency. -# - -if [ -f $pwd/$src_h ] ; then - fullsrc_h=$pwd/$src_h ; - fullsrc_cc=$pwd/$src_cc ; -elif [ -f $PROTODIR/$src_h ] ; then - fullsrc_h=$PROTODIR/$src_h ; - fullsrc_cc=$PROTODIR/$src_cc ; -else - echo "${name}: there is no prototype for class $class - file $src_h" 1>&2 ; - $0 -list ; - exit 1; -fi - -CASES="$N$replaceprefix" ; -# CASES is one of { 2Y 2N 1Y 1N } - -# -# WATCHOUT - we have no way of checking whether or not -# the proper case type is being used with the prototype. -# -# For example, we have no way of ensuring that any of -# Map variants are specified with the -2 argument set -# Further, we have no way of ensuring that -2 is not -# used with the prototypes which require only one. -# -# The second problem is not serious because it still -# results in correctly-generated C++ code; the first -# problem is serious because it results in C++ code that -# still has ``<C>'' and ``<C&>'' syntax inside it. Such -# code of course will not compile. -# -# SO THE BEST WE CAN DO - is check for the presence of -# <C> and <C&> AFTER the thing has been generated. -# - -case $CASES in -2Y) # Two output substitutions, change the prefix - sed < $fullsrc_h > $out_h -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/<C>/$T2/g -s/<C&>/$T2$T2ACC/g -s/$T1SEDNAME\.$T2SEDNAME\./$prefix/g -s/$T1SEDNAME\./$prefix/g -s/$T2SEDNAME\./$prefix/g -" ; - ;; -2N) # Two output substitutions, use the default prefix - sed < $fullsrc_h > $out_h -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/<C>/$T2/g -s/<C&>/$T2$T2ACC/g -" ; - ;; -1Y) # One output substitution, change the prefix - sed < $fullsrc_h > $out_h -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/$T1SEDNAME\./$prefix/g -" ; - ;; -1N) # One output substitution, use the default prefix - sed < $fullsrc_h > $out_h -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -" ; - ;; -esac - -if egrep '<C&?>' $out_h > /dev/null ; then - echo "${name}: the $class class requires the -2 syntax for the 2nd type" 1>&2 ; - echo "usage: $usage" 1>&2 ; - # the user does not get to see the mistakes (he might try to compile it) - rm $out_h ; - exit 1; -fi ; - -if [ ! -f $fullsrc_cc ] ; then - echo "${name}: warning, class has a .h but no .cc file" 1>&2 ; - exit 0; -fi - -case $CASES in -2Y) # Two output substitutions, change the prefix - sed < $fullsrc_cc > $out_cc -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/<C>/$T2/g -s/<C&>/$T2$T2ACC/g -s/$T1SEDNAME\.$T2SEDNAME\./$prefix/g -s/$T1SEDNAME\./$prefix/g -s/$T2SEDNAME\./$prefix/g -" - ;; -2N) # Two output substitutions, use the default prefix - sed < $fullsrc_cc > $out_cc -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/<C>/$T2/g -s/<C&>/$T2$T2ACC/g -" - ;; -1Y) # One output substitution, change the prefix - sed < $fullsrc_cc > $out_cc -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -s/$T1SEDNAME\./$prefix/g -" - ;; -1N) # One output substitution, use the default prefix - sed < $fullsrc_cc > $out_cc -e " -s/<T>/$T1/g -s/<T&>/$T1$T1ACC/g -" - ;; -esac - -if egrep '<C&?>' $out_h $out_cc > /dev/null ; then - echo "${name}: the $class class requires the -2 syntax for the 2nd type" 1>&2 ; - echo "usage: $usage" 1>&2 ; - # the user does not get to see the mistakes (he might try to compile it) - rm $out_h $out_cc ; - exit 1; -fi ; - -exit 0; diff --git a/gnu/lib/libg++/libg++/src/ACG.cc b/gnu/lib/libg++/libg++/src/ACG.cc deleted file mode 100644 index b8a3c89e582..00000000000 --- a/gnu/lib/libg++/libg++/src/ACG.cc +++ /dev/null @@ -1,292 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <ACG.h> -#include <assert.h> - -// -// This is an extension of the older implementation of Algorithm M -// which I previously supplied. The main difference between this -// version and the old code are: -// -// + Andres searched high & low for good constants for -// the LCG. -// -// + theres more bit chopping going on. -// -// The following contains his comments. -// -// agn@UNH.CS.CMU.EDU sez.. -// -// The generator below is based on 2 well known -// methods: Linear Congruential (LCGs) and Additive -// Congruential generators (ACGs). -// -// The LCG produces the longest possible sequence -// of 32 bit random numbers, each being unique in -// that sequence (it has only 32 bits of state). -// It suffers from 2 problems: a) Independence -// isnt great, that is the (n+1)th number is -// somewhat related to the preceding one, unlike -// flipping a coin where knowing the past outcomes -// dont help to predict the next result. b) -// Taking parts of a LCG generated number can be -// quite non-random: for example, looking at only -// the least significant byte gives a permuted -// 8-bit counter (that has a period length of only -// 256). The advantage of an LCA is that it is -// perfectly uniform when run for the entire period -// length (and very uniform for smaller sequences -// too, if the parameters are chosen carefully). -// -// ACGs have extremly long period lengths and -// provide good independence. Unfortunately, -// uniformity isnt not too great. Furthermore, I -// didnt find any theoretically analysis of ACGs -// that addresses uniformity. -// -// The RNG given below will return numbers -// generated by an LCA that are permuted under -// control of a ACG. 2 permutations take place: the -// 4 bytes of one LCG generated number are -// subjected to one of 16 permutations selected by -// 4 bits of the ACG. The permutation a such that -// byte of the result may come from each byte of -// the LCG number. This effectively destroys the -// structure within a word. Finally, the sequence -// of such numbers is permuted within a range of -// 256 numbers. This greatly improves independence. -// -// -// Algorithm M as describes in Knuths "Art of Computer Programming", -// Vol 2. 1969 -// is used with a linear congruential generator (to get a good uniform -// distribution) that is permuted with a Fibonacci additive congruential -// generator to get good independence. -// -// Bit, byte, and word distributions were extensively tested and pass -// Chi-squared test near perfect scores (>7E8 numbers tested, Uniformity -// assumption holds with probability > 0.999) -// -// Run-up tests for on 7E8 numbers confirm independence with -// probability > 0.97. -// -// Plotting random points in 2d reveals no apparent structure. -// -// Autocorrelation on sequences of 5E5 numbers (A(i) = SUM X(n)*X(n-i), -// i=1..512) -// results in no obvious structure (A(i) ~ const). -// -// Except for speed and memory requirements, this generator outperforms -// random() for all tests. (random() scored rather low on uniformity tests, -// while independence test differences were less dramatic). -// -// AGN would like to.. -// thanks to M.Mauldin, H.Walker, J.Saxe and M.Molloy for inspiration & help. -// -// And I would (DGC) would like to thank Donald Kunth for AGN for letting me -// use his extensions in this implementation. -// - -// -// Part of the table on page 28 of Knuth, vol II. This allows us -// to adjust the size of the table at the expense of shorter sequences. -// - -static randomStateTable[][3] = { -{3,7,16}, {4,9, 32}, {3,10, 32}, {1,11, 32}, {1,15,64}, {3,17,128}, -{7,18,128}, {3,20,128}, {2,21, 128}, {1,22, 128}, {5,23, 128}, {3,25, 128}, -{2,29, 128}, {3,31, 128}, {13,33, 256}, {2,35, 256}, {11,36, 256}, -{14,39,256}, {3,41,256}, {9,49,256}, {3,52,256}, {24,55,256}, {7,57, 256}, -{19,58,256}, {38,89,512}, {17,95,512}, {6,97,512}, {11,98,512}, {-1,-1,-1} }; - -// -// spatial permutation table -// RANDOM_PERM_SIZE must be a power of two -// - -#define RANDOM_PERM_SIZE 64 -_G_uint32_t randomPermutations[RANDOM_PERM_SIZE] = { -0xffffffff, 0x00000000, 0x00000000, 0x00000000, // 3210 -0x0000ffff, 0x00ff0000, 0x00000000, 0xff000000, // 2310 -0xff0000ff, 0x0000ff00, 0x00000000, 0x00ff0000, // 3120 -0x00ff00ff, 0x00000000, 0xff00ff00, 0x00000000, // 1230 - -0xffff0000, 0x000000ff, 0x00000000, 0x0000ff00, // 3201 -0x00000000, 0x00ff00ff, 0x00000000, 0xff00ff00, // 2301 -0xff000000, 0x00000000, 0x000000ff, 0x00ffff00, // 3102 -0x00000000, 0x00000000, 0x00000000, 0xffffffff, // 2103 - -0xff00ff00, 0x00000000, 0x00ff00ff, 0x00000000, // 3012 -0x0000ff00, 0x00000000, 0x00ff0000, 0xff0000ff, // 2013 -0x00000000, 0x00000000, 0xffffffff, 0x00000000, // 1032 -0x00000000, 0x0000ff00, 0xffff0000, 0x000000ff, // 1023 - -0x00000000, 0xffffffff, 0x00000000, 0x00000000, // 0321 -0x00ffff00, 0xff000000, 0x00000000, 0x000000ff, // 0213 -0x00000000, 0xff000000, 0x0000ffff, 0x00ff0000, // 0132 -0x00000000, 0xff00ff00, 0x00000000, 0x00ff00ff // 0123 -}; - -// -// SEED_TABLE_SIZE must be a power of 2 -// -#define SEED_TABLE_SIZE 32 -static _G_uint32_t seedTable[SEED_TABLE_SIZE] = { -0xbdcc47e5, 0x54aea45d, 0xec0df859, 0xda84637b, -0xc8c6cb4f, 0x35574b01, 0x28260b7d, 0x0d07fdbf, -0x9faaeeb0, 0x613dd169, 0x5ce2d818, 0x85b9e706, -0xab2469db, 0xda02b0dc, 0x45c60d6e, 0xffe49d10, -0x7224fea3, 0xf9684fc9, 0xfc7ee074, 0x326ce92a, -0x366d13b5, 0x17aaa731, 0xeb83a675, 0x7781cb32, -0x4ec7c92d, 0x7f187521, 0x2cf346b4, 0xad13310f, -0xb89cff2b, 0x12164de1, 0xa865168d, 0x32b56cdf -}; - -// -// The LCG used to scramble the ACG -// -// -// LC-parameter selection follows recommendations in -// "Handbook of Mathematical Functions" by Abramowitz & Stegun 10th, edi. -// -// LC_A = 251^2, ~= sqrt(2^32) = 66049 -// LC_C = result of a long trial & error series = 3907864577 -// - -static const _G_uint32_t LC_A = 66049; -static const _G_uint32_t LC_C = 3907864577; -static inline _G_uint32_t LCG(_G_uint32_t x) -{ - return( x * LC_A + LC_C ); -} - - -ACG::ACG(_G_uint32_t seed, int size) -{ - register int l; - initialSeed = seed; - - // - // Determine the size of the state table - // - - for (l = 0; - randomStateTable[l][0] != -1 && randomStateTable[l][1] < size; - l++); - - if (randomStateTable[l][1] == -1) { - l--; - } - - initialTableEntry = l; - - stateSize = randomStateTable[ initialTableEntry ][ 1 ]; - auxSize = randomStateTable[ initialTableEntry ][ 2 ]; - - // - // Allocate the state table & the auxillary table in a single malloc - // - - state = new _G_uint32_t[stateSize + auxSize]; - auxState = &state[stateSize]; - - reset(); -} - -// -// Initialize the state -// -void -ACG::reset() -{ - register _G_uint32_t u; - - if (initialSeed < SEED_TABLE_SIZE) { - u = seedTable[ initialSeed ]; - } else { - u = initialSeed ^ seedTable[ initialSeed & (SEED_TABLE_SIZE-1) ]; - } - - - j = randomStateTable[ initialTableEntry ][ 0 ] - 1; - k = randomStateTable[ initialTableEntry ][ 1 ] - 1; - - register int i; - for(i = 0; i < stateSize; i++) { - state[i] = u = LCG(u); - } - - for (i = 0; i < auxSize; i++) { - auxState[i] = u = LCG(u); - } - - k = u % stateSize; - int tailBehind = (stateSize - randomStateTable[ initialTableEntry ][ 0 ]); - j = k - tailBehind; - if (j < 0) { - j += stateSize; - } - - lcgRecurr = u; - - assert(sizeof(double) == 2 * sizeof(_G_int32_t)); -} - -ACG::~ACG() -{ - if (state) delete state; - state = 0; - // don't delete auxState, it's really an alias for state. -} - -// -// Returns 32 bits of random information. -// - -_G_uint32_t -ACG::asLong() -{ - _G_uint32_t result = state[k] + state[j]; - state[k] = result; - j = (j <= 0) ? (stateSize-1) : (j-1); - k = (k <= 0) ? (stateSize-1) : (k-1); - - short int auxIndex = (result >> 24) & (auxSize - 1); - register _G_uint32_t auxACG = auxState[auxIndex]; - auxState[auxIndex] = lcgRecurr = LCG(lcgRecurr); - - // - // 3c is a magic number. We are doing four masks here, so we - // do not want to run off the end of the permutation table. - // This insures that we have always got four entries left. - // - register _G_uint32_t *perm = & randomPermutations[result & 0x3c]; - - result = *(perm++) & auxACG; - result |= *(perm++) & ((auxACG << 24) - | ((auxACG >> 8)& 0xffffff)); - result |= *(perm++) & ((auxACG << 16) - | ((auxACG >> 16) & 0xffff)); - result |= *(perm++) & ((auxACG << 8) - | ((auxACG >> 24) & 0xff)); - - return(result); -} diff --git a/gnu/lib/libg++/libg++/src/ACG.h b/gnu/lib/libg++/libg++/src/ACG.h deleted file mode 100644 index aa1d25914a8..00000000000 --- a/gnu/lib/libg++/libg++/src/ACG.h +++ /dev/null @@ -1,68 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _ACG_h -#define _ACG_h 1 - -#include <RNG.h> -#include <math.h> -#ifdef __GNUG__ -#pragma interface -#endif - -// -// Additive number generator. This method is presented in Volume II -// of The Art of Computer Programming by Knuth. I've coded the algorithm -// and have added the extensions by Andres Nowatzyk of CMU to randomize -// the result of algorithm M a bit by using an LCG & a spatial -// permutation table. -// -// The version presented uses the same constants for the LCG that Andres -// uses (chosen by trial & error). The spatial permutation table is -// the same size (it's based on word size). This is for 32-bit words. -// -// The ``auxillary table'' used by the LCG table varies in size, and -// is chosen to be the the smallest power of two which is larger than -// twice the size of the state table. -// - -class ACG : public RNG { - - _G_uint32_t initialSeed; // used to reset generator - int initialTableEntry; - - _G_uint32_t *state; - _G_uint32_t *auxState; - short stateSize; - short auxSize; - _G_uint32_t lcgRecurr; - short j; - short k; - -protected: - -public: - ACG(_G_uint32_t seed = 0, int size = 55); - virtual ~ACG(); - // - // Return a long-words word of random bits - // - virtual _G_uint32_t asLong(); - virtual void reset(); -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/AllocRing.cc b/gnu/lib/libg++/libg++/src/AllocRing.cc deleted file mode 100644 index 883288ab048..00000000000 --- a/gnu/lib/libg++/libg++/src/AllocRing.cc +++ /dev/null @@ -1,110 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <std.h> -#include <AllocRing.h> -#include <new.h> - -AllocRing::AllocRing(int max) - :nodes(new AllocQNode[max]), n(max), current(0) -{ - for (int i = 0; i < n; ++i) - { - nodes[i].ptr = 0; - nodes[i].sz = 0; - } -} - -int AllocRing::find(void* p) -{ - if (p == 0) return -1; - - for (int i = 0; i < n; ++i) - if (nodes[i].ptr == p) - return i; - - return -1; -} - - -void AllocRing::clear() -{ - for (int i = 0; i < n; ++i) - { - if (nodes[i].ptr != 0) - { - delete(nodes[i].ptr); - nodes[i].ptr = 0; - } - nodes[i].sz = 0; - } - current = 0; -} - - -void AllocRing::free(void* p) -{ - int idx = find(p); - if (idx >= 0) - { - delete nodes[idx].ptr; - nodes[idx].ptr = 0; - } -} - -AllocRing::~AllocRing() -{ - clear(); -} - -int AllocRing::contains(void* p) -{ - return find(p) >= 0; -} - -static inline unsigned int good_size(unsigned int s) -{ - unsigned int req = s + 4; - unsigned int good = 8; - while (good < req) good <<= 1; - return good - 4; -} - -void* AllocRing::alloc(int s) -{ - unsigned int size = good_size(s); - - void* p; - if (nodes[current].ptr != 0 && - nodes[current].sz >= int(size) && - nodes[current].sz < int(4 * size)) - p = nodes[current].ptr; - else - { - if (nodes[current].ptr != 0) operator delete (nodes[current].ptr); - p = operator new (size); - nodes[current].ptr = p; - nodes[current].sz = size; - } - ++current; - if (current >= n) current = 0; - return p; -} diff --git a/gnu/lib/libg++/libg++/src/AllocRing.h b/gnu/lib/libg++/libg++/src/AllocRing.h deleted file mode 100644 index fc8b30c44d5..00000000000 --- a/gnu/lib/libg++/libg++/src/AllocRing.h +++ /dev/null @@ -1,62 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -#ifndef _AllocRing_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _AllocRing_h 1 - - -/* - An AllocRing holds the last n malloc'ed strings, reallocating/reusing - one only when the queue wraps around. It thus guarantees that the - last n allocations are intact. It is useful for things like I/O - formatting where reasonable restrictions may be made about the - number of allowable live allocations before auto-deletion. -*/ - -class AllocRing -{ - - struct AllocQNode - { - void* ptr; - int sz; - }; - - AllocQNode* nodes; - int n; - int current; - - int find(void* p); - -public: - - AllocRing(int max); - ~AllocRing(); - - void* alloc(int size); - int contains(void* ptr); - void clear(); - void free(void* p); -}; - - -#endif diff --git a/gnu/lib/libg++/libg++/src/Binomial.cc b/gnu/lib/libg++/libg++/src/Binomial.cc deleted file mode 100644 index 8e2b56d71ab..00000000000 --- a/gnu/lib/libg++/libg++/src/Binomial.cc +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Binomial.h> - -double Binomial::operator()() -{ - int s = 0; - for (int i = 0; i < pN; i++) { - if (pGenerator -> asDouble() < pU) { - s++; - } - } - return(double(s)); -} - diff --git a/gnu/lib/libg++/libg++/src/Binomial.h b/gnu/lib/libg++/libg++/src/Binomial.h deleted file mode 100644 index 58afa854caf..00000000000 --- a/gnu/lib/libg++/libg++/src/Binomial.h +++ /dev/null @@ -1,55 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Binomial_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Binomial_h 1 - -#include <Random.h> - -class Binomial: public Random { -protected: - int pN; - double pU; -public: - Binomial(int n, double u, RNG *gen); - - int n(); - int n(int xn); - - double u(); - double u(double xu); - - virtual double operator()(); - -}; - - -inline Binomial::Binomial(int n, double u, RNG *gen) -: Random(gen){ - pN = n; pU = u; -} - -inline int Binomial::n() { return pN; } -inline int Binomial::n(int xn) { int tmp = pN; pN = xn; return tmp; } - -inline double Binomial::u() { return pU; } -inline double Binomial::u(double xu) { double tmp = pU; pU = xu; return tmp; } - -#endif diff --git a/gnu/lib/libg++/libg++/src/BitSet.cc b/gnu/lib/libg++/libg++/src/BitSet.cc deleted file mode 100644 index 15096e2d28b..00000000000 --- a/gnu/lib/libg++/libg++/src/BitSet.cc +++ /dev/null @@ -1,1104 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - BitSet class implementation - */ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <BitSet.h> -#include <std.h> -#include <limits.h> -#include <Obstack.h> -#include <AllocRing.h> -#include <new.h> -#include <builtin.h> -#include <string.h> -#include <strstream.h> - -#undef OK - -void BitSet::error(const char* msg) const -{ - (*lib_error_handler)("BitSet", msg); -} - -// globals & constants - -BitSetRep _nilBitSetRep = { 0, 1, 0, {0} }; // nil BitSets point here - -#define ONES ((_BS_word)(~0L)) -#define MASK1(BITNO) ((_BS_word)1 << (BITNO)) -#define MAXBitSetRep_SIZE (((_BS_word)1 << (sizeof(unsigned short)*CHAR_BIT - 1)) - 1) -#define MINBitSetRep_SIZE (sizeof(_BS_word)*CHAR_BIT) - -#ifndef MALLOC_MIN_OVERHEAD -#define MALLOC_MIN_OVERHEAD 4 -#endif - -// break things up into .s indices and positions - - -// mask out bits from left - -static inline _BS_word lmask(int p) -{ - return ONES << p; -} - -// mask out high bits - -static inline _BS_word rmask(int p) -{ - return ONES >> (BITSETBITS - 1 - p); -} - - -inline static BitSetRep* BSnew(int newlen) -{ - unsigned int siz = sizeof(BitSetRep) + newlen * sizeof(_BS_word) - + MALLOC_MIN_OVERHEAD; - unsigned int allocsiz = MINBitSetRep_SIZE;; - while (allocsiz < siz) allocsiz <<= 1; - allocsiz -= MALLOC_MIN_OVERHEAD; - if (allocsiz >= MAXBitSetRep_SIZE * sizeof(_BS_word)) - (*lib_error_handler)("BitSet", "Requested length out of range"); - - BitSetRep* rep = new (operator new (allocsiz)) BitSetRep; - memset(rep, 0, allocsiz); - rep->sz = (allocsiz - sizeof(BitSetRep) + sizeof(_BS_word)) / sizeof(_BS_word); - return rep; -} - -BitSetRep* BitSetalloc(BitSetRep* old, const _BS_word* src, int srclen, - int newvirt, int newlen) -{ - if (old == &_nilBitSetRep) old = 0; - BitSetRep* rep; - if (old == 0 || newlen >= old->sz) - rep = BSnew(newlen); - else - rep = old; - - rep->len = newlen; - rep->virt = newvirt; - - if (srclen != 0 && src != rep->s) - memcpy(rep->s, src, srclen * sizeof(_BS_word)); - // BUG fix: extend virtual bit! 20 Oct 1992 Kevin Karplus - if (rep->virt) - memset(&rep->s[srclen], (char)ONES, - (newlen - srclen) * sizeof(_BS_word)); - if (old != rep && old != 0) delete old; - return rep; -} - -BitSetRep* BitSetresize(BitSetRep* old, int newlen) -{ - BitSetRep* rep; - if (old == 0 || old == &_nilBitSetRep) - { - rep = BSnew(newlen); - rep->virt = 0; - } - else if (newlen >= old->sz) - { - rep = BSnew(newlen); - memcpy(rep->s, old->s, old->len * sizeof(_BS_word)); - rep->virt = old->virt; - // BUG fix: extend virtual bit! 20 Oct 1992 Kevin Karplus - if (rep->virt) - memset(&rep->s[old->len], (char)ONES, - (newlen - old->len) * sizeof(_BS_word)); - delete old; - } - else - { - rep = old; - if (rep->len < newlen) - memset(&rep->s[rep->len], - rep->virt ? (char)ONES : (char)0, - (newlen - rep->len) * sizeof(_BS_word)); - } - - rep->len = newlen; - - return rep; -} - -// same, for straight copy - -BitSetRep* BitSetcopy(BitSetRep* old, const BitSetRep* src) -{ - BitSetRep* rep; - if (old == &_nilBitSetRep) old = 0; - if (src == 0 || src == &_nilBitSetRep) - { - if (old == 0) - rep = BSnew(0); - else - rep = old; - rep->len = 0; - rep->virt = 0; - } - else if (old == src) - return old; - else - { - int newlen = src->len; - if (old == 0 || newlen > old->sz) - { - rep = BSnew(newlen); - if (old != 0) delete old; - } - else - rep = old; - - memcpy(rep->s, src->s, newlen * sizeof(_BS_word)); - rep->len = newlen; - rep->virt = src->virt; - } - return rep; -} - - -// remove unneeded top bits - -inline static void trim(BitSetRep* rep) -{ - int l = rep->len; - _BS_word* s = &(rep->s[l - 1]); - - if (rep->virt == 0) - while (l > 0 && *s-- == 0) --l; - else - while (l > 0 && *s-- == ONES) --l; - rep->len = l; -} - -int operator == (const BitSet& x, const BitSet& y) -{ - if (x.rep->virt != y.rep->virt) - return 0; - int xl = x.rep->len; - int yl = y.rep->len; - - const _BS_word* xs = x.rep->s; - const _BS_word* ys = y.rep->s; - if (xl < yl) { - if (memcmp((void*)xs, (void*)ys, xl * sizeof(_BS_word))) - return 0; - ys+=xl; - const _BS_word* topy = &(ys[yl]); - while (ys<topy) - if (x.rep->virt?((*ys++)!=ONES):((*ys++)!=0)) - return 0; - } - else { - if (memcmp((void*)xs, (void*)ys, yl * sizeof(_BS_word))) - return 0; - if (xl > yl) { - xs+=yl; - const _BS_word* topx = &(xs[xl]); - while (xs<topx) - if (y.rep->virt?((*xs++)!=ONES):((*xs++)!=0)) - return 0; - } - } - return 1; -} - -int operator <= (const BitSet& x, const BitSet& y) -{ - if (x.rep->virt > y.rep->virt) - return 0; - - int xl = x.rep->len; - int yl = y.rep->len; - - const _BS_word* xs = x.rep->s; - const _BS_word* ys = y.rep->s; - const _BS_word* topx = &(xs[xl]); - const _BS_word* topy = &(ys[yl]); - - while (xs < topx && ys < topy) - { - _BS_word a = *xs++; - _BS_word b = *ys++; - if ((a | b) != b) - return 0; - } - if (xl < yl) { - if (x.rep->virt) { - while (ys<topy) - if ((*ys++)!=ONES) - return 0; - } - } - else if (xl > yl) { - if (!y.rep->virt) { - while (xs<topx) - if ((*xs++)!=0) - return 0; - } - } - return 1; -} - - -int operator < (const BitSet& x, const BitSet& y) -{ - if (x.rep->virt > y.rep->virt) - return 0; - - int xl = x.rep->len; - int yl = y.rep->len; - - _BS_word* xs = x.rep->s; - _BS_word* ys = y.rep->s; - _BS_word* topx = &(xs[xl]); - _BS_word* topy = &(ys[yl]); - int one_diff = 0; - while (xs < topx && ys < topy) - { - _BS_word a = *xs++; - _BS_word b = *ys++; - _BS_word c = a | b; - if (c != b) - return 0; - else if (c != a) - one_diff = 1; - } - if (xl < yl) { - if (x.rep->virt) { - if (!one_diff) - return 0; - while (ys<topy) - if ((*ys++)!=ONES) - return 0; - return 1; - } - else { - if (one_diff || y.rep->virt) - return 1; - while (ys<topy) - if ((*ys++)!=0) - return 1; - return 0; - } - } - else if (xl > yl) { - if (y.rep->virt) { - if (one_diff || !x.rep->virt) - return 1; - while (xs<topx) - if ((*xs++)!=ONES) - return 1; - return 0; - } - else { - if (!one_diff) - return 0; - while (xs<topx) - if ((*xs++)!=0) - return 0; - return 1; - } - } - else - return one_diff || x.rep->virt < y.rep->virt; -} - -int lcompare(const BitSet& x, const BitSet& y) -{ - int xl = x.rep->len; - int yl = y.rep->len; - - const _BS_word* xs = x.rep->s; - const _BS_word* ys = y.rep->s; - const _BS_word* topx = &(xs[xl]); - const _BS_word* topy = &(ys[yl]); - - while (xs < topx && ys < topy) - { - _BS_word a = *xs++; - _BS_word b = *ys++; - if (a!=b) { -#if 0 - // Faster but opinable - return (a<b) ? -1 : 1; -#else - _BS_word diff=(a^b); // one's where different - _BS_word mask=diff&~(diff-1); // first bit different - return (a&mask)?1:-1; -#endif - } - if (a<b) - return -1; - if (a>b) - return 1; - } - if (xl < yl) { - if (x.rep->virt) { - while (ys<topy) - if ((*ys++)!=ONES) - return 1; - return 0; - } - else { - while (ys<topy) - if ((*ys++)!=0) - return -1; - return 0; - } - } - else if (xl > yl) { - if (y.rep->virt) { - while (xs<topx) - if ((*xs++)!=ONES) - return -1; - return 0; - } - else { - while (xs<topx) - if ((*xs++)!=0) - return 1; - return 0; - } - } - return 0; -} - -int BitSet::empty() const -{ - if (rep->virt == 1) - return 0; - - _BS_word* bots = rep->s; - _BS_word* s = &(bots[rep->len - 1]); - while (s >= bots) if (*s-- != 0) return 0; - return 1; -} - - -int BitSet::count(int b) const -{ - if (b == rep->virt) - return -1; - int l = 0; - _BS_word* s = rep->s; - _BS_word* tops = &(s[rep->len]); - if (b == 1) - { - while (s < tops) - { - _BS_word a = *s++; - for (int i = 0; i < BITSETBITS && a != 0; ++i) - { - if (a & 1) - ++l; - a >>= 1; - } - } - } - else - { - _BS_word maxbit = MASK1 (BITSETBITS - 1); - while (s < tops) - { - _BS_word a = *s++; - for (int i = 0; i < BITSETBITS; ++i) - { - if ((a & maxbit) == 0) - ++l; - a <<= 1; - } - } - } - return l; -} - -BitSetRep* BitSetcmpl(const BitSetRep* src, BitSetRep* r) -{ - r = BitSetcopy(r, src); - r->virt = !src->virt; - _BS_word* rs = r->s; - _BS_word* topr = &(rs[r->len]); - if (r->len == 0) - *rs = ONES; - else - { - while (rs < topr) - { - _BS_word cmp = ~(*rs); - *rs++ = cmp; - } - } - trim(r); - return r; -} - - -BitSetRep* BitSetop(const BitSetRep* x, const BitSetRep* y, - BitSetRep* r, char op) -{ - int xrsame = x == r; - int yrsame = y == r; - int xv = x->virt; - int yv = y->virt; - int xl = x->len; - int yl = y->len; - int rl = (xl >= yl)? xl : yl; - - r = BitSetresize(r, rl); - _BS_word* rs = r->s; - _BS_word* topr = &(rs[rl]); - - int av, bv; - const _BS_word* as; - const _BS_word* topa; - const _BS_word* bs; - const _BS_word* topb; - - if (xl <= yl) - { - as = (xrsame)? r->s : x->s; - av = xv; - topa = &(as[xl]); - bs = (yrsame)? r->s : y->s; - bv = yv; - topb = &(bs[yl]); - } - else - { - as = (yrsame)? r->s : y->s; - av = yv; - topa = &(as[yl]); - bs = (xrsame)? r->s : x->s; - bv = xv; - topb = &(bs[xl]); - if (op == '-') // reverse sense of difference - op = 'D'; - } - - switch (op) - { - case '&': - r->virt = av & bv; - while (as < topa) *rs++ = *as++ & *bs++; - if (av) - while (rs < topr) *rs++ = *bs++; - else - while (rs < topr) *rs++ = 0; - break; - case '|': - r->virt = av | bv; - while (as < topa) *rs++ = *as++ | *bs++; - if (av) - while (rs < topr) *rs++ = ONES; - else - while (rs < topr) *rs++ = *bs++; - break; - case '^': - r->virt = av ^ bv; - while (as < topa) *rs++ = *as++ ^ *bs++; - if (av) - while (rs < topr) *rs++ = ~(*bs++); - else - while (rs < topr) *rs++ = *bs++; - break; - case '-': - r->virt = av & ~(bv); - while (as < topa) *rs++ = *as++ & ~(*bs++); - if (av) - while (rs < topr) *rs++ = ~(*bs++); - else - while (rs < topr) *rs++ = 0; - break; - case 'D': - r->virt = ~(av) & (bv); - while (as < topa) *rs++ = ~(*as++) & (*bs++); - if (av) - while (rs < topr) *rs++ = 0; - else - while (rs < topr) *rs++ = *bs++; - break; - } - trim(r); - return r; -} - - -void BitSet::set(int p) -{ - if (p < 0) error("Illegal bit index"); - - int index = BitSet_index(p); - int pos = BitSet_pos(p); - - if (index >= rep->len) - { - if (rep->virt) - return; - else - rep = BitSetresize(rep, index+1); - } - - rep->s[index] |= MASK1 (pos); -} - -void BitSet::clear() -{ - if (rep->len > 0) memset(rep->s, 0, rep->sz * sizeof(_BS_word)); - rep->len = rep->virt = 0; -} - -void BitSet::clear(int p) -{ - if (p < 0) error("Illegal bit index"); - int index = BitSet_index(p); - if (index >= rep->len) - { - if (rep->virt == 0) - return; - else - rep = BitSetresize(rep, index+1); - } - rep->s[index] &= ~MASK1(BitSet_pos(p)); -} - -void BitSet::invert(int p) -{ - if (p < 0) error("Illegal bit index"); - int index = BitSet_index(p); - if (index >= rep->len) rep = BitSetresize(rep, index+1); - rep->s[index] ^= MASK1(BitSet_pos(p)); -} - -void BitSet::set(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - - int index1 = BitSet_index(from); - int pos1 = BitSet_pos(from); - - if (rep->virt && index1 >= rep->len) - return; - - int index2 = BitSet_index(to); - int pos2 = BitSet_pos(to); - - if (index2 >= rep->len) - rep = BitSetresize(rep, index2+1); - - _BS_word* s = &(rep->s[index1]); - _BS_word m1 = lmask(pos1); - _BS_word m2 = rmask(pos2); - if (index2 == index1) - *s |= m1 & m2; - else - { - *s++ |= m1; - _BS_word* top = &(rep->s[index2]); - *top |= m2; - while (s < top) - *s++ = ONES; - } -} - -void BitSet::clear(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - - int index1 = BitSet_index(from); - int pos1 = BitSet_pos(from); - - if (!rep->virt && index1 >= rep->len) - return; - - int index2 = BitSet_index(to); - int pos2 = BitSet_pos(to); - - if (index2 >= rep->len) - rep = BitSetresize(rep, index2+1); - - _BS_word* s = &(rep->s[index1]); - _BS_word m1 = lmask(pos1); - _BS_word m2 = rmask(pos2); - if (index2 == index1) - *s &= ~(m1 & m2); - else - { - *s++ &= ~m1; - _BS_word* top = &(rep->s[index2]); - *top &= ~m2; - while (s < top) - *s++ = 0; - } -} - -void BitSet::invert(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - - int index1 = BitSet_index(from); - int pos1 = BitSet_pos(from); - int index2 = BitSet_index(to); - int pos2 = BitSet_pos(to); - - if (index2 >= rep->len) - rep = BitSetresize(rep, index2+1); - - _BS_word* s = &(rep->s[index1]); - _BS_word m1 = lmask(pos1); - _BS_word m2 = rmask(pos2); - if (index2 == index1) - *s ^= m1 & m2; - else - { - *s++ ^= m1; - _BS_word* top = &(rep->s[index2]); - *top ^= m2; - while (s < top) - { - _BS_word cmp = ~(*s); - *s++ = cmp; - } - } -} - - -int BitSet::test(int from, int to) const -{ - if (from < 0 || from > to) return 0; - - int index1 = BitSet_index(from); - int pos1 = BitSet_pos(from); - - if (index1 >= rep->len) - return rep->virt; - - int index2 = BitSet_index(to); - int pos2 = BitSet_pos(to); - - if (index2 >= rep->len) - { - if (rep->virt) - return 1; - else - { - index2 = rep->len - 1; - pos2 = BITSETBITS - 1; - } - } - - _BS_word* s = &(rep->s[index1]); - _BS_word m1 = lmask(pos1); - _BS_word m2 = rmask(pos2); - - if (index2 == index1) - return (*s & m1 & m2) != 0; - else - { - if (*s++ & m1) - return 1; - _BS_word* top = &(rep->s[index2]); - if (*top & m2) - return 1; - while (s < top) - if (*s++ != 0) - return 1; - return 0; - } -} - -int BitSet::next(int p, int b) const -{ - ++p; - int index = BitSet_index(p); - int pos = BitSet_pos(p); - - int l = rep->len; - - if (index >= l) - { - if (rep->virt == b) - return p; - else - return -1; - } - int j = index; - _BS_word* s = rep->s; - _BS_word a = s[j] >> pos; - int i = pos; - - if (b == 1) - { - for (; i < BITSETBITS && a != 0; ++i) - { - if (a & 1) - return j * BITSETBITS + i; - a >>= 1; - } - for (++j; j < l; ++j) - { - a = s[j]; - for (i = 0; i < BITSETBITS && a != 0; ++i) - { - if (a & 1) - return j * BITSETBITS + i; - a >>= 1; - } - } - if (rep->virt) - return j * BITSETBITS; - else - return -1; - } - else - { - for (; i < BITSETBITS; ++i) - { - if ((a & 1) == 0) - return j * BITSETBITS + i; - a >>= 1; - } - for (++j; j < l; ++j) - { - a = s[j]; - if (a != ONES) - { - for (i = 0; i < BITSETBITS; ++i) - { - if ((a & 1) == 0) - return j * BITSETBITS + i; - a >>= 1; - } - } - } - if (!rep->virt) - return j * BITSETBITS; - else - return -1; - } -} - -int BitSet::prev(int p, int b) const -{ - if (--p < 0) - return -1; - - int index = BitSet_index(p); - int pos = BitSet_pos(p); - - _BS_word* s = rep->s; - int l = rep->len; - - if (index >= l) - { - if (rep->virt == b) - return p; - else - { - index = l - 1; - pos = BITSETBITS - 1; - } - } - - int j = index; - _BS_word a = s[j]; - - int i = pos; - _BS_word maxbit = MASK1(pos); - - if (b == 1) - { - for (; i >= 0 && a != 0; --i) - { - if (a & maxbit) - return j * BITSETBITS + i; - a <<= 1; - } - maxbit = MASK1(BITSETBITS - 1); - for (--j; j >= 0; --j) - { - a = s[j]; - for (i = BITSETBITS - 1; i >= 0 && a != 0; --i) - { - if (a & maxbit) - return j * BITSETBITS + i; - a <<= 1; - } - } - return -1; - } - else - { - if (a != ONES) - { - for (; i >= 0; --i) - { - if ((a & maxbit) == 0) - return j * BITSETBITS + i; - a <<= 1; - } - } - maxbit = MASK1(BITSETBITS - 1); - for (--j; j >= 0; --j) - { - a = s[j]; - if (a != ONES) - { - for (i = BITSETBITS - 1; i >= 0; --i) - { - if ((a & maxbit) == 0) - return j * BITSETBITS + i; - a <<= 1; - } - } - } - return -1; - } -} - -int BitSet::last(int b) const -{ - if (b == rep->virt) - return -1; - else - return prev((rep->len) * BITSETBITS, b); -} - - -extern AllocRing _libgxx_fmtq; - -const char* BitSettoa(const BitSet& x, char f, char t, char star) -{ - trim(x.rep); - int wrksiz = (x.rep->len + 1) * BITSETBITS + 2; - char* fmtbase = (char *) _libgxx_fmtq.alloc(wrksiz); - ostrstream stream(fmtbase, wrksiz); - - x.printon(stream, f, t, star); - stream << ends; - return fmtbase; -} - -BitSet shorttoBitSet(unsigned short i) -{ - BitSet r; - _BS_word w = i; - r.rep = BitSetalloc(0, &w, 1, 0, 2); trim(r.rep); - return r; -} - -BitSet longtoBitSet(unsigned long i) -{ - BitSet r; -#if 1 - _BS_word w = i; - r.rep = BitSetalloc(0, &w, 1, 0, 2); -#else - _BS_word u[2]; - u[0] = i & ((_BS_word)(~(0))); - u[1] = sizeof(long) <= sizeof(_BS_word) ? 0 : i >> BITSETBITS; - r.rep = BitSetalloc(0, &u[0], 2, 0, 3); -#endif - trim(r.rep); - return r; -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -BitSet atoBitSet(const char* s, char f, char t, char star) return r -{ - int sl = strlen(s); - if (sl != 0) - { - r.rep = BitSetresize(r.rep, sl / BITSETBITS + 1); - _BS_word* rs = r.rep->s; - _BS_word a = 0; - _BS_word m = 1; - char lastch = 0; - unsigned int i = 0; - unsigned int l = 1; - for(;;) - { - char ch = s[i]; - if (ch == t) - a |= m; - else if (ch == star) - { - if ((r.rep->virt = (lastch == t))) - *rs = a | ~(m - 1); - else - *rs = a; - break; - } - else if (ch != f) - { - *rs = a; - break; - } - lastch = ch; - if (++i == sl) - { - *rs = a; - break; - } - else if (i % BITSETBITS == 0) - { - *rs++ = a; - a = 0; - m = 1; - ++l; - } - else - m <<= 1; - } - r.rep->len = l; - trim(r.rep); - } - return; -} - -#else - -BitSet atoBitSet(const char* s, char f, char t, char star) -{ - BitSet r; - int sl = strlen(s); - if (sl != 0) - { - r.rep = BitSetresize(r.rep, sl / BITSETBITS + 1); - _BS_word* rs = r.rep->s; - _BS_word a = 0; - _BS_word m = 1; - char lastch = 0; - unsigned int i = 0; - unsigned int l = 1; - for(;;) - { - char ch = s[i]; - if (ch == t) - a |= m; - else if (ch == star) - { - if (r.rep->virt = lastch == t) - *rs = a | ~(m - 1); - else - *rs = a; - break; - } - else if (ch != f) - { - *rs = a; - break; - } - lastch = ch; - if (++i == sl) - { - *rs = a; - break; - } - else if (i % BITSETBITS == 0) - { - *rs++ = a; - a = 0; - m = 1; - ++l; - } - else - m <<= 1; - } - r.rep->len = l; - trim(r.rep); - } - return r; -} - -#endif - -ostream& operator << (ostream& s, const BitSet& x) -{ - if (s.opfx()) - x.printon(s); - return s; -} - -void BitSet::printon(ostream& os, char f, char t, char star) const -// FIXME: Does not respect s.width()! -{ - trim(rep); - register streambuf* sb = os.rdbuf(); - const _BS_word* s = rep->s; - const _BS_word* top = &(s[rep->len - 1]); - - while (s < top) - { - _BS_word a = *s++; - for (int j = 0; j < BITSETBITS; ++j) - { - sb->sputc((a & 1)? t : f); - a >>= 1; - } - } - - if (!rep->virt) - { - _BS_word a = *s; - if (rep->len != 0) - { - for (int j = 0; j < BITSETBITS && a != 0; ++j) - { - sb->sputc((a & 1)? t : f); - a >>= 1; - } - } - sb->sputc(f); - } - else - { - _BS_word a = *s; - _BS_word mask = ONES; - _BS_word himask = MASK1(BITSETBITS - 1) - 1; - if (rep->len != 0) - { - for (int j = 0; j < BITSETBITS && a != mask; ++j) - { - sb->sputc((a & 1)? t : f); - a = (a >> 1) & himask; - mask = (mask >> 1) & himask; - } - } - sb->sputc(t); - } - - sb->sputc(star); -} - -int BitSet::OK() const -{ - int v = rep != 0; // have a rep - v &= rep->len <= rep->sz; // within bounds - v &= rep->virt == 0 || rep->virt == 1; // valid virtual bit - if (!v) error("invariant failure"); - return v; -} - diff --git a/gnu/lib/libg++/libg++/src/BitSet.h b/gnu/lib/libg++/libg++/src/BitSet.h deleted file mode 100644 index 3ff982a8eba..00000000000 --- a/gnu/lib/libg++/libg++/src/BitSet.h +++ /dev/null @@ -1,360 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _BitSet_h -#ifdef __GNUG__ -#pragma interface -#endif - -#define _BitSet_h 1 - -#include <iostream.h> -#include <limits.h> -#include <bitprims.h> - -#undef OK - -#define BITSETBITS (sizeof(_BS_word) * CHAR_BIT) - -struct BitSetRep -{ - unsigned short len; // number of _BS_word in s - unsigned short sz; // allocated slots - unsigned short virt; // virtual 0 or 1 - _BS_word s[1]; // bits start here -}; - -extern BitSetRep* BitSetalloc(BitSetRep*, const _BS_word*, - int, int, int); -extern BitSetRep* BitSetcopy(BitSetRep*, const BitSetRep*); -extern BitSetRep* BitSetresize(BitSetRep*, int); -extern BitSetRep* BitSetop(const BitSetRep*, const BitSetRep*, - BitSetRep*, char); -extern BitSetRep* BitSetcmpl(const BitSetRep*, BitSetRep*); -extern BitSetRep _nilBitSetRep; - -class BitSet; - -class BitSetBit -{ -protected: - BitSet* src; - unsigned long pos; - - public: - BitSetBit(BitSet* v, int p); - BitSetBit(const BitSetBit& b); - ~BitSetBit(); - operator int() const; - int operator = (int b); - int operator = (const BitSetBit& b); -}; - -class BitSet -{ -protected: - BitSetRep* rep; - - enum BS_op { - BS_and = (int) '&', - BS_or = (int) '|', - BS_xor = (int) '^', - BS_diff = (int) '-', - BS_inv = (int) '~' - }; - BitSet(const BitSet& x, const BitSet& y, enum BS_op op) - { rep = BitSetop (x.rep, y.rep, NULL, (char) op); } - BitSet(const BitSet& x, enum BS_op /* op */) - { rep = BitSetcmpl (x.rep, NULL); } - -public: - -// constructors - BitSet(); - BitSet(const BitSet&); - - ~BitSet(); - - BitSet& operator = (const BitSet& y); - -// equality & subset tests - - friend int operator == (const BitSet& x, const BitSet& y); - friend int operator != (const BitSet& x, const BitSet& y); - friend int operator < (const BitSet& x, const BitSet& y); - friend int operator <= (const BitSet& x, const BitSet& y); - friend int operator > (const BitSet& x, const BitSet& y); - friend int operator >= (const BitSet& x, const BitSet& y); - friend int lcompare(const BitSet& x, const BitSet& y); - -// operations on self - - BitSet& operator |= (const BitSet& y); - BitSet& operator &= (const BitSet& y); - BitSet& operator -= (const BitSet& y); - BitSet& operator ^= (const BitSet& y); - - void complement(); - -// functional operators - - friend BitSet operator & (const BitSet& x, const BitSet& y); - friend BitSet operator | (const BitSet& x, const BitSet& y); - friend BitSet operator ^ (const BitSet& x, const BitSet& y); - friend BitSet operator - (const BitSet& x, const BitSet& y); - friend BitSet operator ~ (const BitSet& x); - -// individual bit manipulation - - void set(int pos); - void set(int from, int to); - void set(); // set all - - void clear(int pos); - void clear(int from, int to); - void clear(); // clear all - - void invert(int pos); - void invert(int from, int to); - - int test(int pos) const; - int test(int from, int to) const; - - BitSetBit operator [] (int i); - -// iterators - - int first(int b = 1) const; - int last(int b = 1) const; - - int next(int pos, int b = 1) const; - int prev(int pos, int b = 1) const; - int previous(int pos, int b = 1) const /* Obsolete synonym */ - { return prev(pos, b); } - -// status - - int empty() const; - int virtual_bit() const; - int count(int b = 1) const; - -// convertors & IO - - friend BitSet atoBitSet(const char* s, - char f='0', char t='1', char star='*'); - // BitSettoa is deprecated; do not use in new programs. - friend const char* BitSettoa(const BitSet& x, - char f='0', char t='1', char star='*'); - - friend BitSet shorttoBitSet(unsigned short w); - friend BitSet longtoBitSet(unsigned long w); - - friend ostream& operator << (ostream& s, const BitSet& x); - void printon(ostream& s, - char f='0', char t='1', char star='*') const; - -#ifndef __STRICT_ANSI__ - // procedural versions of operators - - // The first three of these are incompatible with ANSI C++ digraphs. - // In any case, it's not a great interface. - friend void and(const BitSet& x, const BitSet& y, BitSet& r); - friend void or(const BitSet& x, const BitSet& y, BitSet& r); - friend void xor(const BitSet& x, const BitSet& y, BitSet& r); - friend void diff(const BitSet& x, const BitSet& y, BitSet& r); - friend void complement(const BitSet& x, BitSet& r); -#endif - -// misc - - void error(const char* msg) const; - int OK() const; -}; - - -typedef BitSet BitSetTmp; - -// These are inlined regardless of optimization - -inline int BitSet_index(int l) -{ - return (unsigned)(l) / BITSETBITS; -} - -inline int BitSet_pos(int l) -{ - return l & (BITSETBITS - 1); -} - -inline BitSet::BitSet() : rep(&_nilBitSetRep) {} - -inline BitSet::BitSet(const BitSet& x) :rep(BitSetcopy(0, x.rep)) {} - -inline BitSet::~BitSet() { if (rep != &_nilBitSetRep) delete rep; } - -inline BitSet& BitSet::operator = (const BitSet& y) -{ - rep = BitSetcopy(rep, y.rep); - return *this; -} - -inline int operator != (const BitSet& x, const BitSet& y) { return !(x == y); } - -inline int operator > (const BitSet& x, const BitSet& y) { return y < x; } - -inline int operator >= (const BitSet& x, const BitSet& y) { return y <= x; } - -#ifndef __STRICT_ANSI__ -inline void and(const BitSet& x, const BitSet& y, BitSet& r) -{ - r.rep = BitSetop(x.rep, y.rep, r.rep, '&'); -} - -inline void or(const BitSet& x, const BitSet& y, BitSet& r) -{ - r.rep = BitSetop(x.rep, y.rep, r.rep, '|'); -} - -inline void xor(const BitSet& x, const BitSet& y, BitSet& r) -{ - r.rep = BitSetop(x.rep, y.rep, r.rep, '^'); -} - -inline void diff(const BitSet& x, const BitSet& y, BitSet& r) -{ - r.rep = BitSetop(x.rep, y.rep, r.rep, '-'); -} - -inline void complement(const BitSet& x, BitSet& r) -{ - r.rep = BitSetcmpl(x.rep, r.rep); -} -#endif - -inline BitSet operator & (const BitSet& x, const BitSet& y) -{ - return BitSet::BitSet(x, y, BitSet::BS_and); -} - -inline BitSet operator | (const BitSet& x, const BitSet& y) -{ - return BitSet::BitSet(x, y, BitSet::BS_or); -} - -inline BitSet operator ^ (const BitSet& x, const BitSet& y) -{ - return BitSet::BitSet(x, y, BitSet::BS_xor); -} - -inline BitSet operator - (const BitSet& x, const BitSet& y) -{ - return BitSet::BitSet(x, y, BitSet::BS_diff); -} - -inline BitSet operator ~ (const BitSet& x) -{ - return BitSet::BitSet(x, BitSet::BS_inv); -} - -inline BitSet& BitSet::operator &= (const BitSet& y) -{ - rep = BitSetop(rep, y.rep, rep, '&'); - return *this; -} - -inline BitSet& BitSet::operator |= (const BitSet& y) -{ - rep = BitSetop(rep, y.rep, rep, '|'); - return *this; -} - -inline BitSet& BitSet::operator ^= (const BitSet& y) -{ - rep = BitSetop(rep, y.rep, rep, '^'); - return *this; -} - -inline BitSet& BitSet::operator -= (const BitSet& y) -{ - rep = BitSetop(rep, y.rep, rep, '-'); - return *this; -} - - -inline void BitSet::complement() -{ - rep = BitSetcmpl(rep, rep); -} - -inline int BitSet::virtual_bit() const -{ - return rep->virt; -} - -inline int BitSet::first(int b) const -{ - return next(-1, b); -} - -inline int BitSet::test(int p) const -{ - if (p < 0) error("Illegal bit index"); - int index = BitSet_index(p); - return (index >= rep->len)? rep->virt : - ((rep->s[index] & ((_BS_word)1 << BitSet_pos(p))) != 0); -} - - -inline void BitSet::set() -{ - rep = BitSetalloc(rep, 0, 0, 1, 0); -} - -inline BitSetBit::BitSetBit(const BitSetBit& b) :src(b.src), pos(b.pos) {} - -inline BitSetBit::BitSetBit(BitSet* v, int p) -{ - src = v; pos = p; -} - -inline BitSetBit::~BitSetBit() {} - -inline BitSetBit::operator int() const -{ - return src->test(pos); -} - -inline int BitSetBit::operator = (int b) -{ - if (b) src->set(pos); else src->clear(pos); return b; -} - -inline int BitSetBit::operator = (const BitSetBit& b) -{ - int i = (int)b; - *this = i; - return i; -} - -inline BitSetBit BitSet::operator [] (int i) -{ - if (i < 0) error("illegal bit index"); - return BitSetBit(this, i); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/BitString.cc b/gnu/lib/libg++/libg++/src/BitString.cc deleted file mode 100644 index 32568fa7ef2..00000000000 --- a/gnu/lib/libg++/libg++/src/BitString.cc +++ /dev/null @@ -1,1608 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - BitString class implementation - */ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <BitString.h> -#include <std.h> -#include <limits.h> -#include <Obstack.h> -#include <AllocRing.h> -#include <new.h> -#include <builtin.h> -#include <strstream.h> - -#undef OK - -void BitString::error(const char* msg) const -{ - (*lib_error_handler)("BitString", msg); -} - -// globals - -BitStrRep _nilBitStrRep = { 0, 1, {0} }; - -BitString _nil_BitString; - -#define MINBitStrRep_SIZE 8 -#define MAXBitStrRep_SIZE ((1 << (sizeof(short)*CHAR_BIT - 1)) - 1) - -#ifndef MALLOC_MIN_OVERHEAD -#define MALLOC_MIN_OVERHEAD 4 -#endif - -#define ONES ((_BS_word)(~0L)) -#define MAXBIT (((_BS_word)1) << (BITSTRBITS - 1)) - -/* - * bit manipulation utilities -*/ - -// break things up into .s indices and positions - -inline static int BitStr_len(int l) -{ - return (unsigned)(l) / BITSTRBITS + 1; -} - - -// mask out low bits - -static inline _BS_word lmask(int p) -{ - return ONES _BS_RIGHT p; -} - -// mask out high bits - -static inline _BS_word rmask(int p) -{ - int s = BITSTRBITS - 1 - p; - if (s <= 0) - return ONES; - else - return ONES _BS_LEFT s; -} - - -// mask out unused bits in last word of rep - -inline static void check_last(BitStrRep* r) -{ - int bit_len_mod = r->len & (BITSTRBITS - 1); - if (bit_len_mod) - r->s[r->len / BITSTRBITS] &= ONES _BS_LEFT (BITSTRBITS - bit_len_mod); -} - -// merge bits from next word - -static inline _BS_word borrow_hi(const _BS_word a[], int ind, - int maxind, int p) -{ - if (p == 0) - return a[ind]; - else if (ind < maxind) - return (a[ind] _BS_LEFT p) | (a[ind+1] _BS_RIGHT (BITSTRBITS - p)); - else - return (a[ind] _BS_LEFT p); -} - -// merge bits from prev word - -static inline _BS_word borrow_lo(const _BS_word a[], int ind, - int minind, int p) -{ - _BS_word word = a[ind] _BS_RIGHT (BITSTRBITS - 1 - p); - if (ind > minind) - word |= (a[ind-1] _BS_LEFT (p + 1)); - return word; -} - -// same with bounds check (for masks shorter than patterns) - -static inline _BS_word safe_borrow_hi(const _BS_word a[], int ind, - int maxind, int p) -{ - if (ind > maxind) - return 0; - else if (p == 0) - return a[ind]; - else if (ind == maxind) - return a[ind] _BS_LEFT p; - else - return (a[ind] _BS_LEFT p) | (a[ind+1] _BS_RIGHT (BITSTRBITS - p)); -} - - -// allocate a new rep; pad to near a power of two - -inline static BitStrRep* BSnew(int newlen) -{ - unsigned int siz = sizeof(BitStrRep) + BitStr_len(newlen) * sizeof(_BS_word) - + MALLOC_MIN_OVERHEAD; - unsigned int allocsiz = MINBitStrRep_SIZE;; - while (allocsiz < siz) allocsiz <<= 1; - allocsiz -= MALLOC_MIN_OVERHEAD; - if (allocsiz >= MAXBitStrRep_SIZE * sizeof(_BS_word)) - (*lib_error_handler)("BitString", "Requested length out of range"); - - BitStrRep* rep = new (operator new (allocsiz)) BitStrRep; - memset(rep, 0, allocsiz); - rep->sz = - (allocsiz - sizeof(BitStrRep) + sizeof(_BS_word)) / sizeof(_BS_word); - return rep; -} - -inline void -copy_bits (_BS_word* pdst, _BS_size_t dstbit, - const _BS_word* psrc, _BS_size_t srcbit, - _BS_size_t length) -{ - _BS_NORMALIZE (pdst, dstbit); - _BS_NORMALIZE (psrc, srcbit); - _BS_copy (pdst, dstbit, psrc, srcbit, length); -} - -BitStrRep* BStr_alloc(BitStrRep* old, const _BS_word* src, - int startpos, int endp, int newlen) -{ - if (old == &_nilBitStrRep) old = 0; - if (newlen < 0) newlen = 0; - int news = BitStr_len(newlen); - BitStrRep* rep; - if (old == 0 || news > old->sz) - rep = BSnew(newlen); - else - rep = old; - rep->len = newlen; - - if (src != 0 && endp > 0 && (src != rep->s || startpos > 0)) - copy_bits (rep->s, 0, src, startpos, endp - startpos); - - check_last(rep); - - if (old != rep && old != 0) delete old; - - return rep; -} - -BitStrRep* BStr_resize(BitStrRep* old, int newlen) -{ - BitStrRep* rep; - if (newlen < 0) newlen = 0; - int news = BitStr_len(newlen); - if (old == 0 || old == &_nilBitStrRep) - { - rep = BSnew(newlen); - } - else if (news > old->sz) - { - rep = BSnew(newlen); - memcpy(rep->s, old->s, BitStr_len(old->len) * sizeof(_BS_word)); - delete old; - } - else - rep = old; - - rep->len = newlen; - check_last(rep); - return rep; -} - -BitStrRep* BStr_copy(BitStrRep* old, const BitStrRep* src) -{ - BitStrRep* rep; - if (old == src && old != &_nilBitStrRep) return old; - if (old == &_nilBitStrRep) old = 0; - if (src == &_nilBitStrRep) src = 0; - if (src == 0) - { - if (old == 0) - rep = BSnew(0); - else - rep = old; - rep->len = 0; - } - else - { - int newlen = src->len; - int news = BitStr_len(newlen); - if (old == 0 || news > old->sz) - { - rep = BSnew(newlen); - if (old != 0) delete old; - } - else - rep = old; - - memcpy(rep->s, src->s, news * sizeof(_BS_word)); - rep->len = newlen; - } - check_last(rep); - return rep; -} - - -int operator == (const BitString& x, const BitString& y) -{ - return x.rep->len == y.rep->len && - memcmp((void*)x.rep->s, (void*)y.rep->s, - BitStr_len(x.rep->len) * sizeof(_BS_word)) == 0; -} - -int operator <= (const BitString& x, const BitString& y) -{ - unsigned int xl = x.rep->len; - unsigned int yl = y.rep->len; - if (xl > yl) - return 0; - - const _BS_word* xs = x.rep->s; - const _BS_word* topx = &(xs[BitStr_len(xl)]); - const _BS_word* ys = y.rep->s; - - while (xs < topx) - { - _BS_word a = *xs++; - _BS_word b = *ys++; - if ((a | b) != b) - return 0; - } - return 1; -} - -int operator < (const BitString& x, const BitString& y) -{ - unsigned short xl = x.rep->len; - unsigned short yl = y.rep->len; - if (xl > yl) - return 0; - - const _BS_word* xs = x.rep->s; - const _BS_word* ys = y.rep->s; - const _BS_word* topx = &(xs[BitStr_len(xl)]); - const _BS_word* topy = &(ys[BitStr_len(yl)]); - int one_diff = 0; - while (xs < topx) - { - _BS_word a = *xs++; - _BS_word b = *ys++; - _BS_word c = a | b; - if (c != b) - return 0; - else if (c != a) - one_diff = 1; - } - if (one_diff) - return 1; - else - { - while (ys < topy) - if (*ys++ != 0) - return 1; - return 0; - } -} - -int lcompare(const BitString& x, const BitString& y) -{ - return _BS_lcompare_0 (x.rep->s, x.rep->len, y.rep->s, y.rep->len); -} - -int BitString::count(unsigned int b) const -{ - int count = _BS_count (rep->s, 0, rep->len); - if (!b) - count = rep->len - count; - return count; -} - - -BitStrRep* cmpl(const BitStrRep* src, BitStrRep* r) -{ - r = BStr_copy(r, src); - _BS_word* rs = r->s; - _BS_word* topr = &(rs[BitStr_len(r->len)]); - while (rs < topr) - { - _BS_word cmp = ~(*rs); - *rs++ = cmp; - } - check_last(r); - return r; -} - - -BitStrRep* and(const BitStrRep* x, const BitStrRep* y, BitStrRep* r) -{ - int xrsame = x == r; - int yrsame = y == r; - - unsigned int xl = x->len; - unsigned int yl = y->len; - unsigned int rl = (xl <= yl)? xl : yl; - - r = BStr_resize(r, rl); - - _BS_word* rs = r->s; - _BS_word* topr = &(rs[BitStr_len(rl)]); - const _BS_word* xs = (xrsame)? rs : x->s; - const _BS_word* ys = (yrsame)? rs : y->s; - - while (rs < topr) *rs++ = *xs++ & *ys++; - check_last(r); - return r; -} - -BitStrRep* or(const BitStrRep* x, const BitStrRep* y, BitStrRep* r) -{ - unsigned int xl = x->len; - unsigned int yl = y->len; - unsigned int rl = (xl >= yl)? xl : yl; - int xrsame = x == r; - int yrsame = y == r; - - r = BStr_resize(r, rl); - - _BS_word* rs = r->s; - const _BS_word* xs = (xrsame)? rs : x->s; - const _BS_word* topx = &(xs[BitStr_len(xl)]); - const _BS_word* ys = (yrsame)? rs : y->s; - const _BS_word* topy = &(ys[BitStr_len(yl)]); - - if (xl <= yl) - { - while (xs < topx) *rs++ = *xs++ | *ys++; - if (rs != ys) while (ys < topy) *rs++ = *ys++; - } - else - { - while (ys < topy) *rs++ = *xs++ | *ys++; - if (rs != xs) while (xs < topx) *rs++ = *xs++; - } - check_last(r); - return r; -} - - -BitStrRep* xor(const BitStrRep* x, const BitStrRep* y, BitStrRep* r) -{ - unsigned int xl = x->len; - unsigned int yl = y->len; - unsigned int rl = (xl >= yl)? xl : yl; - int xrsame = x == r; - int yrsame = y == r; - - r = BStr_resize(r, rl); - - _BS_word* rs = r->s; - const _BS_word* xs = (xrsame)? rs : x->s; - const _BS_word* topx = &(xs[BitStr_len(xl)]); - const _BS_word* ys = (yrsame)? rs : y->s; - const _BS_word* topy = &(ys[BitStr_len(yl)]); - - if (xl <= yl) - { - while (xs < topx) *rs++ = *xs++ ^ *ys++; - if (rs != ys) while (ys < topy) *rs++ = *ys++; - } - else - { - while (ys < topy) *rs++ = *xs++ ^ *ys++; - if (rs != xs) while (xs < topx) *rs++ = *xs++; - } - check_last(r); - return r; -} - - -BitStrRep* diff(const BitStrRep* x, const BitStrRep* y, BitStrRep* r) -{ - unsigned int xl = x->len; - unsigned int yl = y->len; - int xrsame = x == y; - int yrsame = y == r; - - r = BStr_resize(r, xl); - - _BS_word* rs = r->s; - const _BS_word* xs = (xrsame)? rs : x->s; - const _BS_word* topx = &(xs[BitStr_len(xl)]); - const _BS_word* ys = (yrsame)? rs : y->s; - const _BS_word* topy = &(ys[BitStr_len(yl)]); - - if (xl <= yl) - { - while (xs < topx) *rs++ = *xs++ & ~(*ys++); - } - else - { - while (ys < topy) *rs++ = *xs++ & ~(*ys++); - if (rs != xs) while (xs < topx) *rs++ = *xs++; - } - check_last(r); - return r; -} - - -BitStrRep* cat(const BitStrRep* x, const BitStrRep* y, BitStrRep* r) -{ - unsigned int xl = x->len; - unsigned int yl = y->len; - unsigned int rl = xl + yl; - int xrsame = x == r; - int yrsame = y == r; - - if (yrsame) - { - if (xrsame) - { - r = BStr_resize(r, rl); - copy_bits (r->s, xl, r->s, 0, yl); - } - else - { - BitStrRep* tmp = BStr_copy(0, y); - r = BStr_resize(r, rl); - _BS_copy_0(r->s, x->s, xl); - copy_bits (r->s, xl, tmp->s, 0, yl); - delete tmp; - } - } - else - { - r = BStr_resize(r, rl); - if (!xrsame) _BS_copy_0(r->s, x->s, xl); - copy_bits (r->s, xl, y->s, 0, yl); - } - check_last(r); - return r; -} - -BitStrRep* cat(const BitStrRep* x, unsigned int bit, BitStrRep* r) -{ - unsigned int xl = x->len; - int xrsame = x == r; - r = BStr_resize(r, xl+1); - if (!xrsame) - _BS_copy_0(r->s, x->s, xl); - if (bit) - r->s[BitStr_index(xl)] |= _BS_BITMASK(BitStr_pos(xl)); - else - r->s[BitStr_index(xl)] &= ~(_BS_BITMASK(BitStr_pos(xl))); - check_last(r); - return r; -} - -BitStrRep* lshift(const BitStrRep* x, int s, BitStrRep* r) -{ - int xrsame = x == r; - int xl = x->len; - int rl = xl + s; - if (s == 0) - r = BStr_copy(r, x); - else if (rl <= 0) - { - r = BStr_resize(r, 0); - r->len = 0; - r->s[0] = 0; - } - else if (s > 0) - { - r = BStr_resize(r, rl); - const _BS_word* xs = (xrsame)? r->s : x->s; - copy_bits (r->s, s, xs, 0, xl); - _BS_clear (r->s, 0, s); - } - else if (xrsame) - { - r = BStr_resize(r, xl); - r->len = rl; - copy_bits (r->s, 0, r->s, -s, xl + s); - } - else - { - r = BStr_resize(r, rl); - copy_bits (r->s, 0, x->s, -s, xl + s); - } - check_last(r); - return r; -} - - -void BitString::set(int p) -{ - if (p < 0) error("Illegal bit index"); - if ((unsigned)(p) >= rep->len) rep = BStr_resize(rep, p + 1); - rep->s[BitStr_index(p)] |= _BS_BITMASK(BitStr_pos(p)); -} - -void BitString::assign(int p, unsigned int bit) -{ - if (p < 0) error("Illegal bit index"); - if ((unsigned)(p) >= rep->len) rep = BStr_resize(rep, p + 1); - if (bit) - rep->s[BitStr_index(p)] |= _BS_BITMASK(BitStr_pos(p)); - else - rep->s[BitStr_index(p)] &= ~(_BS_BITMASK(BitStr_pos(p))); -} - -void BitString::clear(int p) -{ - if (p < 0) error("Illegal bit index"); - if ((unsigned)(p) >= rep->len) rep = BStr_resize(rep, p + 1); - rep->s[BitStr_index(p)] &= ~(_BS_BITMASK(BitStr_pos(p))); -} - -void BitString::clear() -{ - if (rep == &_nilBitStrRep) return; - _BS_clear (rep->s, 0, rep->len); -} - -void BitString::set() -{ - if (rep == &_nilBitStrRep) return; - _BS_word* s = rep->s; - _BS_word* tops = &(s[BitStr_len(rep->len)]); - while (s < tops) *s++ = ONES; - check_last(rep); -} - -void BitString::invert(int p) -{ - if (p < 0) error("Illegal bit index"); - if ((unsigned)(p) >= rep->len) rep = BStr_resize(rep, p + 1); - rep->s[BitStr_index(p)] ^= _BS_BITMASK(BitStr_pos(p)); -} - -void BitString::set(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - if ((unsigned)(to) >= rep->len) rep = BStr_resize(rep, to+1); - - _BS_size_t len = to - from + 1; - _BS_word* xs = rep->s; - _BS_NORMALIZE (xs, from); - _BS_invert (xs, from, len); -} - -void BitString::clear(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - if ((unsigned)(to) >= rep->len) rep = BStr_resize(rep, to+1); - - _BS_size_t len = to - from + 1; - _BS_word* xs = rep->s; - _BS_NORMALIZE (xs, from); - _BS_clear (xs, from, len); -} - -void BitString::invert(int from, int to) -{ - if (from < 0 || from > to) error("Illegal bit index"); - if ((unsigned)(to) >= rep->len) rep = BStr_resize(rep, to+1); - _BS_size_t len = to - from + 1; - _BS_word* xs = rep->s; - _BS_NORMALIZE (xs, from); - _BS_invert (xs, from, len); -} - - -int BitString::test(int from, int to) const -{ - if (from < 0 || from > to || (unsigned)(from) >= rep->len) return 0; - - _BS_size_t len = to - from + 1; - _BS_word* xs = rep->s; - _BS_NORMALIZE (xs, from); - return _BS_any (xs, from, len); -} - -int BitString::next(int p, unsigned int b) const -{ - if ((unsigned)(++p) >= rep->len) - return -1; - - int ind = BitStr_index(p); - int pos = BitStr_pos(p); - int l = BitStr_len(rep->len); - - int j = ind; - const _BS_word* s = rep->s; - _BS_word a = s[j] >> pos; - int i = pos; - - if (b != 0) - { - for (; i < BITSTRBITS && a != 0; ++i) - { - if (a & 1) - return j * BITSTRBITS + i; - a >>= 1; - } - for (++j; j < l; ++j) - { - a = s[j]; - for (i = 0; i < BITSTRBITS && a != 0; ++i) - { - if (a & 1) - return j * BITSTRBITS + i; - a >>= 1; - } - } - return -1; - } - else - { - int last = BitStr_pos(rep->len); - if (j == l - 1) - { - for (; i < last; ++i) - { - if ((a & 1) == 0) - return j * BITSTRBITS + i; - a >>= 1; - } - return -1; - } - - for (; i < BITSTRBITS; ++i) - { - if ((a & 1) == 0) - return j * BITSTRBITS + i; - a >>= 1; - } - for (++j; j < l - 1; ++j) - { - a = s[j]; - if (a != ONES) - { - for (i = 0; i < BITSTRBITS; ++i) - { - if ((a & 1) == 0) - return j * BITSTRBITS + i; - a >>= 1; - } - } - } - a = s[j]; - for (i = 0; i < last; ++i) - { - if ((a & 1) == 0) - return j * BITSTRBITS + i; - a >>= 1; - } - return -1; - } -} - -int BitString::prev(int p, unsigned int b) const -{ - if (--p < 0) - return -1; - - int ind = BitStr_index(p); - int pos = BitStr_pos(p); - - const _BS_word* s = rep->s; - - if ((unsigned)(p) >= rep->len) - { - ind = BitStr_index(rep->len - 1); - pos = BitStr_pos(rep->len - 1); - } - - int j = ind; - _BS_word a = s[j]; - - int i = pos; - _BS_word maxbit = ((_BS_word)1) << pos; - - if (b != 0) - { - for (; i >= 0 && a != 0; --i) - { - if (a & maxbit) - return j * BITSTRBITS + i; - a <<= 1; - } - maxbit = ((_BS_word)1) << (BITSTRBITS - 1); - for (--j; j >= 0; --j) - { - a = s[j]; - for (i = BITSTRBITS - 1; i >= 0 && a != 0; --i) - { - if (a & maxbit) - return j * BITSTRBITS + i; - a <<= 1; - } - } - return -1; - } - else - { - if (a != ONES) - { - for (; i >= 0; --i) - { - if ((a & maxbit) == 0) - return j * BITSTRBITS + i; - a <<= 1; - } - } - maxbit = ((_BS_word)1) << (BITSTRBITS - 1); - for (--j; j >= 0; --j) - { - a = s[j]; - if (a != ONES) - { - for (i = BITSTRBITS - 1; i >= 0; --i) - { - if ((a & maxbit) == 0) - return j * BITSTRBITS + i; - a <<= 1; - } - } - } - return -1; - } -} - - -int BitString::search(int startx, int lengthx, - const _BS_word* ys, int starty, int lengthy) const -{ - const _BS_word* xs = rep->s; - int ylen = lengthy - starty; - int righty = lengthy - 1; - int rev = startx < 0; - if (rev) - { - int leftx = 0; - int rightx = lengthx + startx; - startx = rightx - ylen + 1; - if (ylen == 0) return startx; - if (starty < 0 || righty < 0 || startx < 0 || startx >= lengthx) return -1; - - int xind = BitStr_index(startx); - int xpos = BitStr_pos(startx); - int yind = BitStr_index(starty); - int ypos = BitStr_pos(starty); - - int rightxind = BitStr_index(rightx); - - _BS_word x = borrow_hi(xs, xind, rightxind, xpos); - - int rightyind = BitStr_index(righty); - int rightypos = BitStr_pos(righty); - _BS_word y = borrow_hi(ys, yind, rightyind, ypos); - _BS_word ymask; - if (yind == rightyind) - ymask = rmask(rightypos); - else if (yind+1 == rightyind) - ymask = rmask(BITSTRBITS - ypos + rightypos + 1); - else - ymask = ONES; - - int p = startx; - for (;;) - { - if ((x & ymask) == y) - { - int xi = xind; - int yi = yind; - for (;;) - { - if (++yi > rightyind || ++xi > rightxind) - return p; - _BS_word tx = borrow_hi(xs, xi, rightxind, xpos); - _BS_word ty = borrow_hi(ys, yi, rightyind, ypos); - if (yi == rightyind) - tx &= rmask(rightypos); - else if (yi+1 == rightyind) - tx &= rmask(BITSTRBITS - ypos + rightypos + 1); - if (tx != ty) - break; - } - } - if (--p < leftx) - return -1; - if (--xpos < 0) - { - xpos = BITSTRBITS - 1; - --xind; - } - x = borrow_hi(xs, xind, rightxind, xpos); - } - } - else - { - - int rightx = lengthx - 1; - if (ylen == 0) return startx; - if (starty < 0 || righty < 0 || startx < 0 || startx >= lengthx) return -1; - - int xind = BitStr_index(startx); - int xpos = BitStr_pos(startx); - int yind = BitStr_index(starty); - int ypos = BitStr_pos(starty); - - int rightxind = BitStr_index(rightx); - - _BS_word x = borrow_hi(xs, xind, rightxind, xpos); - _BS_word nextx = (xind >= rightxind) ? 0 : (xs[xind+1] >> xpos); - - int rightyind = BitStr_index(righty); - int rightypos = BitStr_pos(righty); - _BS_word y = borrow_hi(ys, yind, rightyind, ypos); - _BS_word ymask; - if (yind == rightyind) - ymask = rmask(rightypos); - else if (yind+1 == rightyind) - ymask = rmask(BITSTRBITS - ypos + rightypos + 1); - else - ymask = ONES; - - int p = startx; - for (;;) - { - if ((x & ymask) == y) - { - int xi = xind; - int yi = yind; - for (;;) - { - if (++yi > rightyind || ++xi > rightxind) - return p; - _BS_word tx = borrow_hi(xs, xi, rightxind, xpos); - _BS_word ty = borrow_hi(ys, yi, rightyind, ypos); - if (yi == rightyind) - tx &= rmask(rightypos); - else if (yi+1 == rightyind) - tx &= rmask(BITSTRBITS - ypos + rightypos + 1); - if (tx != ty) - break; - } - } - if (++p > rightx) - return -1; - if (++xpos == BITSTRBITS) - { - xpos = 0; - x = xs[++xind]; - nextx = (xind >= rightxind) ? 0 : xs[xind+1]; - } - else - { - x >>= 1; - if (nextx & 1) - x |= MAXBIT; - nextx >>= 1; - } - } - } -} - - -int BitPattern::search(const _BS_word* xs, int startx, int lengthx) const -{ - const _BS_word* ys = pattern.rep->s; - const _BS_word* ms = mask.rep->s; - int righty = pattern.rep->len - 1; - int rightm = mask.rep->len - 1; - - int rev = startx < 0; - if (rev) - { - int leftx = 0; - int rightx = lengthx + startx; - startx = rightx - righty; - - if (righty < 0) return startx; - if (startx < 0 || startx >= lengthx) return -1; - - int xind = BitStr_index(startx); - int xpos = BitStr_pos(startx); - - int rightxind = BitStr_index(rightx); - - int rightmind = BitStr_index(rightm); - int rightyind = BitStr_index(righty); - - _BS_word x = safe_borrow_hi(xs, xind, rightxind, xpos); - _BS_word m = safe_borrow_hi(ms, 0, rightmind, 0); - _BS_word y = safe_borrow_hi(ys, 0, rightyind, 0) & m; - - int p = startx; - for (;;) - { - if ((x & m) == y) - { - int xi = xind; - int yi = 0; - for (;;) - { - if (++yi > rightyind || ++xi > rightxind) - return p; - _BS_word tm = safe_borrow_hi(ms, yi, rightmind, 0); - _BS_word ty = safe_borrow_hi(ys, yi, rightyind, 0); - _BS_word tx = safe_borrow_hi(xs, xi, rightxind, xpos); - if ((tx & tm) != (ty & tm)) - break; - } - } - if (--p < leftx) - return -1; - if (--xpos < 0) - { - xpos = BITSTRBITS - 1; - --xind; - } - x = safe_borrow_hi(xs, xind, rightxind, xpos); - } - } - else - { - - int rightx = lengthx - 1; - - if (righty < 0) return startx; - if (startx < 0 || startx >= lengthx) return -1; - - int xind = BitStr_index(startx); - int xpos = BitStr_pos(startx); - - int rightxind = BitStr_index(rightx); - - int rightmind = BitStr_index(rightm); - int rightyind = BitStr_index(righty); - - _BS_word x = safe_borrow_hi(xs, xind, rightxind, xpos); - _BS_word m = safe_borrow_hi(ms, 0, rightmind, 0); - _BS_word y = safe_borrow_hi(ys, 0, rightyind, 0) & m; - - _BS_word nextx = (xind >= rightxind) ? 0 : (xs[xind+1] >> xpos); - - int p = startx; - for (;;) - { - if ((x & m) == y) - { - int xi = xind; - int yi = 0; - for (;;) - { - if (++yi > rightyind || ++xi > rightxind) - return p; - _BS_word tm = safe_borrow_hi(ms, yi, rightmind, 0); - _BS_word ty = safe_borrow_hi(ys, yi, rightyind, 0); - _BS_word tx = safe_borrow_hi(xs, xi, rightxind, xpos); - if ((tx & tm) != (ty & tm)) - break; - } - } - if (++p > rightx) - return -1; - if (++xpos == BITSTRBITS) - { - xpos = 0; - x = xs[++xind]; - nextx = (xind >= rightxind) ? 0 : xs[xind+1]; - } - else - { - x >>= 1; - if (nextx & 1) - x |= MAXBIT; - nextx >>= 1; - } - } - } -} - -int BitString::match(int startx, int lengthx, int exact, - const _BS_word* ys, int starty, int yl) const -{ - const _BS_word* xs = rep->s; - int ylen = yl - starty; - int righty = yl - 1; - - int rightx; - int rev = startx < 0; - if (rev) - { - rightx = lengthx + startx; - startx = rightx - ylen + 1; - if (exact && startx != 0) - return 0; - } - else - { - rightx = lengthx - 1; - if (exact && rightx - startx != righty) - return 0; - } - - if (ylen == 0) return 1; - if (righty < 0 || startx < 0 || startx >= lengthx) return 0; - - int xi = BitStr_index(startx); - int xpos = BitStr_pos(startx); - int yi = BitStr_index(starty); - int ypos = BitStr_pos(starty); - - int rightxind = BitStr_index(rightx); - int rightyind = BitStr_index(righty); - int rightypos = BitStr_pos(righty); - - for (;;) - { - _BS_word x = borrow_hi(xs, xi, rightxind, xpos); - _BS_word y = borrow_hi(ys, yi, rightyind, ypos); - if (yi == rightyind) - x &= rmask(rightypos); - else if (yi+1 == rightyind) - x &= rmask(BITSTRBITS - ypos + rightypos + 1); - if (x != y) - return 0; - else if (++yi > rightyind || ++xi > rightxind) - return 1; - } -} - -int BitPattern::match(const _BS_word* xs, int startx, - int lengthx, int exact) const -{ - const _BS_word* ys = pattern.rep->s; - int righty = pattern.rep->len - 1; - _BS_word* ms = mask.rep->s; - int rightm = mask.rep->len - 1; - - int rightx; - int rev = startx < 0; - if (rev) - { - rightx = lengthx + startx; - startx = rightx - righty; - if (exact && startx != 0) - return 0; - } - else - { - rightx = lengthx - 1; - if (exact && rightx - startx != righty) - return 0; - } - - if (righty < 0) return 1; - if (startx < 0 || startx >= lengthx) return 0; - - int xind = BitStr_index(startx); - int xpos = BitStr_pos(startx); - int yind = 0; - - int rightxind = BitStr_index(rightx); - int rightyind = BitStr_index(righty); - int rightmind = BitStr_index(rightm); - - for(;;) - { - _BS_word m = safe_borrow_hi(ms, yind, rightmind, 0); - _BS_word x = safe_borrow_hi(xs, xind, rightxind, xpos) & m; - _BS_word y = safe_borrow_hi(ys, yind, rightyind, 0) & m; - if (x != y) - return 0; - else if (++yind > rightyind || ++xind > rightxind) - return 1; - } -} - -BitSubString& BitSubString::operator = (const BitString& y) -{ - if (&S == &_nil_BitString) - return *this; - BitStrRep* targ = S.rep; - - unsigned int ylen = y.rep->len; - int sl = targ->len - len + ylen; - - if (y.rep == targ || ylen > len) - { - BitStrRep* oldtarg = targ; - targ = BStr_alloc(0, 0, 0, 0, sl); - _BS_copy (targ->s, 0, oldtarg->s, 0, pos); - copy_bits (targ->s, pos, y.rep->s, 0, ylen); - copy_bits (targ->s, pos + ylen, oldtarg->s, pos+len, oldtarg->len-pos-len); - delete oldtarg; - } - else if (len == ylen) - copy_bits (targ->s, pos, y.rep->s, 0, len); - else if (ylen < len) - { - copy_bits (targ->s, pos, y.rep->s, 0, ylen); - copy_bits (targ->s, pos + ylen, targ->s, pos + len, targ->len - pos - len); - targ->len = sl; - } - check_last(targ); - S.rep = targ; - return *this; -} - -BitSubString& BitSubString::operator = (const BitSubString& y) -{ - if (&S == &_nil_BitString) - return *this; - BitStrRep* targ = S.rep; - - if (len == 0 || pos >= targ->len) - return *this; - - int sl = targ->len - len + y.len; - - if (y.S.rep == targ || y.len > len) - { - BitStrRep* oldtarg = targ; - targ = BStr_alloc(0, 0, 0, 0, sl); - _BS_copy_0(targ->s, oldtarg->s, pos); - copy_bits (targ->s, pos, y.S.rep->s, y.pos, y.len); - copy_bits (targ->s, pos + y.len, oldtarg->s, pos+len, - oldtarg->len-pos-len); - delete oldtarg; - } - else if (len == y.len) - copy_bits (targ->s, pos, y.S.rep->s, y.pos, y.len); - else if (y.len < len) - { - copy_bits (targ->s, pos, y.S.rep->s, y.pos, y.len); - copy_bits (targ->s, pos + y.len, targ->s, pos + len, - targ->len - pos - len); - targ->len = sl; - } - check_last(targ); - S.rep = targ; - return *this; -} - -BitSubString BitString::at(int first, int len) -{ - return _substr(first, len); -} - -BitSubString BitString::before(int pos) -{ - return _substr(0, pos); -} - -BitSubString BitString::after(int pos) -{ - return _substr(pos + 1, rep->len - (pos + 1)); -} - -BitSubString BitString::at(const BitString& y, int startpos) -{ - int first = search(startpos, rep->len, y.rep->s, 0, y.rep->len); - return _substr(first, y.rep->len); -} - -BitSubString BitString::before(const BitString& y, int startpos) -{ - int last = search(startpos, rep->len, y.rep->s, 0, y.rep->len); - return _substr(0, last); -} - -BitSubString BitString::after(const BitString& y, int startpos) -{ - int first = search(startpos, rep->len, y.rep->s, 0, y.rep->len); - if (first >= 0) first += y.rep->len; - return _substr(first, rep->len - first); -} - - -BitSubString BitString::at(const BitSubString& y, int startpos) -{ - int first = search(startpos, rep->len, y.S.rep->s, y.pos, y.len); - return _substr(first, y.len); -} - -BitSubString BitString::before(const BitSubString& y, int startpos) -{ - int last = search(startpos, rep->len, y.S.rep->s, y.pos, y.len); - return _substr(0, last); -} - -BitSubString BitString::after(const BitSubString& y, int startpos) -{ - int first = search(startpos, rep->len, y.S.rep->s, y.pos, y.len); - if (first >= 0) first += y.len; - return _substr(first, rep->len - first); -} - -BitSubString BitString::at(const BitPattern& r, int startpos) -{ - int first = r.search(rep->s, startpos, rep->len); - return _substr(first, r.pattern.rep->len); -} - - -BitSubString BitString::before(const BitPattern& r, int startpos) -{ - int first = r.search(rep->s, startpos, rep->len); - return _substr(0, first); -} - -BitSubString BitString::after(const BitPattern& r, int startpos) -{ - int first = r.search(rep->s, startpos, rep->len); - if (first >= 0) first += r.pattern.rep->len; - return _substr(first, rep->len - first); -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) -#define RETURN(r) return -#define RETURNS(r) return r; -#define RETURN_OBJECT(TYPE, NAME) /* nothing */ -#define USE_UNSIGNED 1 /* probably correct */ -#else /* _G_NO_NRV */ -#define RETURN(r) return r -#define RETURNS(r) /* nothing */ -#define RETURN_OBJECT(TYPE, NAME) TYPE NAME; -#define USE_UNSIGNED 0 /* probably old bug */ -#endif - -BitString -common_prefix (const BitString& x, const BitString& y, int startpos) - RETURNS(r) -{ - RETURN_OBJECT(BitString, r); - unsigned int xl = x.rep->len; - unsigned int yl = y.rep->len; - - unsigned int startx, starty; - if (startpos < 0) - { - startx = xl + startpos; - starty = yl + startpos; - } - else - startx = starty = startpos; - - if (startx >= xl || starty >= yl) - RETURN(r); - - const _BS_word* xs = &(x.rep->s[BitStr_index(startx)]); - _BS_word a = *xs++; - unsigned int xp = startx; - - const _BS_word* ys = &(y.rep->s[BitStr_index(starty)]); - _BS_word b = *ys++; - unsigned int yp = starty; - - for(; xp < xl && yp < yl; ++xp, ++yp) - { - _BS_word xbit = ((_BS_word)1) << (BitStr_pos(xp)); - _BS_word ybit = ((_BS_word)1) << (BitStr_pos(yp)); - if (((a & xbit) == 0) != ((b & ybit) == 0)) - break; - if (xbit == MAXBIT) - a = *xs++; - if (ybit == MAXBIT) - b = *ys++; - } - r.rep = BStr_alloc(0, x.rep->s, startx, xp, xp - startx); - RETURN(r); -} - - -BitString -common_suffix (const BitString& x, const BitString& y, int startpos) - RETURNS(r) -{ - RETURN_OBJECT(BitString, r); - unsigned int xl = x.rep->len; - unsigned int yl = y.rep->len; - - unsigned int startx, starty; - if (startpos < 0) - { - startx = xl + startpos; - starty = yl + startpos; - } - else - startx = starty = startpos; - - if (startx >= xl || starty >= yl) - RETURN(r); - - const _BS_word* xs = &(x.rep->s[BitStr_index(startx)]); - _BS_word a = *xs--; - int xp = startx; - - const _BS_word* ys = &(y.rep->s[BitStr_index(starty)]); - _BS_word b = *ys--; - int yp = starty; - - for(; xp >= 0 && yp >= 0; --xp, --yp) - { - _BS_word xbit = ((_BS_word)1) << (BitStr_pos(xp)); - _BS_word ybit = ((_BS_word)1) << (BitStr_pos(yp)); - if (((a & xbit) == 0) != ((b & ybit) == 0)) - break; - if (xbit == 1) - a = *xs--; - if (ybit == 1) - b = *ys--; - } - r.rep = BStr_alloc(0, x.rep->s, xp+1, startx+1, startx - xp); - RETURN(r); -} - -BitString reverse (const BitString& x) - RETURNS(r) -{ - RETURN_OBJECT(BitString, r); - unsigned int yl = x.rep->len; - BitStrRep* y = BStr_resize(0, yl); - if (yl > 0) - { - const _BS_word* ls = x.rep->s; - _BS_word lm = 1; - _BS_word* rs = &(y->s[BitStr_index(yl - 1)]); - _BS_word rm = ((_BS_word)1) << (BitStr_pos(yl - 1)); - for (unsigned int l = 0; l < yl; ++l) - { - if (*ls & lm) - *rs |= rm; - if (lm == MAXBIT) - { - ++ls; - lm = 1; - } - else - lm <<= 1; - if (rm == 1) - { - --rs; - rm = MAXBIT; - } - else - rm >>= 1; - } - } - r.rep = y; - RETURN(r); -} - -BitString -atoBitString (const char* s, char f, char t) - RETURNS(res) -{ - RETURN_OBJECT(BitString, res); - int sl = strlen(s); - BitStrRep* r = BStr_resize(0, sl); - if (sl != 0) - { - unsigned int rl = 0; - _BS_word* rs = r->s; - _BS_word a = 0; - _BS_word m = 1; - unsigned int i = 0; - for(;;) - { - char ch = s[i]; - if (ch != t && ch != f) - { - *rs = a; - break; - } - ++rl; - if (ch == t) - a |= m; - if (++i == sl) - { - *rs = a; - break; - } - else if (i % BITSTRBITS == 0) - { - *rs++ = a; - a = 0; - m = 1; - } - else - m <<= 1; - } - r = BStr_resize(r, rl); - } - res.rep = r; - RETURN(res); -} - -BitPattern -atoBitPattern (const char* s, char f,char t,char x) - RETURNS(r) -{ - RETURN_OBJECT(BitPattern, r); - int sl = strlen(s); - if (sl != 0) - { - unsigned int rl = 0; - r.pattern.rep = BStr_resize(r.pattern.rep, sl); - r.mask.rep = BStr_resize(r.mask.rep, sl); - _BS_word* rs = r.pattern.rep->s; - _BS_word* ms = r.mask.rep->s; - _BS_word a = 0; - _BS_word b = 0; - _BS_word m = 1; - unsigned int i = 0; - for(;;) - { - char ch = s[i]; - if (ch != t && ch != f && ch != x) - { - *rs = a; - *ms = b; - break; - } - ++rl; - if (ch == t) - { - a |= m; - b |= m; - } - else if (ch == f) - { - b |= m; - } - if (++i == sl) - { - *rs = a; - *ms = b; - break; - } - else if (i % BITSTRBITS == 0) - { - *rs++ = a; - *ms++ = b; - a = 0; - b = 0; - m = 1; - } - else - m <<= 1; - } - r.pattern.rep = BStr_resize(r.pattern.rep, rl); - r.mask.rep = BStr_resize(r.mask.rep, rl); - } - RETURN(r); -} - -extern AllocRing _libgxx_fmtq; - -void BitString::printon (ostream& os, char f, char t) const -{ - unsigned int xl = rep->len; - const _BS_word* ptr = rep->s; - register streambuf *sb = os.rdbuf(); - _BS_word a = 0; - - for (unsigned int i = 0; i < xl; ++i) - { - if (i % BITSTRBITS == 0) - a = *ptr++; - sb->sputc((a & 1)? t : f); - a >>= 1; - } -} -const char* BitStringtoa(const BitString& x, char f, char t) -{ - int wrksiz = x.length() + 2; - char* fmtbase = (char *) _libgxx_fmtq.alloc(wrksiz); - ostrstream stream(fmtbase, wrksiz); - - x.printon(stream, f, t); - stream << ends; - return fmtbase; -} - -ostream& operator << (ostream& s, const BitString& x) -{ - if (s.opfx()) - x.printon(s); - return s; -} - -const char* BitPatterntoa(const BitPattern& p, char f,char t,char x) -{ - unsigned int pl = p.pattern.rep->len; - unsigned int ml = p.mask.rep->len; - unsigned int l = (pl <= ml)? pl : ml; - - int wrksiz = l + 2; - char* fmtbase = (char *) _libgxx_fmtq.alloc(wrksiz); - ostrstream stream(fmtbase, wrksiz); - - p.printon(stream, f, t, x); - stream << ends; - return fmtbase; -} - -void BitPattern::printon(ostream& s, char f,char t,char x) const -{ - unsigned int pl = pattern.rep->len; - unsigned int ml = mask.rep->len; - unsigned int l = (pl <= ml)? pl : ml; - register streambuf *sb = s.rdbuf(); - - const _BS_word* ps = pattern.rep->s; - const _BS_word* ms = mask.rep->s; - _BS_word a = 0; - _BS_word m = 0; - - for (unsigned int i = 0; i < l; ++i) - { - if (i % BITSTRBITS == 0) - { - a = *ps++; - m = *ms++; - } - if (m & 1) - sb->sputc((a & 1)? t : f); - else - sb->sputc(x); - a >>= 1; - m >>= 1; - } -} - -ostream& operator << (ostream& s, const BitPattern& x) -{ - if (s.opfx()) - x.printon(s); - return s; -} - - -int BitString::OK() const -{ - int v = rep != 0; // have a rep; - v &= BitStr_len(rep->len) <= rep->sz; // within allocated size - if (!v) error("invariant failure"); - return v; -} - -int BitSubString::OK() const -{ - int v = S.OK(); // valid BitString - v &= pos + len <= S.rep->len; // within bounds of targ - if (!v) S.error("BitSubString invariant failure"); - return v; -} - -int BitPattern::OK() const -{ - int v = pattern.OK() && mask.OK(); - if (!v) pattern.error("BitPattern invariant failure"); - return v; -} - diff --git a/gnu/lib/libg++/libg++/src/BitString.h b/gnu/lib/libg++/libg++/src/BitString.h deleted file mode 100644 index f3f2d8c3111..00000000000 --- a/gnu/lib/libg++/libg++/src/BitString.h +++ /dev/null @@ -1,763 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _BitString_h -#ifdef __GNUG__ -#pragma interface -#endif - -#define _BitString_h 1 - -#include <stream.h> -#include <limits.h> - -#undef OK - -#include <bitprims.h> -#define BITSTRBITS _BS_BITS_PER_WORD - -struct BitStrRep -{ - unsigned int len; // length in bits - unsigned short sz; // allocated slots - _BS_word s[1]; // bits start here -}; - -extern BitStrRep* BStr_alloc(BitStrRep*, const _BS_word*, int, int,int); -extern BitStrRep* BStr_resize(BitStrRep*, int); -extern BitStrRep* BStr_copy(BitStrRep*, const BitStrRep*); -extern BitStrRep* cmpl(const BitStrRep*, BitStrRep*); -extern BitStrRep* and(const BitStrRep*, const BitStrRep*, BitStrRep*); -extern BitStrRep* or(const BitStrRep*, const BitStrRep*, BitStrRep*); -extern BitStrRep* xor(const BitStrRep*, const BitStrRep*, BitStrRep*); -extern BitStrRep* diff(const BitStrRep*, const BitStrRep*, BitStrRep*); -extern BitStrRep* cat(const BitStrRep*, const BitStrRep*, BitStrRep*); -extern BitStrRep* cat(const BitStrRep*, unsigned int, BitStrRep*); -extern BitStrRep* lshift(const BitStrRep*, int, BitStrRep*); - - -class BitString; -class BitPattern; - -class BitStrBit -{ -protected: - BitString& src; - unsigned int pos; - - public: - BitStrBit(BitString& v, int p); - BitStrBit(const BitStrBit& b); - ~BitStrBit(); - operator unsigned int() const; - int operator = (unsigned int b); -}; - -class BitSubString -{ - friend class BitString; - friend class BitPattern; - -protected: - - BitString& S; - unsigned int pos; - unsigned int len; - - BitSubString(BitString& x, int p, int l); - BitSubString(const BitSubString& x); -public: - ~BitSubString(); - - BitSubString& operator = (const BitString&); - BitSubString& operator = (const BitSubString&); - - int length() const; - int empty() const; - - int OK() const; -}; - -class BitString -{ - friend class BitSubString; - friend class BitPattern; -protected: - BitStrRep* rep; - - int search(int, int, const _BS_word*, int, int) const; - int match(int, int, int, const _BS_word*,int,int) const; - BitSubString _substr(int first, int l); - -public: - -// constructors - BitString(); - BitString(const BitString&); - BitString(const BitSubString& y); - - ~BitString(); - - BitString& operator = (unsigned int bit); - BitString& operator = (const BitString& y); - BitString& operator = (const BitSubString& y); - -// equality & subset tests - - friend int operator == (const BitString&, const BitString&); - friend int operator != (const BitString&, const BitString&); - friend int operator < (const BitString&, const BitString&); - friend int operator <= (const BitString&, const BitString&); - friend int operator > (const BitString&, const BitString&); - friend int operator >= (const BitString&, const BitString&); - -// procedural versions of operators - - - friend void and(const BitString&, const BitString&, BitString&); - friend void or(const BitString&, const BitString&, BitString&); - friend void xor(const BitString&, const BitString&, BitString&); - friend void diff(const BitString&, const BitString&, BitString&); - friend void cat(const BitString&, const BitString&, BitString&); - friend void cat(const BitString&, unsigned int, BitString&); - friend void lshift(const BitString&, int, BitString&); - friend void rshift(const BitString&, int, BitString&); - - friend void complement(const BitString&, BitString&); - - friend int lcompare(const BitString&, const BitString&); - -// assignment-based operators -// (constuctive versions decalred inline below - - BitString& operator |= (const BitString&); - BitString& operator &= (const BitString&); - BitString& operator -= (const BitString&); - BitString& operator ^= (const BitString&); - BitString& operator += (const BitString&); - BitString& operator += (unsigned int b); - BitString& operator <<=(int s); - BitString& operator >>=(int s); - - void complement(); - -// individual bit manipulation - - void set(int pos); - void set(int from, int to); - void set(); - - void clear(int pos); - void clear(int from, int to); - void clear(); - - void invert(int pos); - void invert(int from, int to); - - int test(int pos) const; - int test(int from, int to) const; - - void assign(int p, unsigned int bit); - -// indexing - - BitStrBit operator [] (int pos); - -// iterators - - int first(unsigned int bit = 1) const; - int last(unsigned int b = 1) const; - - int next(int pos, unsigned int b = 1) const; - int prev(int pos, unsigned int b = 1) const; - int previous(int pos, unsigned int b = 1) const - { return prev(pos, b); } /* Obsolete synonym */ - -// searching & matching - - int index(unsigned int bit, int startpos = 0) const ; - int index(const BitString&, int startpos = 0) const; - int index(const BitSubString&, int startpos = 0) const; - int index(const BitPattern&, int startpos = 0) const; - - int contains(const BitString&) const; - int contains(const BitSubString&) const; - int contains(const BitPattern&) const; - - int contains(const BitString&, int pos) const; - int contains(const BitSubString&, int pos) const; - int contains(const BitPattern&, int pos) const; - - int matches(const BitString&, int pos = 0) const; - int matches(const BitSubString&, int pos = 0) const; - int matches(const BitPattern&, int pos = 0) const; - -// BitSubString extraction - - BitSubString at(int pos, int len); - BitSubString at(const BitString&, int startpos = 0); - BitSubString at(const BitSubString&, int startpos = 0); - BitSubString at(const BitPattern&, int startpos = 0); - - BitSubString before(int pos); - BitSubString before(const BitString&, int startpos = 0); - BitSubString before(const BitSubString&, int startpos = 0); - BitSubString before(const BitPattern&, int startpos = 0); - - BitSubString after(int pos); - BitSubString after(const BitString&, int startpos = 0); - BitSubString after(const BitSubString&, int startpos = 0); - BitSubString after(const BitPattern&, int startpos = 0); - -// other friends & utilities - - friend BitString common_prefix(const BitString&, const BitString&, - int pos = 0); - friend BitString common_suffix(const BitString&, const BitString&, - int pos = -1); - friend BitString reverse(const BitString&); - - void right_trim(unsigned int bit); - void left_trim(unsigned int bit); - -// status - - int empty() const ; - int count(unsigned int bit = 1) const; - int length() const; - -// convertors & IO - - friend BitString atoBitString(const char* s, char f='0', char t='1'); - // BitStringtoa is deprecated; do not use in new programs! - friend const char* BitStringtoa(const BitString&, char f='0', char t='1'); - void printon(ostream&, char f='0', char t='1') const; - - friend BitString shorttoBitString(unsigned short); - friend BitString longtoBitString(unsigned long); - - friend ostream& operator << (ostream& s, const BitString&); - -// misc - - void error(const char* msg) const; - -// indirect friends - - friend BitPattern atoBitPattern(const char* s, - char f='0',char t='1',char x='X'); - friend const char* BitPatterntoa(const BitPattern& p, - char f='0',char t='1',char x='X'); - int OK() const; -}; - - -class BitPattern -{ -public: - BitString pattern; - BitString mask; - - BitPattern(); - BitPattern(const BitPattern&); - BitPattern(const BitString& p, const BitString& m); - - ~BitPattern(); - - friend const char* BitPatterntoa(const BitPattern& p, - char f/*='0'*/,char t/*='1'*/,char x/*='X'*/); - void printon(ostream&, char f='0',char t='1',char x='X') const; - friend BitPattern atoBitPattern(const char* s, char f,char t, char x); - friend ostream& operator << (ostream& s, const BitPattern&); - - int search(const _BS_word*, int, int) const; - int match(const _BS_word* xs, int, int, int) const; - - int OK() const; -}; - -BitString operator & (const BitString& x, const BitString& y); -BitString operator | (const BitString& x, const BitString& y); -BitString operator ^ (const BitString& x, const BitString& y); -BitString operator << (const BitString& x, int y); -BitString operator >> (const BitString& x, int y); -BitString operator - (const BitString& x, const BitString& y); -BitString operator + (const BitString& x, const BitString& y); -BitString operator + (const BitString& x, unsigned int y); -BitString operator ~ (const BitString& x); -int operator != (const BitString& x, const BitString& y); -int operator>(const BitString& x, const BitString& y); -int operator>=(const BitString& x, const BitString& y); - -extern BitStrRep _nilBitStrRep; -extern BitString _nil_BitString; - -// primitive bit extraction - -// These must be inlined regardless of optimization. - -inline int BitStr_index(int l) { return (unsigned)(l) / BITSTRBITS; } - -inline int BitStr_pos(int l) { return l & (BITSTRBITS - 1); } - - -// constructors & assignment - -inline BitString::BitString() :rep(&_nilBitStrRep) {} - -inline BitString::BitString(const BitString& x) :rep(BStr_copy(0, x.rep)) {} - -inline BitString::BitString(const BitSubString& y) - :rep (BStr_alloc(0, y.S.rep->s, y.pos, y.pos+y.len, y.len)) {} - -inline BitString::~BitString() -{ - if (rep != &_nilBitStrRep) delete rep; -} - -inline BitString shorttoBitString(unsigned short w) -{ - BitString r; - _BS_word ww = w; -#if _BS_BIGENDIAN - abort(); -#endif - r.rep = BStr_alloc(0, &ww, 0, 8 * sizeof(short), 8 * sizeof(short)); - return r; -} - -inline BitString longtoBitString(unsigned long w) -{ - BitString r; -#if 1 - _BS_word u = w; - r.rep = BStr_alloc(0, &u, 0, BITSTRBITS, BITSTRBITS); -#else - unsigned short u[2]; - u[0] = w & ((unsigned short)(~(0))); - u[1] = w >> BITSTRBITS; - r.rep = BStr_alloc(0, &u[0], 0, 2*BITSTRBITS, 2*BITSTRBITS); -#endif - return r; -} - -inline BitString& BitString::operator = (const BitString& y) -{ - rep = BStr_copy(rep, y.rep); - return *this; -} - -inline BitString& BitString::operator = (unsigned int b) -{ - _BS_word bit = b; - rep = BStr_alloc(rep, &bit, 0, 1, 1); - return *this; -} - -inline BitString& BitString::operator=(const BitSubString& y) -{ - rep = BStr_alloc(rep, y.S.rep->s, y.pos, y.pos+y.len, y.len); - return *this; -} - -inline BitSubString::BitSubString(const BitSubString& x) - :S(x.S), pos(x.pos), len(x.len) {} - -inline BitSubString::BitSubString(BitString& x, int p, int l) - : S(x), pos(p), len(l) {} - -inline BitSubString::~BitSubString() {} - -inline BitPattern::BitPattern(const BitString& p, const BitString& m) - :pattern(p), mask(m) {} - -inline BitPattern::BitPattern(const BitPattern& b) - :pattern(b.pattern), mask(b.mask) {} - -inline BitPattern::BitPattern() {} -inline BitPattern::~BitPattern() {} - - -// procedural versions of operators - -inline void and(const BitString& x, const BitString& y, BitString& r) -{ - r.rep = and(x.rep, y.rep, r.rep); -} - -inline void or(const BitString& x, const BitString& y, BitString& r) -{ - r.rep = or(x.rep, y.rep, r.rep); -} - -inline void xor(const BitString& x, const BitString& y, BitString& r) -{ - r.rep = xor(x.rep, y.rep, r.rep); -} - -inline void diff(const BitString& x, const BitString& y, BitString& r) -{ - r.rep = diff(x.rep, y.rep, r.rep); -} - -inline void cat(const BitString& x, const BitString& y, BitString& r) -{ - r.rep = cat(x.rep, y.rep, r.rep); -} - -inline void cat(const BitString& x, unsigned int y, BitString& r) -{ - r.rep = cat(x.rep, y, r.rep); -} - -inline void rshift(const BitString& x, int y, BitString& r) -{ - r.rep = lshift(x.rep, -y, r.rep); -} - -inline void lshift(const BitString& x, int y, BitString& r) -{ - r.rep = lshift(x.rep, y, r.rep); -} - -inline void complement(const BitString& x, BitString& r) -{ - r.rep = cmpl(x.rep, r.rep); -} - -// operators - - -inline BitString& BitString::operator &= (const BitString& y) -{ - and(*this, y, *this); - return *this; -} - - -inline BitString& BitString::operator |= (const BitString& y) -{ - or(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator ^= (const BitString& y) -{ - xor(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator <<= (int y) -{ - lshift(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator >>= (int y) -{ - rshift(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator -= (const BitString& y) -{ - diff(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator += (const BitString& y) -{ - cat(*this, y, *this); - return *this; -} - -inline BitString& BitString::operator += (unsigned int y) -{ - cat(*this, y, *this); - return *this; -} - -inline void BitString::complement() -{ - ::complement(*this, *this); -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -inline BitString operator & (const BitString& x, const BitString& y) return r -{ - and(x, y, r); -} - -inline BitString operator | (const BitString& x, const BitString& y) return r -{ - or(x, y, r); -} - -inline BitString operator ^ (const BitString& x, const BitString& y) return r -{ - xor(x, y, r); -} - -inline BitString operator << (const BitString& x, int y) return r -{ - lshift(x, y, r); -} - -inline BitString operator >> (const BitString& x, int y) return r -{ - rshift(x, y, r); -} - -inline BitString operator - (const BitString& x, const BitString& y) return r -{ - diff(x, y, r); -} - -inline BitString operator + (const BitString& x, const BitString& y) return r -{ - cat(x, y, r); -} - -inline BitString operator + (const BitString& x, unsigned int y) return r -{ - cat(x, y, r); -} - -inline BitString operator ~ (const BitString& x) return r -{ - complement(x, r); -} - -#else /* NO_NRV */ - -inline BitString operator & (const BitString& x, const BitString& y) -{ - BitString r; and(x, y, r); return r; -} - -inline BitString operator | (const BitString& x, const BitString& y) -{ - BitString r; or(x, y, r); return r; -} - -inline BitString operator ^ (const BitString& x, const BitString& y) -{ - BitString r; xor(x, y, r); return r; -} - -inline BitString operator << (const BitString& x, int y) -{ - BitString r; lshift(x, y, r); return r; -} - -inline BitString operator >> (const BitString& x, int y) -{ - BitString r; rshift(x, y, r); return r; -} - -inline BitString operator - (const BitString& x, const BitString& y) -{ - BitString r; diff(x, y, r); return r; -} - -inline BitString operator + (const BitString& x, const BitString& y) -{ - BitString r; cat(x, y, r); return r; -} - -inline BitString operator + (const BitString& x, unsigned int y) -{ - BitString r; cat(x, y, r); return r; -} - -inline BitString operator ~ (const BitString& x) -{ - BitString r; complement(x, r); return r; -} - -#endif - -// status, matching - -inline int BitString::length() const -{ - return rep->len; -} - -inline int BitString::empty() const -{ - return rep->len == 0; -} - -inline int BitString::index(const BitString& y, int startpos) const -{ - return search(startpos, rep->len, y.rep->s, 0, y.rep->len); -} - -inline int BitString::index(const BitSubString& y, int startpos) const -{ - return search(startpos, rep->len, y.S.rep->s, y.pos, y.pos+y.len); -} - -inline int BitString::contains(const BitString& y) const -{ - return search(0, rep->len, y.rep->s, 0, y.rep->len) >= 0; -} - -inline int BitString::contains(const BitSubString& y) const -{ - return search(0, rep->len, y.S.rep->s, y.pos, y.pos+y.len) >= 0; -} - -inline int BitString::contains(const BitString& y, int p) const -{ - return match(p, rep->len, 0, y.rep->s, 0, y.rep->len); -} - -inline int BitString::matches(const BitString& y, int p) const -{ - return match(p, rep->len, 1, y.rep->s, 0, y.rep->len); -} - -inline int BitString::contains(const BitSubString& y, int p) const -{ - return match(p, rep->len, 0, y.S.rep->s, y.pos, y.pos+y.len); -} - -inline int BitString::matches(const BitSubString& y, int p) const -{ - return match(p, rep->len, 1, y.S.rep->s, y.pos, y.pos+y.len); -} - -inline int BitString::contains(const BitPattern& r) const -{ - return r.search(rep->s, 0, rep->len) >= 0; -} - -inline int BitString::contains(const BitPattern& r, int p) const -{ - return r.match(rep->s, p, rep->len, 0); -} - -inline int BitString::matches(const BitPattern& r, int p) const -{ - return r.match(rep->s, p, rep->len, 1); -} - -inline int BitString::index(const BitPattern& r, int startpos) const -{ - return r.search(rep->s, startpos, rep->len); -} - -inline int BitSubString::length() const -{ - return len; -} - -inline int BitSubString::empty() const -{ - return len == 0; -} - -inline int operator != (const BitString& x, const BitString& y) -{ - return !(x == y); -} - -inline int operator>(const BitString& x, const BitString& y) -{ - return y < x; -} - -inline int operator>=(const BitString& x, const BitString& y) -{ - return y <= x; -} - -inline int BitString::first(unsigned int b) const -{ - return next(-1, b); -} - -inline int BitString::last(unsigned int b) const -{ - return prev(rep->len, b); -} - -inline int BitString::index(unsigned int bit, int startpos) const -{ - if (startpos >= 0) - return next(startpos - 1, bit); - else - return prev(rep->len + startpos + 1, bit); -} - -inline void BitString::right_trim(unsigned int b) -{ - int nb = (b == 0)? 1 : 0; - rep = BStr_resize(rep, prev(rep->len, nb) + 1); -} - -inline void BitString::left_trim(unsigned int b) -{ - int nb = (b == 0)? 1 : 0; - int p = next(-1, nb); - rep = BStr_alloc(rep, rep->s, p, rep->len, rep->len - p); -} - -inline int BitString::test(int i) const -{ - return ((unsigned)(i) >= rep->len)? 0 : - ((rep->s[BitStr_index(i)] & (1 << (BitStr_pos(i)))) != 0); -} - - -// subscripting - -inline BitStrBit::BitStrBit(const BitStrBit& b) :src(b.src), pos(b.pos) {} - -inline BitStrBit::BitStrBit(BitString& v, int p) :src(v), pos(p) {} - -inline BitStrBit::~BitStrBit() {} - -inline BitStrBit::operator unsigned int() const -{ - return src.test(pos); -} - -inline int BitStrBit::operator = (unsigned int b) -{ - src.assign(pos, b); return b; -} - -inline BitStrBit BitString::operator [] (int i) -{ - if ((unsigned)(i) >= rep->len) error("illegal bit index"); - return BitStrBit(*this, i); -} - -inline BitSubString BitString::_substr(int first, int l) -{ - if (first < 0 || l <= 0 || (unsigned)(first + l) > rep->len) - return BitSubString(_nil_BitString, 0, 0) ; - else - return BitSubString(*this, first, l); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Complex.h b/gnu/lib/libg++/libg++/src/Complex.h deleted file mode 100644 index 242f06e1664..00000000000 --- a/gnu/lib/libg++/libg++/src/Complex.h +++ /dev/null @@ -1,10 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -#ifndef _Complex_h -#define _Complex_h - -// Use the ANSI complex number template. -#include <complex> -typedef complex<double> Complex; - -#endif diff --git a/gnu/lib/libg++/libg++/src/CursesW.cc b/gnu/lib/libg++/libg++/src/CursesW.cc deleted file mode 100644 index c80f33d47da..00000000000 --- a/gnu/lib/libg++/libg++/src/CursesW.cc +++ /dev/null @@ -1,257 +0,0 @@ -/* -Copyright (C) 1989, 1992 Free Software Foundation - written by Eric Newton (newton@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <stdio.h> -#include <stdarg.h> -#include <builtin.h> -#ifndef _OLD_STREAMS -#include <strstream.h> -#endif -// Include CurseW.h and/or curses.h *after* iostream includes, -// because curses.h defines a clear macro that conflicts with iostream. Sigh. -#include <CursesW.h> - -#if _G_HAVE_CURSES - -#ifndef OK -#define OK (1) -#endif - -int CursesWindow::count = 0; - -/* - * C++ interface to curses library. - * - */ - -#if !defined(_IO_MAGIC) && !defined(HAVE_VSCANF) &&!defined vsscanf -extern "C" int _doscan(FILE *, const char*, va_list args); - -static int vsscanf(char *buf, const char * fmt, va_list args) -{ - FILE b; -#ifdef _IOSTRG - b._flag = _IOREAD|_IOSTRG; -#else - b._flag = _IOREAD; -#endif - b._base = (unsigned char*)buf; - b._ptr = (unsigned char*)buf; - b._cnt = BUFSIZ; - return _doscan(&b, fmt, args); -} -#endif - -/* - * varargs functions are handled conservatively: - * They interface directly into the underlying - * _doscan, _doprnt and/or vfprintf routines rather than - * assume that such things are handled compatibly in the curses library - */ - -int CursesWindow::scanw(const char * fmt, ...) -{ - va_list args; - va_start(args, fmt); -#ifdef VMS - int result = wscanw(w , fmt , args); -#else /* NOT VMS */ - char buf[BUFSIZ]; - int result = wgetstr(w, buf); - if (result == OK) { - -#ifdef _IO_MAGIC /* GNU iostreams */ - strstreambuf ss(buf, BUFSIZ); - result = ss.vscan(fmt, args); -#else - result = vsscanf(buf, fmt, args); -#endif - } -#endif /* !VMS */ - va_end(args); - return result; -} - -int CursesWindow::mvscanw(int y, int x, const char * fmt, ...) -{ - va_list args; - va_start(args, fmt); - char buf[BUFSIZ]; - int result = wmove(w, y, x); - if (result == OK) -#ifdef VMS - result=wscanw(w , fmt , args); -#else /* !VMS */ - { - result = wgetstr(w, buf); - if (result == OK) { -#ifdef _IO_MAGIC /* GNU iostreams */ - strstreambuf ss(buf, BUFSIZ); - result = ss.vscan(fmt, args); -#else - result = vsscanf(buf, fmt, args); -#endif - } - } -#endif /* !VMS */ - va_end(args); - return result; -} - -int CursesWindow::printw(const char * fmt, ...) -{ - va_list args; - va_start(args, fmt); - char buf[BUFSIZ]; - vsprintf(buf, fmt, args); - va_end(args); - return waddstr(w, buf); -} - - -int CursesWindow::mvprintw(int y, int x, const char * fmt, ...) -{ - va_list args; - va_start(args, fmt); - int result = wmove(w, y, x); - if (result == OK) - { - char buf[BUFSIZ]; - vsprintf(buf, fmt, args); - result = waddstr(w, buf); - } - va_end(args); - return result; -} - -CursesWindow::CursesWindow(int lines, int cols, int begin_y, int begin_x) -{ - if (count==0) - initscr(); - - w = newwin(lines, cols, begin_y, begin_x); - if (w == 0) - { - (*lib_error_handler)("CursesWindow", "Cannot construct window"); - } - - alloced = 1; - subwins = par = sib = 0; - count++; -} - -CursesWindow::CursesWindow(WINDOW* &window) -{ - if (count==0) - initscr(); - - w = window; - alloced = 0; - subwins = par = sib = 0; - count++; -} - -CursesWindow::CursesWindow(CursesWindow& win, int l, int c, - int by, int bx, char absrel) -{ - - if (absrel == 'r') // relative origin - { - by += win.begy(); - bx += win.begx(); - } - - // Even though we treat subwindows as a tree, the standard curses - // library needs the `subwin' call to link to the root in - // order to correctly perform refreshes, etc. - - CursesWindow* root = &win; - while (root->par != 0) root = root->par; - - w = subwin(root->w, l, c, by, bx); - if (w == 0) - { - (*lib_error_handler)("CursesWindow", "Cannot construct subwindow"); - } - - par = &win; - sib = win.subwins; - win.subwins = this; - subwins = 0; - alloced = 1; - count++; -} - - -void CursesWindow::kill_subwindows() -{ - for (CursesWindow* p = subwins; p != 0; p = p->sib) - { - p->kill_subwindows(); - if (p->alloced) - { - if (p->w != 0) - ::delwin(p->w); - p->alloced = 0; - } - p->w = 0; // cause a run-time error if anyone attempts to use... - } -} - -CursesWindow::~CursesWindow() -{ - kill_subwindows(); - - if (par != 0) // Snip us from the parent's list of subwindows. - { - CursesWindow * win = par->subwins; - CursesWindow * trail = 0; - for (;;) - { - if (win == 0) - break; - else if (win == this) - { - if (trail != 0) - trail->sib = win->sib; - else - par->subwins = win->sib; - break; - } - else - { - trail = win; - win = win->sib; - } - } - } - - if (alloced && w != 0) - delwin(w); - - --count; - if (count == 0) - endwin(); - else if (count < 0) // cannot happen! - { - (*lib_error_handler)("CursesWindow", "Too many windows destroyed"); - } -} - -#endif /* _G_HAVE_CURSES */ diff --git a/gnu/lib/libg++/libg++/src/CursesW.h b/gnu/lib/libg++/libg++/src/CursesW.h deleted file mode 100644 index 5bff08df258..00000000000 --- a/gnu/lib/libg++/libg++/src/CursesW.h +++ /dev/null @@ -1,603 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -/* -Copyright (C) 1989 Free Software Foundation - written by Eric Newton (newton@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _CursesWindow_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _CursesWindow_h - -#include <_G_config.h> - -#if defined(__bsdi__) || defined(__NetBSD__) || defined(__FreeBSD__) -#define _begx begx -#define _begy begy -#define _maxx maxx -#define _maxy maxy -#endif - -#if _G_HAVE_CURSES -// Even many system which mostly have C++-ready header files, -// do not have C++-ready curses.h. -extern "C" { -#include <curses.h> -} - -/* SCO 3.2v4 curses.h includes term.h, which defines lines as a macro. - Undefine it here, because CursesWindow uses lines as a method. */ -#undef lines - -// "Convert" macros to inlines, if needed. -#ifdef addch -inline int (addch)(char ch) { return addch(ch); } -#undef addch -#endif -#ifdef addstr -/* The (char*) cast is to hack around missing const's */ -inline int (addstr)(const char * str) { return addstr((char*)str); } -#undef addstr -#endif -#ifdef clear -inline int (clear)() { return clear(); } -#undef clear -#endif -#ifdef clearok -inline int (clearok)(WINDOW* win, int bf) { return clearok(win, bf); } -#undef clearok -#else -extern "C" int clearok(WINDOW*, int); -#endif -#ifdef clrtobot -inline int (clrtobot)() { return clrtobot(); } -#undef clrtobot -#endif -#ifdef clrtoeol -inline int (clrtoeol)() { return clrtoeol(); } -#undef clrtoeol -#endif -#ifdef delch -inline int (delch)() { return delch(); } -#undef delch -#endif -#ifdef deleteln -inline int (deleteln)() { return deleteln(); } -#undef deleteln -#endif -#ifdef erase -inline int (erase)() { return erase(); } -#undef erase -#endif -#ifdef flushok -inline int (flushok)(WINDOW* _win, int _bf) { return flushok(_win, _bf); } -#undef flushok -#else -#define _no_flushok -#endif -#ifdef getch -inline int (getch)() { return getch(); } -#undef getch -#endif -#ifdef getstr -inline int (getstr)(char *_str) { return getstr(_str); } -#undef getstr -#endif -#ifdef getyx -inline void (getyx)(WINDOW* win, int& y, int& x) { getyx(win, y, x); } -#undef getyx -#endif -#ifdef inch -inline int (inch)() { return inch(); } -#undef inch -#endif -#ifdef insch -inline int (insch)(char c) { return insch(c); } -#undef insch -#endif -#ifdef insertln -inline int (insertln)() { return insertln(); } -#undef insertln -#endif -#ifdef leaveok -inline int (leaveok)(WINDOW* win, int bf) { return leaveok(win, bf); } -#undef leaveok -#else -extern "C" int leaveok(WINDOW* win, int bf); -#endif -#ifdef move -inline int (move)(int x, int y) { return move(x, y); } -#undef move -#endif -#ifdef refresh -inline int (rfresh)() { return refresh(); } -#undef refresh -#endif -#ifdef scrollok -inline int (scrollok)(WINDOW* win, int bf) { return scrollok(win, bf); } -#undef scrollok -#else -#ifndef hpux -extern "C" int scrollok(WINDOW*, int); -#else -extern "C" int scrollok(WINDOW*, char); -#endif -#endif -#ifdef standend -inline int (standend)() { return standend(); } -#undef standend -#endif -#ifdef standout -inline int (standout)() { return standout(); } -#undef standout -#endif -#ifdef wstandend -inline int (wstandend)(WINDOW *win) { return wstandend(win); } -#undef wstandend -#endif -#ifdef wstandout -inline int (wstandout)(WINDOW *win) { return wstandout(win); } -#undef wstandout -#endif -#ifdef winch -inline int (winch)(WINDOW* win) { return winch(win); } -#undef winch -#endif - -/* deal with conflicting macros in ncurses.h which is SYSV based*/ -#ifdef box -inline int _G_box(WINDOW* win, chtype v, chtype h) {return box(win, v, h); } -#undef box -inline int box(WINDOW* win, chtype v, chtype h) {return _G_box(win, v, h); } -#endif -#ifdef scroll -inline int (scroll)(WINDOW* win) { return scroll(win); } -#undef scroll -#endif -#ifdef touchwin -inline int (touchwin)(WINDOW* win) { return touchwin(win); } -#undef touchwin -#endif - -#ifdef mvwaddch -inline int (mvwaddch)(WINDOW *win, int y, int x, char ch) -{ return mvwaddch(win, y, x, ch); } -#undef mvwaddch -#endif -#ifdef mvwaddstr -inline int (mvwaddstr)(WINDOW *win, int y, int x, const char * str) -{ return mvwaddstr(win, y, x, (char*)str); } -#undef mvwaddstr -#endif -#ifdef mvwdelch -inline int (mvwdelch)(WINDOW *win, int y, int x) { return mvwdelch(win, y, x);} -#undef mvwdelch -#endif -#ifdef mvwgetch -inline int (mvwgetch)(WINDOW *win, int y, int x) { return mvwgetch(win, y, x);} -#undef mvwgetch -#endif -#ifdef mvwgetstr -inline int (mvwgetstr)(WINDOW *win, int y, int x, char *str) -{return mvwgetstr(win,y,x, str);} -#undef mvwgetstr -#endif -#ifdef mvwinch -inline int (mvwinch)(WINDOW *win, int y, int x) { return mvwinch(win, y, x);} -#undef mvwinch -#endif -#ifdef mvwinsch -inline int (mvwinsch)(WINDOW *win, int y, int x, char c) -{ return mvwinsch(win, y, x, c); } -#undef mvwinsch -#endif - -#ifdef mvaddch -inline int (mvaddch)(int y, int x, char ch) -{ return mvaddch(y, x, ch); } -#undef mvaddch -#endif -#ifdef mvaddstr -inline int (mvaddstr)(int y, int x, const char * str) -{ return mvaddstr(y, x, (char*)str); } -#undef mvaddstr -#endif -#ifdef mvdelch -inline int (mvdelch)(int y, int x) { return mvdelch(y, x);} -#undef mvdelch -#endif -#ifdef mvgetch -inline int (mvgetch)(int y, int x) { return mvgetch(y, x);} -#undef mvgetch -#endif -#ifdef mvgetstr -inline int (mvgetstr)(int y, int x, char *str) {return mvgetstr(y, x, str);} -#undef mvgetstr -#endif -#ifdef mvinch -inline int (mvinch)(int y, int x) { return mvinch(y, x);} -#undef mvinch -#endif -#ifdef mvinsch -inline int (mvinsch)(int y, int x, char c) -{ return mvinsch(y, x, c); } -#undef mvinsch -#endif - -/* - * - * C++ class for windows. - * - * - */ - -class CursesWindow -{ -protected: - static int count; // count of all active windows: - // We rely on the c++ promise that - // all otherwise uninitialized - // static class vars are set to 0 - - WINDOW * w; // the curses WINDOW - - int alloced; // true if we own the WINDOW - - CursesWindow* par; // parent, if subwindow - CursesWindow* subwins; // head of subwindows list - CursesWindow* sib; // next subwindow of parent - - void kill_subwindows(); // disable all subwindows - -public: - CursesWindow(WINDOW* &window); // useful only for stdscr - - CursesWindow(int lines, // number of lines - int cols, // number of columns - int begin_y, // line origin - int begin_x); // col origin - - CursesWindow(CursesWindow& par, // parent window - int lines, // number of lines - int cols, // number of columns - int by, // absolute or relative - int bx, // origins: - char absrel = 'a'); // if `a', by & bx are - // absolute screen pos, - // else if `r', they are - // relative to par origin - ~CursesWindow(); - -// terminal status - int lines(); // number of lines on terminal, *not* window - int cols(); // number of cols on terminal, *not* window - -// window status - int height(); // number of lines in this window - int width(); // number of cols in this window - int begx(); // smallest x coord in window - int begy(); // smallest y coord in window - int maxx(); // largest x coord in window - int maxy(); // largest x coord in window - -// window positioning - int move(int y, int x); - -// coordinate positioning - void getyx(int& y, int& x); - int mvcur(int sy, int ey, int sx, int ex); - -// input - int getch(); - int getstr(char * str); - int scanw(const char *, ...); - -// input + positioning - int mvgetch(int y, int x); - int mvgetstr(int y, int x, char * str); - int mvscanw(int, int, const char*, ...); - -// output - int addch(const char ch); - int addstr(const char * str); - int printw(const char * fmt, ...); - int inch(); - int insch(char c); - int insertln(); - -// output + positioning - int mvaddch(int y, int x, char ch); - int mvaddstr(int y, int x, const char * str); - int mvprintw(int y, int x, const char * fmt, ...); - int mvinch(int y, int x); - int mvinsch(int y, int x, char ch); - -// borders - int box(char vert, char hor); - -// erasure - int erase(); - int clear(); - int clearok(int bf); - int clrtobot(); - int clrtoeol(); - int delch(); - int mvdelch(int y, int x); - int deleteln(); - -// screen control - int scroll(); - int scrollok(int bf); - int touchwin(); - int refresh(); - int leaveok(int bf); -#ifndef _no_flushok - int flushok(int bf); -#endif - int standout(); - int standend(); - -// multiple window control - int overlay(CursesWindow &win); - int overwrite(CursesWindow &win); - - -// traversal support - CursesWindow* child(); - CursesWindow* sibling(); - CursesWindow* parent(); -}; - - -inline int CursesWindow::begx() -{ - return w->_begx; -} - -inline int CursesWindow::begy() -{ - return w->_begy; -} - -inline int CursesWindow::maxx() -{ - return w->_maxx; -} - -inline int CursesWindow::maxy() -{ - return w->_maxy; -} - -inline int CursesWindow::height() -{ - return maxy() - begy() + 1; -} - -inline int CursesWindow::width() -{ - return maxx() - begx() + 1; -} - -inline int CursesWindow::box(char vert, char hor) -{ - return ::box(w, vert, hor); -} - -inline int CursesWindow::overlay(CursesWindow &win) -{ - return ::overlay(w, win.w); -} - -inline int CursesWindow::overwrite(CursesWindow &win) -{ - return ::overwrite(w, win.w); -} - -inline int CursesWindow::scroll() -{ - return ::scroll(w); -} - - -inline int CursesWindow::touchwin() -{ - return ::touchwin(w); -} - -inline int CursesWindow::addch(const char ch) -{ - return ::waddch(w, ch); -} - -inline int CursesWindow::addstr(const char * str) -{ - // The (char*) cast is to hack around prototypes in curses.h that - // have const missing in the parameter lists. [E.g. SVR4] - return ::waddstr(w, (char*)str); -} - -inline int CursesWindow::clear() -{ - return ::wclear(w); -} - -inline int CursesWindow::clrtobot() -{ - return ::wclrtobot(w); -} - -inline int CursesWindow::clrtoeol() -{ - return ::wclrtoeol(w); -} - -inline int CursesWindow::delch() -{ - return ::wdelch(w); -} - -inline int CursesWindow::deleteln() -{ - return ::wdeleteln(w); -} - -inline int CursesWindow::erase() -{ - return ::werase(w); -} - -inline int CursesWindow::getch() -{ - return ::wgetch(w); -} - -inline int CursesWindow::getstr(char * str) -{ - return ::wgetstr(w, str); -} - -inline int CursesWindow::inch() -{ - return winch(w); -} - -inline int CursesWindow::insch(char c) -{ - return ::winsch(w, c); -} - -inline int CursesWindow::insertln() -{ - return ::winsertln(w); -} - -inline int CursesWindow::move(int y, int x) -{ - return ::wmove(w, y, x); -} - - -inline int CursesWindow::mvcur(int sy, int ey, int sx, int ex) -{ - return ::mvcur(sy, ey, sx,ex); -} - -inline int CursesWindow::mvaddch(int y, int x, char ch) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::waddch(w, ch); -} - -inline int CursesWindow::mvgetch(int y, int x) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::wgetch(w); -} - -inline int CursesWindow::mvaddstr(int y, int x, const char * str) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::waddstr(w, (char*)str); -} - -inline int CursesWindow::mvgetstr(int y, int x, char * str) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::wgetstr(w, str); -} - -inline int CursesWindow::mvinch(int y, int x) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::winch(w); -} - -inline int CursesWindow::mvdelch(int y, int x) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::wdelch(w); -} - -inline int CursesWindow::mvinsch(int y, int x, char ch) -{ - return (::wmove(w, y, x)==ERR) ? ERR : ::winsch(w, ch); -} - -inline int CursesWindow::refresh() -{ - return ::wrefresh(w); -} - -inline int CursesWindow::clearok(int bf) -{ - return ::clearok(w,bf); -} - -inline int CursesWindow::leaveok(int bf) -{ - return ::leaveok(w,bf); -} - -inline int CursesWindow::scrollok(int bf) -{ - return ::scrollok(w,bf); -} - -#ifndef _no_flushok -inline int CursesWindow::flushok(int bf) -{ - return ::flushok(w, bf); -} -#endif - -inline void CursesWindow::getyx(int& y, int& x) -{ - ::getyx(w, y, x); -} - -inline int CursesWindow::standout() -{ - return ::wstandout(w); -} - -inline int CursesWindow::standend() -{ - return ::wstandend(w); -} - -inline int CursesWindow::lines() -{ - return LINES; -} - -inline int CursesWindow::cols() -{ - return COLS; -} - -inline CursesWindow* CursesWindow::child() -{ - return subwins; -} - -inline CursesWindow* CursesWindow::parent() -{ - return par; -} - -inline CursesWindow* CursesWindow::sibling() -{ - return sib; -} - -#endif /* _G_HAVE_CURSES */ -#endif diff --git a/gnu/lib/libg++/libg++/src/DLList.cc b/gnu/lib/libg++/libg++/src/DLList.cc deleted file mode 100644 index 6e15408d35b..00000000000 --- a/gnu/lib/libg++/libg++/src/DLList.cc +++ /dev/null @@ -1,327 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _G_NO_TEMPLATES -#ifdef __GNUG__ -//#pragma implementation -#endif -#include <limits.h> -#include <stream.h> -#include <builtin.h> -#include "DLList.h" - -void BaseDLList::error(const char* msg) const -{ - (*lib_error_handler)("DLList", msg); -} - -int BaseDLList::length() const -{ - int l = 0; - BaseDLNode* t = h; - if (t != 0) do { ++l; t = t->fd; } while (t != h); - return l; -} - -// Note: This is an internal method. It does *not* free old contents! - -void BaseDLList::copy(const BaseDLList& a) -{ - if (a.h == 0) - h = 0; - else - { - BaseDLNode* p = a.h; - BaseDLNode* t = copy_node(p->item()); - h = t; - p = p->fd; - while (p != a.h) - { - BaseDLNode* n = copy_node(p->item()); - t->fd = n; - n->bk = t; - t = n; - p = p->fd; - } - t->fd = h; - h->bk = t; - return; - } -} - -void BaseDLList::clear() -{ - if (h == 0) - return; - - BaseDLNode* p = h->fd; - h->fd = 0; - h = 0; - - while (p != 0) - { - BaseDLNode* nxt = p->fd; - delete_node(p); - p = nxt; - } -} - -BaseDLList& BaseDLList::operator = (const BaseDLList& a) -{ - if (h != a.h) - { - clear(); - copy(a); - } - return *this; -} - - -Pix BaseDLList::prepend(const void *datum) -{ - BaseDLNode* t = copy_node(datum); - if (h == 0) - t->fd = t->bk = h = t; - else - { - t->fd = h; - t->bk = h->bk; - h->bk->fd = t; - h->bk = t; - h = t; - } - return Pix(t); -} - -Pix BaseDLList::append(const void *datum) -{ - BaseDLNode* t = copy_node(datum); - if (h == 0) - t->fd = t->bk = h = t; - else - { - t->bk = h->bk; - t->bk->fd = t; - t->fd = h; - h->bk = t; - } - return Pix(t); -} - -Pix BaseDLList::ins_after(Pix p, const void *datum) -{ - if (p == 0) return prepend(datum); - BaseDLNode* u = (BaseDLNode*) p; - BaseDLNode* t = copy_node(datum); - t->bk = u; - t->fd = u->fd; - u->fd->bk = t; - u->fd = t; - return Pix(t); -} - -Pix BaseDLList::ins_before(Pix p, const void *datum) -{ - if (p == 0) error("null Pix"); - BaseDLNode* u = (BaseDLNode*) p; - BaseDLNode* t = copy_node(datum); - t->bk = u->bk; - t->fd = u; - u->bk->fd = t; - u->bk = t; - if (u == h) h = t; - return Pix(t); -} - -void BaseDLList::join(BaseDLList& b) -{ - BaseDLNode* t = b.h; - b.h = 0; - if (h == 0) - h = t; - else if (t != 0) - { - BaseDLNode* l = t->bk; - h->bk->fd = t; - t->bk = h->bk; - h->bk = l; - l->fd = h; - } -} - -int BaseDLList::owns(Pix p) const -{ - BaseDLNode* t = h; - if (t != 0 && p != 0) - { - do - { - if (Pix(t) == p) return 1; - t = t->fd; - } while (t != h); - } - return 0; -} - -void BaseDLList::del(Pix& p, int dir) -{ - if (p == 0) error("null Pix"); - BaseDLNode* t = (BaseDLNode*) p; - if (t->fd == t) - { - h = 0; - p = 0; - } - else - { - if (dir < 0) - { - if (t == h) - p = 0; - else - p = Pix(t->bk); - } - else - { - if (t == h->bk) - p = 0; - else - p = Pix(t->fd); - } - t->bk->fd = t->fd; - t->fd->bk = t->bk; - if (t == h) h = t->fd; - } - delete_node(t); -} - -void BaseDLList::del_after(Pix& p) -{ - if (p == 0) - { - del_front(); - return; - } - - BaseDLNode* b = (BaseDLNode*) p; - BaseDLNode* t = b->fd; - - if (b == t) - { - h = 0; - p = 0; - } - else - { - t->bk->fd = t->fd; - t->fd->bk = t->bk; - if (t == h) h = t->fd; - } - delete_node(t); -} - -void BaseDLList::remove_front(void *dst) -{ - if (h == 0) - error("remove_front of empty list"); - else { - BaseDLNode* t = h; - copy_item(dst, t->item()); - if (h->fd == h) - h = 0; - else - { - h->fd->bk = h->bk; - h->bk->fd = h->fd; - h = h->fd; - } - delete_node(t); - } -} - -void BaseDLList::del_front() -{ - if (h == 0) - error("del_front of empty list"); - BaseDLNode* t = h; - if (h->fd == h) - h = 0; - else - { - h->fd->bk = h->bk; - h->bk->fd = h->fd; - h = h->fd; - } - delete_node(t); -} - -void BaseDLList::remove_rear(void *dst) -{ - if (h == 0) - error("remove_rear of empty list"); - else - { - BaseDLNode* t = h->bk; - copy_item(dst, t->item()); - if (h->fd == h) - h = 0; - else - { - t->fd->bk = t->bk; - t->bk->fd = t->fd; - } - delete_node(t); - } -} - -void BaseDLList::del_rear() -{ - if (h == 0) - error("del_rear of empty list"); - BaseDLNode* t = h->bk; - if (h->fd == h) - h = 0; - else - { - t->fd->bk = t->bk; - t->bk->fd = t->fd; - } - delete_node(t); -} - - -int BaseDLList::OK() const -{ - int v = 1; - if (h != 0) - { - BaseDLNode* t = h; - long count = LONG_MAX; // Lots of chances to find h! - do - { - count--; - v &= t->bk->fd == t; - v &= t->fd->bk == t; - t = t->fd; - } while (v && count > 0 && t != h); - v &= count > 0; - } - if (!v) error("invariant failure"); - return v; -} -#endif diff --git a/gnu/lib/libg++/libg++/src/DLList.h b/gnu/lib/libg++/libg++/src/DLList.h deleted file mode 100644 index 3723c5c6506..00000000000 --- a/gnu/lib/libg++/libg++/src/DLList.h +++ /dev/null @@ -1,139 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -#ifndef _DLList_h -#ifdef __GNUG__ -//#pragma interface -#endif -#define _DLList_h 1 - -#undef OK - -#include <Pix.h> - -struct BaseDLNode { - BaseDLNode *bk; - BaseDLNode *fd; - void *item() {return (void*)(this+1);} //Return ((DLNode<T>*)this)->hd -}; - -template<class T> -class DLNode : public BaseDLNode -{ - public: - T hd; - DLNode() { } - DLNode(const T& h, DLNode* p = 0, DLNode* n = 0) - : hd(h) { bk = p; fd = n; } - ~DLNode() { } -}; - -class BaseDLList { - protected: - BaseDLNode *h; - - BaseDLList() { h = 0; } - void copy(const BaseDLList&); - BaseDLList& operator= (const BaseDLList& a); - virtual void delete_node(BaseDLNode*node) = 0; - virtual BaseDLNode* copy_node(const void* datum) = 0; - virtual void copy_item(void *dst, void *src) = 0; - virtual ~BaseDLList() { } - - Pix prepend(const void*); - Pix append(const void*); - Pix ins_after(Pix p, const void *datum); - Pix ins_before(Pix p, const void *datum); - void remove_front(void *dst); - void remove_rear(void *dst); - void join(BaseDLList&); - - public: - int empty() const { return h == 0; } - int length() const; - void clear(); - void error(const char* msg) const; - int owns(Pix p) const; - int OK() const; - void del(Pix& p, int dir = 1); - void del_after(Pix& p); - void del_front(); - void del_rear(); -}; - -template <class T> -class DLList : public BaseDLList { - //friend class <T>DLListTrav; - - virtual void delete_node(BaseDLNode *node) { delete (DLNode<T>*)node; } - virtual BaseDLNode* copy_node(const void *datum) - { return new DLNode<T>(*(const T*)datum); } - virtual void copy_item(void *dst, void *src) { *(T*)dst = *(T*)src; } - - public: - DLList() : BaseDLList() { } - DLList(const DLList<T>& a) : BaseDLList() { copy(a); } - - DLList<T>& operator = (const DLList<T>& a) - { BaseDLList::operator=((const BaseDLList&) a); return *this; } - virtual ~DLList() { clear(); } - - Pix prepend(const T& item) {return BaseDLList::prepend(&item);} - Pix append(const T& item) {return BaseDLList::append(&item);} - - void join(DLList<T>& a) { BaseDLList::join(a); } - - T& front() { - if (h == 0) error("front: empty list"); - return ((DLNode<T>*)h)->hd; } - T& rear() { - if (h == 0) error("rear: empty list"); - return ((DLNode<T>*)h->bk)->hd; - } - const T& front() const { - if (h == 0) error("front: empty list"); - return ((DLNode<T>*)h)->hd; } - const T& rear() const { - if (h == 0) error("rear: empty list"); - return ((DLNode<T>*)h->bk)->hd; - } - T remove_front() { T dst; BaseDLList::remove_front(&dst); return dst; } - T remove_rear() { T dst; BaseDLList::remove_rear(&dst); return dst; } - - T& operator () (Pix p) { - if (p == 0) error("null Pix"); - return ((DLNode<T>*)p)->hd; - } - const T& operator () (Pix p) const { - if (p == 0) error("null Pix"); - return ((DLNode<T>*)p)->hd; - } - Pix first() const { return Pix(h); } - Pix last() const { return (h == 0) ? 0 : Pix(h->bk); } - void next(Pix& p) const - { p = (p == 0 || p == h->bk)? 0 : Pix(((DLNode<T>*)p)->fd); } - void prev(Pix& p) const - { p = (p == 0 || p == h)? 0 : Pix(((DLNode<T>*)p)->bk); } - Pix ins_after(Pix p, const T& item) - {return BaseDLList::ins_after(p, &item); } - Pix ins_before(Pix p, const T& item) - {return BaseDLList::ins_before(p, &item);} -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/DiscUnif.cc b/gnu/lib/libg++/libg++/src/DiscUnif.cc deleted file mode 100644 index 950d9f9409e..00000000000 --- a/gnu/lib/libg++/libg++/src/DiscUnif.cc +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <DiscUnif.h> - -double DiscreteUniform::operator()() -{ - long tmp = long(floor(delta * pGenerator -> asDouble())); - return( double(pLow + tmp) ); -} - diff --git a/gnu/lib/libg++/libg++/src/DiscUnif.h b/gnu/lib/libg++/libg++/src/DiscUnif.h deleted file mode 100644 index 8633db2c804..00000000000 --- a/gnu/lib/libg++/libg++/src/DiscUnif.h +++ /dev/null @@ -1,72 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _DiscreteUniform_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _DiscreteUniform_h 1 - -#include <Random.h> - -// -// The interval [lo..hi) -// - -class DiscreteUniform: public Random { - long pLow; - long pHigh; - double delta; -public: - DiscreteUniform(long low, long high, RNG *gen); - - long low(); - long low(long x); - long high(); - long high(long x); - - virtual double operator()(); -}; - - -inline DiscreteUniform::DiscreteUniform(long low, long high, RNG *gen) -: Random(gen) -{ - pLow = (low < high) ? low : high; - pHigh = (low < high) ? high : low; - delta = (pHigh - pLow) + 1; -} - -inline long DiscreteUniform::low() { return pLow; } - -inline long DiscreteUniform::low(long x) { - long tmp = pLow; - pLow = x; - delta = (pHigh - pLow) + 1; - return tmp; -} - -inline long DiscreteUniform::high() { return pHigh; } - -inline long DiscreteUniform::high(long x) { - long tmp = pHigh; - pHigh = x; - delta = (pHigh - pLow) + 1; - return tmp; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Erlang.cc b/gnu/lib/libg++/libg++/src/Erlang.cc deleted file mode 100644 index 5a73021f10f..00000000000 --- a/gnu/lib/libg++/libg++/src/Erlang.cc +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Erlang.h> - -double Erlang::operator()() -{ - double prod = 1.0; - - for (int i = 0; i < k; i++) { - prod *= pGenerator -> asDouble(); - } - return(-log(prod)/a); -} diff --git a/gnu/lib/libg++/libg++/src/Erlang.h b/gnu/lib/libg++/libg++/src/Erlang.h deleted file mode 100644 index 3f2b3ede71f..00000000000 --- a/gnu/lib/libg++/libg++/src/Erlang.h +++ /dev/null @@ -1,68 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Erlang_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Erlang_h 1 - -#include <Random.h> - -class Erlang: public Random { -protected: - double pMean; - double pVariance; - int k; - double a; - void setState(); -public: - Erlang(double mean, double variance, RNG *gen); - - double mean(); - double mean(double x); - double variance(); - double variance(double x); - - virtual double operator()(); - -}; - - -inline void Erlang::setState() { - k = int( (pMean * pMean ) / pVariance + 0.5 ); - k = (k > 0) ? k : 1; - a = k / pMean; -} - -inline Erlang::Erlang(double mean, double variance, RNG *gen) : Random(gen) -{ - pMean = mean; pVariance = variance; - setState(); -} - -inline double Erlang::mean() { return pMean; } -inline double Erlang::mean(double x) { - double tmp = pMean; pMean = x; setState(); return tmp; -}; - -inline double Erlang::variance() { return pVariance; } -inline double Erlang::variance(double x) { - double tmp = pVariance; pVariance = x; setState(); return tmp; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Fix.cc b/gnu/lib/libg++/libg++/src/Fix.cc deleted file mode 100644 index 9f68f826c6c..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix.cc +++ /dev/null @@ -1,670 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -// -// Fix.cc : variable length fixed point data type class functions -// - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Fix.h> -#include <std.h> -#include <Obstack.h> -#include <AllocRing.h> -#include <strstream.h> -#include <new.h> - -// member constants - -const _G_uint16_t Fix::min_length; -const _G_uint16_t Fix::max_length; -const double Fix::min_value; -const double Fix::max_value; - -// default parameters - -_G_uint16_t Fix::default_length = 16; -int Fix::default_print_width = 8; - -Fix::PEH Fix::overflow_handler = Fix::overflow_saturate; - -Fix::Rep Fix::Rep_0 = { 16, 1, 1, { 0 } }; -Fix::Rep Fix::Rep_m1 = { 16, 1, 1, { 0x8000 } }; -Fix::Rep Fix::Rep_quotient_bump = { 16, 1, 1, { 0x4000 } }; - -// error handling - -void -Fix::default_error_handler(const char* msg) -{ - cerr << "Fix: " << msg << "\n"; - abort(); -} - -void -Fix::default_range_error_handler(const char* msg) -{ - cerr << "Fix: range error in " << msg << "\n"; - //abort(); -} - -one_arg_error_handler_t - Fix::error_handler = Fix::default_error_handler, - Fix::range_error_handler = Fix::default_range_error_handler; - -one_arg_error_handler_t -Fix::set_error_handler(one_arg_error_handler_t f) -{ - one_arg_error_handler_t old = error_handler; - error_handler = f; - return old; -} - -one_arg_error_handler_t -Fix::set_range_error_handler(one_arg_error_handler_t f) -{ - one_arg_error_handler_t old = range_error_handler; - range_error_handler = f; - return old; -} - -void -Fix::error(const char* msg) -{ - error_handler(msg); -} - -void -Fix::range_error(const char* msg) -{ - range_error_handler(msg); -} - -// Fix::Rep allocation and initialization functions - -static inline Fix::Rep* -_new_Fix(_G_uint16_t len) -{ - int siz = (((_G_uint32_t) len + 15) >> 4); - if (siz <= 0) siz = 1; - unsigned int allocsiz = (sizeof(Fix::Rep) + (siz - 1) * sizeof(_G_uint16_t)); - Fix::Rep* z = new (operator new (allocsiz)) Fix::Rep; - memset(z, 0, allocsiz); - z->len = len; - z->siz = siz; - z->ref = 1; - return z; -} - -Fix::Rep* -Fix::new_Fix(_G_uint16_t len) -{ - return _new_Fix(len); -} - -Fix::Rep* -Fix::new_Fix(_G_uint16_t len, const Rep* x) -{ - Rep* z = _new_Fix(len); - return copy(x,z); -} - -Fix::Rep* -Fix::new_Fix(_G_uint16_t len, double d) -{ - Rep* z = _new_Fix(len); - - if ( d == max_value ) - { - z->s[0] = 0x7fff; - for ( int i=1; i < z->siz; i++ ) - z->s[i] = 0xffff; - } - else if ( d < min_value || d > max_value ) - range_error("declaration"); - else - { - if (d < 0) - d += 2.0; - d *= 32768; - for ( int i=0; i < z->siz; i++ ) - { - z->s[i] = (_G_uint16_t )d; - d -= z->s[i]; - d *= 65536; - } - if ( d >= 32768 ) - z->s[z->siz-1]++; - } - mask(z); - return z; -} - -// convert to a double - -double -value(const Fix& x) -{ - double d = 0.0; - for ( int i=x.rep->siz-1; i >= 0; i-- ) - { - d += x.rep->s[i]; - d *= 1./65536.; - } - d *= 2.; - return d < 1. ? d : d - 2.; -} - -// extract mantissa to Integer - -Integer -mantissa(const Fix& x) -{ - Integer a = 1, b=1; - for ( int i=0; i < x.rep->siz; i++ ) - { - a <<= 16; - a += x.rep->s[i]; - b <<= 16; - } - return a-b; -} - -// comparison functions - -inline static int -docmp(const _G_uint16_t* x, const _G_uint16_t* y, int siz) -{ - int diff = (_G_int16_t )*x - (_G_int16_t )*y; - while ( --siz && !diff ) - diff = (_G_int32_t )(_G_uint32_t )*++x - (_G_int32_t )(_G_uint32_t )*++y; - return diff; -} - -inline static int -docmpz(const _G_uint16_t* x, int siz) -{ - while ( siz-- ) - if ( *x++ ) return 1; - return 0; -} - -int -Fix::compare(const Rep* x, const Rep* y) -{ - if ( x->siz == y->siz ) - return docmp(x->s, y->s, x->siz); - else - { - int r; - const Rep* longer, *shorter; - if ( x->siz > y->siz ) - { - longer = x; - shorter = y; - r = 1; - } - else - { - longer = y; - shorter = x; - r = -1; - } - int diff = docmp(x->s, y->s, shorter->siz); - if ( diff ) - return diff; - else if ( docmpz(&longer->s[shorter->siz], longer->siz-shorter->siz) ) - return r; - else - return 0; - } -} - -// arithmetic functions - -Fix::Rep* -Fix::add(const Rep* x, const Rep* y, Rep* r) -{ - _G_uint16_t xsign = x->s[0], ysign = y->s[0]; - const Rep* longer, *shorter; - if ( x->len >= y->len ) - longer = x, shorter = y; - else - longer = y, shorter = x; - if ( r == NULL ) - r = new_Fix(longer->len); - int i; - for ( i=r->siz-1; i >= longer->siz; i-- ) - r->s[i] = 0; - for ( ; i >= shorter->siz; i-- ) - r->s[i] = longer->s[i]; - _G_uint32_t sum = 0, carry = 0; - for ( ; i >= 0; i-- ) - { - sum = carry + (_G_uint32_t )x->s[i] + (_G_uint32_t )y->s[i]; - carry = sum >> 16; - r->s[i] = sum; - } - if ( (xsign ^ sum) & (ysign ^ sum) & 0x8000 ) - overflow_handler(r); - return r; -} - -Fix::Rep* -Fix::subtract(const Rep* x, const Rep* y, Rep* r) -{ - _G_uint16_t xsign = x->s[0], ysign = y->s[0]; - const Rep* longer, *shorter; - if ( x->len >= y->len ) - longer = x, shorter = y; - else - longer = y, shorter = x; - if ( r == NULL ) - r = new_Fix(longer->len); - int i; - for ( i=r->siz-1; i >= longer->siz; i-- ) - r->s[i] = 0; - for ( ; i >= shorter->siz; i-- ) - r->s[i] = (longer == x ? x->s[i] : -y->s[i]); - _G_int16_t carry = 0; - _G_uint32_t sum = 0; - for ( ; i >= 0; i-- ) - { - sum = (_G_int32_t )carry + (_G_uint32_t )x->s[i] - (_G_uint32_t )y->s[i]; - carry = sum >> 16; - r->s[i] = sum; - } - if ( (xsign ^ sum) & (~ysign ^ sum) & 0x8000 ) - overflow_handler(r); - return r; -} - -Fix::Rep* -Fix::multiply(const Rep* x, const Rep* y, Rep* r) -{ - if ( r == NULL ) - r = new_Fix(x->len + y->len); - int xsign = x->s[0] & 0x8000, - ysign = y->s[0] & 0x8000; - Fix X(x->len), Y(y->len); - if ( xsign ) - x = negate(x,X.rep); - if ( ysign ) - y = negate(y,Y.rep); - int i; - for ( i=0; i < r->siz; i++ ) - r->s[i] = 0; - for ( i=x->siz-1; i >= 0; i-- ) - { - _G_uint32_t carry = 0; - for ( int j=y->siz-1; j >= 0; j-- ) - { - int k = i + j + 1; - _G_uint32_t a = (_G_uint32_t )x->s[i] * (_G_uint32_t )y->s[j]; - _G_uint32_t b = ((a << 1) & 0xffff) + carry; - if ( k < r->siz ) - { - b += r->s[k]; - r->s[k] = b; - } - if ( k < (int)r->siz + 1 ) - carry = (a >> 15) + (b >> 16); - } - r->s[i] = carry; - } - if ( xsign != ysign ) - negate(r,r); - return r; -} - -Fix::Rep* -Fix::multiply(const Rep* x, int y, Rep* r) -{ - if ( y != (_G_int16_t )y ) - range_error("multiply by int -- int too large"); - if ( r == NULL ) - r = new_Fix(x->len); - int i; - for ( i=r->siz-1; i >= x->siz; i-- ) - r->s[i] = 0; - _G_int32_t a, carry = 0; - for ( ; i > 0; i-- ) - { - a = (_G_int32_t) (_G_uint32_t )x->s[i] * y + carry; - r->s[i] = a; - carry = a >> 16; // assumes arithmetic right shift - } - a = (_G_int32_t) (_G_int16_t )x->s[0] * y + carry; - r->s[0] = a; - a &= 0xffff8000L; - if ( a != (_G_int32_t)0xffff8000L && a != (_G_int32_t)0L ) { - r->s[0] = 0x8000 ^ x->s[0] ^ y; - overflow_handler(r); - } - return r; -} - -Fix::Rep* -Fix::divide(const Rep* x, const Rep* y, Rep* q, Rep* r) -{ - int xsign = x->s[0] & 0x8000, - ysign = y->s[0] & 0x8000; - if ( q == NULL ) - q = new_Fix(x->len); - copy(&Rep_0,q); - if ( r == NULL ) - r = new_Fix(x->len + y->len - 1); - if ( xsign ) - negate(x,r); - else - copy(x,r); - Fix Y(y->len); - Rep* y2 = ( ysign ? negate(y,Y.rep) : copy(y,Y.rep) ); - if ( !compare(y2) ) - range_error("division -- division by zero"); - else if ( compare(x,y2) >= 0 ) - if ( compare(x,y2) == 0 && (xsign ^ ysign) != 0 ) - { - copy(&Rep_m1,q); - copy(&Rep_0,r); - } - else - range_error("division"); - else - { - Rep* t; - Fix S(r->len), - W(q->len,&Rep_quotient_bump); - for ( int i=1; i < q->len; i++ ) - { - shift(y2,-1,y2); - subtract(r,y2,S.rep); - int s_status = compare(S.rep); - if ( s_status == 0 ) - { - t = r, r = S.rep, S.rep = t; - break; - } - else if ( s_status > 0 ) - { - t = r, r = S.rep, S.rep = t; - add(q,W.rep,q); - } - shift(W.rep,-1,W.rep); - } - if ( xsign ^ ysign ) - negate(q,q); - } - return q; -} - -Fix::Rep* -Fix::shift(const Rep* x, int y, Rep* r) -{ - if ( r == NULL ) - r = new_Fix(x->len); - if ( y == 0 ) - { - copy (x, r); - return r; - } - - int ay = abs((_G_int32_t) y), - ayh = ay >> 4, - ayl = ay & 0x0f; - int xl, u, ilow, ihigh; - _G_uint16_t *rs; - const _G_uint16_t *xsl, *xsr; - - if ( y > 0 ) - { - rs = r->s; - xsl = x->s + ayh; - xsr = xsl + 1; - xl = ayl; - u = 1; - ihigh = x->siz - ayh - 1; - ilow = 0; - } - else - { - rs = &r->s[r->siz - 1]; - xsr = &x->s[r->siz - 1] - ayh; - xsl = xsr - 1; - xl = 16 - ayl; - u = -1; - ihigh = r->siz - ayh - 1; - ilow = ihigh - x->siz; - } - - int xr = 16 - xl; - _G_uint16_t xrmask = 0xffffL >> xr; - int i; - for ( i=0; i < ilow; i++, rs+=u, xsl+=u, xsr+=u ) - *rs = 0; - for ( ; i < ihigh; i++, rs+=u, xsl+=u, xsr+=u ) - *rs = (*xsl << xl) + ((*xsr >> xr) & xrmask); - *rs = (y > 0 ? (*xsl << xl) : ((*xsr >> xr) & xrmask)); - rs += u; - for ( ; ++i < r->siz; rs+=u ) - *rs = 0; - return r; -} - -Fix::Rep* -Fix::negate(const Rep* x, Rep* r) -{ - if ( r == NULL ) - r = new_Fix(x->len); - _G_uint32_t carry = 1; - int i; - for ( i=r->siz-1; i >= x->siz; i-- ) - r->s[i] = 0; - for ( ; i >= 0; i-- ) - { - _G_uint32_t a = (_G_uint16_t )~x->s[i] + carry; // bug work-around - r->s[i] = a; - carry = a >> 16; - } - return r; -} - -// io functions - -Fix -atoF(const char* a, int len) -{ - return Fix(len,atof(a)); -} - -extern AllocRing _libgxx_fmtq; - -void -Fix::printon(ostream& s, int width) const -{ - double val = value(*this); - int old_precision = s.precision(width-3); - _G_int32_t old_flags = s.setf(ios::fixed, ios::fixed|ios::scientific); - if (val >= 0) - s << ' '; - s.width(width-2); - s << val; - s.precision(old_precision); - s.flags(old_flags); -} - -char* -Ftoa(Fix& x, int width) -{ - int wrksiz = width + 2; - char *fmtbase = (char *) _libgxx_fmtq.alloc(wrksiz); - ostrstream stream(fmtbase, wrksiz); - - x.printon(stream, width); - stream << ends; - return fmtbase; -} - -extern Obstack _libgxx_io_ob; - -Fix -Fix::operator %= (int y) -{ - Fix r((int )rep->len + y, *this); return *this = r; -} - -istream& -operator >> (istream& s, Fix& y) -{ - int got_one = 0; - if (!s.ipfx(0)) - { - s.clear(ios::failbit|s.rdstate()); // Redundant if using GNU iostreams. - return s; - } - - char sign = 0, point = 0; - char ch; - s >> ws; - if (!s.good()) - { - s.clear(ios::failbit|s.rdstate()); - return s; - } - while (s.get(ch)) - { - if (ch == '-') - { - if (sign == 0) - { - sign = 1; - _libgxx_io_ob.grow(ch); - } - else - break; - } - if (ch == '.') - { - if (point == 0) - { - point = 1; - _libgxx_io_ob.grow(ch); - } - else - break; - } - else if (ch >= '0' && ch <= '9') - { - got_one = 1; - _libgxx_io_ob.grow(ch); - } - else - break; - } - char * p = (char*)(_libgxx_io_ob.finish(0)); - if (s.good()) - s.putback(ch); - if (!got_one) - s.clear(ios::failbit|s.rdstate()); - else - y = atoF(p); - _libgxx_io_ob.free(p); - return s; -} - -void -show(const Fix& x) -{ - cout << "len = " << x.rep->len << "\n"; - cout << "siz = " << x.rep->siz << "\n"; - cout << "ref = " << x.rep->ref << "\n"; - cout << "man = "; -#ifdef _OLD_STREAMS - cout << Itoa(mantissa(x),16,4*x.rep->siz); -#else - int old_flags = cout.setf(ios::hex, ios::hex|ios::dec|ios::oct); - cout.width(4*x.rep->siz); - cout << mantissa(x); - cout.setf(old_flags, ios::hex|ios::dec|ios::oct); -#endif - cout << "\n"; - cout << "val = " << value(x) << "\n"; -} - -// parameter setting operations - -Fix::PEH Fix::set_overflow_handler(PEH new_handler) -{ - PEH old_handler = overflow_handler; - overflow_handler = new_handler; - return old_handler; -} - -int -Fix::set_default_length(int newlen) -{ - _G_uint16_t oldlen = default_length; - if ( newlen < min_length || newlen > max_length ) - error("illegal length in Fix::set_default_length"); - default_length = newlen; - return oldlen; -} - -// overflow handlers - -void -Fix::overflow_saturate(Rep* r) -{ - if ( (_G_int16_t) r->s[0] > 0 ) - { - r->s[0] = 0x8000; - for ( int i=1; i < r->siz; i++ ) - r->s[i] = 0; - } - else - { - r->s[0] = 0x7fff; - for ( int i = 1; i < (int)r->siz; i++ ) - r->s[i] = 0xffff; - mask(r); - } -} - -void -Fix::overflow_wrap(Rep*) -{} - -void -Fix::overflow_warning_saturate(Rep* r) -{ - overflow_warning(r); - overflow_saturate(r); -} - -void -Fix::overflow_warning(Rep*) -{ - cerr << "Fix: overflow warning\n"; -} - -void -Fix::overflow_error(Rep*) -{ - cerr << "Fix: overflow error\n"; - abort(); -} diff --git a/gnu/lib/libg++/libg++/src/Fix.h b/gnu/lib/libg++/libg++/src/Fix.h deleted file mode 100644 index ae9b9046e7b..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix.h +++ /dev/null @@ -1,523 +0,0 @@ -// -*- C++ -*- -// Fix.h : variable length fixed point data type -// - -#ifndef _Fix_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Fix_h 1 - -#include <stream.h> -#include <std.h> -#include <stddef.h> -#include <Integer.h> -#include <builtin.h> - -class Fix -{ - struct Rep // internal Fix representation - { - _G_uint16_t len; // length in bits - _G_uint16_t siz; // allocated storage - _G_int16_t ref; // reference count - _G_uint16_t s[1]; // start of ushort array represention - }; - -public: - - typedef void (*PEH)(Rep*); - -private: - - Rep* rep; - - Fix(Rep*); - Fix(int, const Rep*); - - void unique(); - - static const _G_uint16_t min_length = 1; - static const _G_uint16_t max_length = 65535; - static const double min_value = -1.0; - static const double max_value = 1.0; - - static _G_uint16_t default_length; - static int default_print_width; - static Rep Rep_0; - static Rep Rep_m1; - static Rep Rep_quotient_bump; - - // internal class functions - static void mask(Rep*); - static int compare(const Rep*, const Rep* = &Rep_0); - - static Rep* new_Fix(_G_uint16_t); - static Rep* new_Fix(_G_uint16_t, const Rep*); - static Rep* new_Fix(_G_uint16_t, double); - - static Rep* copy(const Rep*, Rep*); - static Rep* negate(const Rep*, Rep* = NULL); - static Rep* add(const Rep*, const Rep*, Rep* = NULL); - static Rep* subtract(const Rep*, const Rep*, Rep* = NULL); - static Rep* multiply(const Rep*, const Rep*, Rep* = NULL); - static Rep* multiply(const Rep*, int, Rep* = NULL); - static Rep* divide(const Rep*, const Rep*, Rep* = NULL, - Rep* = NULL); - static Rep* shift(const Rep*, int, Rep* = NULL); - - static one_arg_error_handler_t error_handler; - static one_arg_error_handler_t range_error_handler; - - static PEH overflow_handler; - -public: - Fix(); - Fix(const Fix&); - Fix(double); - Fix(int); - Fix(_G_uint16_t); - Fix(int, const Fix&); - Fix(int, double); - - ~Fix(); - - Fix operator = (const Fix&); - Fix operator = (double); - - friend int operator == (const Fix&, const Fix&); - friend int operator != (const Fix&, const Fix&); - - friend int operator < (const Fix&, const Fix&); - friend int operator <= (const Fix&, const Fix&); - friend int operator > (const Fix&, const Fix&); - friend int operator >= (const Fix&, const Fix&); - - Fix& operator + (); - Fix operator - (); - - friend Fix operator + (const Fix&, const Fix&); - friend Fix operator - (const Fix&, const Fix&); - friend Fix operator * (const Fix&, const Fix&); - friend Fix operator / (const Fix&, const Fix&); - - friend Fix operator * (const Fix&, int); - friend Fix operator * (int, const Fix&); - friend Fix operator % (const Fix&, int); - friend Fix operator << (const Fix&, int); - friend Fix operator >> (const Fix&, int); - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) - friend Fix operator <? (const Fix&, const Fix&); // min - friend Fix operator >? (const Fix&, const Fix&); // max -#endif - - Fix operator += (const Fix&); - Fix operator -= (const Fix&); - Fix operator *= (const Fix&); - Fix operator /= (const Fix&); - - Fix operator *= (int); - Fix operator %= (int); - Fix operator <<=(int); - Fix operator >>=(int); - - friend char* Ftoa(const Fix&, int width = default_print_width); - void printon(ostream&, int width = default_print_width) const; - friend Fix atoF(const char*, int len = default_length); - - friend istream& operator >> (istream&, Fix&); - friend ostream& operator << (ostream&, const Fix&); - - // built-in functions - friend Fix abs(Fix); // absolute value - friend int sgn(const Fix&); // -1, 0, +1 - friend Integer mantissa(const Fix&); // integer representation - friend double value(const Fix&); // double value - friend int length(const Fix&); // field length - friend void show(const Fix&); // show contents - - // error handlers - static void error(const char* msg); // error handler - static void range_error(const char* msg); // range error handler - - static one_arg_error_handler_t set_error_handler(one_arg_error_handler_t f); - static one_arg_error_handler_t - set_range_error_handler(one_arg_error_handler_t f); - - static void default_error_handler (const char *); - static void default_range_error_handler (const char *); - - // non-operator versions for user - friend void negate(const Fix& x, Fix& r); - friend void add(const Fix& x, const Fix& y, Fix& r); - friend void subtract(const Fix& x, const Fix& y, Fix& r); - friend void multiply(const Fix& x, const Fix& y, Fix& r); - friend void divide(const Fix& x, const Fix& y, Fix& q, Fix& r); - friend void shift(const Fix& x, int y, Fix& r); - - // overflow handlers - static void overflow_saturate(Fix::Rep*); - static void overflow_wrap(Fix::Rep*); - static void overflow_warning_saturate(Fix::Rep*); - static void overflow_warning(Fix::Rep*); - static void overflow_error(Fix::Rep*); - - static PEH set_overflow_handler(PEH); - - static int set_default_length(int); -}; - -// function definitions - -inline void -Fix::unique() -{ - if ( rep->ref > 1 ) - { - rep->ref--; - rep = new_Fix(rep->len,rep); - } -} - -inline void -Fix::mask (Fix::Rep* x) -{ - int n = x->len & 0x0f; - if ( n ) - x->s[x->siz - 1] &= 0xffff0000 >> n; -} - -inline Fix::Rep* -Fix::copy(const Fix::Rep* from, Fix::Rep* to) -{ - _G_uint16_t *ts = to->s; - const _G_uint16_t *fs = from->s; - int ilim = to->siz < from->siz ? to->siz : from->siz; - int i; - for ( i=0; i < ilim; i++ ) - *ts++ = *fs++; - for ( ; i < to->siz; i++ ) - *ts++ = 0; - mask(to); - return to; -} - -inline -Fix::Fix(Rep* f) -{ - rep = f; -} - -inline -Fix::Fix() -{ - rep = new_Fix(default_length); -} - -inline -Fix::Fix(int len) -{ - if ( len < min_length || len > max_length ) - error("illegal length in declaration"); - rep = new_Fix((_G_uint16_t) len); -} - -inline -Fix::Fix(_G_uint16_t len) -{ - if ( len < min_length || len > max_length ) - error("illegal length in declaration"); - rep = new_Fix(len); -} - -inline -Fix::Fix(double d) -{ - rep = new_Fix(default_length,d); -} - -inline -Fix::Fix(const Fix& y) -{ - rep = y.rep; rep->ref++; -} - -inline -Fix::Fix(int len, const Fix& y) -{ - if ( len < Fix::min_length || len > Fix::max_length ) - error("illegal length in declaration"); - rep = new_Fix((_G_uint16_t) len,y.rep); -} - -inline -Fix::Fix(int len, const Rep* fr) -{ - if ( len < Fix::min_length || len > Fix::max_length ) - error("illegal length in declaration"); - rep = new_Fix((_G_uint16_t) len,fr); -} - -inline -Fix::Fix(int len, double d) -{ - if ( len < Fix::min_length || len > Fix::max_length ) - error("illegal length in declaration"); - rep = new_Fix((_G_uint16_t) len,d); -} - -inline -Fix::~Fix() -{ - if ( --rep->ref <= 0 ) delete rep; -} - -inline Fix -Fix::operator = (const Fix& y) -{ - if ( rep->len == y.rep->len ) { - ++y.rep->ref; - if ( --rep->ref <= 0 ) delete rep; - rep = y.rep; - } - else { - unique(); - copy(y.rep,rep); - } - return *this; -} - -inline Fix -Fix::operator = (double d) -{ - int oldlen = rep->len; - if ( --rep->ref <= 0 ) delete rep; - rep = new_Fix(oldlen,d); - return *this; -} - -inline int -operator == (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) == 0; -} - -inline int -operator != (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) != 0; -} - -inline int -operator < (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) < 0; -} - -inline int -operator <= (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) <= 0; -} - -inline int -operator > (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) > 0; -} - -inline int -operator >= (const Fix& x, const Fix& y) -{ - return Fix::compare(x.rep, y.rep) >= 0; -} - -inline Fix& -Fix::operator + () -{ - return *this; -} - -inline Fix -Fix::operator - () -{ - Rep* r = negate(rep); return r; -} - -inline Fix -operator + (const Fix& x, const Fix& y) -{ - Fix::Rep* r = Fix::add(x.rep, y.rep); return r; -} - -inline Fix -operator - (const Fix& x, const Fix& y) -{ - Fix::Rep* r = Fix::subtract(x.rep, y.rep); return r; -} - -inline Fix -operator * (const Fix& x, const Fix& y) -{ - Fix::Rep* r = Fix::multiply(x.rep, y.rep); return r; -} - -inline Fix -operator * (const Fix& x, int y) -{ - Fix::Rep* r = Fix::multiply(x.rep, y); return r; -} - -inline Fix -operator * (int y, const Fix& x) -{ - Fix::Rep* r = Fix::multiply(x.rep, y); return r; -} - -inline Fix -operator / (const Fix& x, const Fix& y) -{ - Fix::Rep* r = Fix::divide(x.rep, y.rep); return r; -} - -inline Fix -Fix::operator += (const Fix& y) -{ - unique(); Fix::add(rep, y.rep, rep); return *this; -} - -inline Fix -Fix::operator -= (const Fix& y) -{ - unique(); Fix::subtract(rep, y.rep, rep); return *this; -} - -inline Fix -Fix::operator *= (const Fix& y) -{ - unique(); Fix::multiply(rep, y.rep, rep); return *this; -} - -inline Fix -Fix::operator *= (int y) -{ - unique(); Fix::multiply(rep, y, rep); return *this; -} - -inline Fix -Fix::operator /= (const Fix& y) -{ - unique(); Fix::divide(rep, y.rep, rep); return *this; -} - -inline Fix -operator % (const Fix& x, int y) -{ - Fix r((int) x.rep->len + y, x); return r; -} - -inline Fix -operator << (const Fix& x, int y) -{ - Fix::Rep* rep = Fix::shift(x.rep, y); return rep; -} - -inline Fix -operator >> (const Fix& x, int y) -{ - Fix::Rep* rep = Fix::shift(x.rep, -y); return rep; -} - -inline Fix -Fix::operator <<= (int y) -{ - unique(); Fix::shift(rep, y, rep); return *this; -} - -inline Fix -Fix::operator >>= (int y) -{ - unique(); Fix::shift(rep, -y, rep); return *this; -} - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) -inline Fix -operator <? (const Fix& x, const Fix& y) -{ - if ( Fix::compare(x.rep, y.rep) <= 0 ) return x; else return y; -} - -inline Fix -operator >? (const Fix& x, const Fix& y) -{ - if ( Fix::compare(x.rep, y.rep) >= 0 ) return x; else return y; -} -#endif - -inline Fix -abs(Fix x) -{ - Fix::Rep* r = (Fix::compare(x.rep) >= 0 ? Fix::new_Fix(x.rep->len,x.rep) : - Fix::negate(x.rep)); - return r; -} - -inline int -sgn(const Fix& x) -{ - int a = Fix::compare(x.rep); - return a == 0 ? 0 : (a > 0 ? 1 : -1); -} - -inline int -length(const Fix& x) -{ - return x.rep->len; -} - -inline ostream& -operator << (ostream& s, const Fix& y) -{ - if (s.opfx()) - y.printon(s); - return s; -} - -inline void -negate (const Fix& x, Fix& r) -{ - Fix::negate(x.rep, r.rep); -} - -inline void -add (const Fix& x, const Fix& y, Fix& r) -{ - Fix::add(x.rep, y.rep, r.rep); -} - -inline void -subtract (const Fix& x, const Fix& y, Fix& r) -{ - Fix::subtract(x.rep, y.rep, r.rep); -} - -inline void -multiply (const Fix& x, const Fix& y, Fix& r) -{ - Fix::multiply(x.rep, y.rep, r.rep); -} - -inline void -divide (const Fix& x, const Fix& y, Fix& q, Fix& r) -{ - Fix::divide(x.rep, y.rep, q.rep, r.rep); -} - -inline void -shift (const Fix& x, int y, Fix& r) -{ - Fix::shift(x.rep, y, r.rep); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Fix16.cc b/gnu/lib/libg++/libg++/src/Fix16.cc deleted file mode 100644 index dddab2495d3..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix16.cc +++ /dev/null @@ -1,238 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Kurt Baudendistel (gt-eedsp!baud@gatech.edu) - adapted for libg++ by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -// -// Fix.cc : fixed precision class support functions -// - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Fix16.h> - -// basic operators too large to be inline - -short Fix16::assign(double d) -{ - if (d == 1.0) - return Fix16_m_max; - else if (d > Fix16_max) - { - short i = Fix16_m_max; - range_error(i); - return i; - } - else if (d < Fix16_min) - { - short i = Fix16_m_min; - range_error(i); - return i; - } - else - return round(Fix16_mult * d); -} - -_G_int32_t Fix32::assign(double d) -{ - if (d == 1.0) - return Fix32_m_max; - else if (d > Fix32_max) - { - _G_int32_t i = Fix32_m_max; - range_error(i); - return i; - } - else if (d < Fix32_min) - { - _G_int32_t i = Fix32_m_min; - range_error(i); - return i; - } - else - return round(Fix32_mult * d); -} - - -Fix32 operator * (const Fix32& a, const Fix32& b) -{ -// break a and b into lo and hi parts, and do a multiple-precision -// multiply, with rounding - - int apos = (a.m >= 0); - _G_uint32_t ua = (apos)? a.m : - a.m; - ua <<= 1; // ua is biased so result will be 31 bit mantissa, not 30: - _G_uint32_t hi_a = (ua >> 16) & ((1 << 16) - 1); - _G_uint32_t lo_a = ua & ((1 << 16) - 1); - - int bpos = (b.m >= 0); - _G_uint32_t ub = (bpos)? b.m : -b.m; - _G_uint32_t hi_b = (ub >> 16) & ((1 << 16) - 1); - _G_uint32_t lo_b = ub & ((1 << 16) - 1); - - _G_uint32_t r = lo_a * lo_b + (1 << 15); - r = (r >> 16) + hi_a * lo_b + lo_a * hi_b + (1 << 15); - r = (r >> 16) + hi_a * hi_b; - _G_int32_t p = (apos != bpos)? -r : r; - return Fix32(p); -} - -Fix16 operator / (const Fix16& a, const Fix16& b) -{ - short q; - int apos = (a.m >= 0); - _G_int32_t la = (apos)? a.m : -a.m; - _G_int32_t scaled_a = la << 15; - int bpos = (b.m >= 0); - short sb = (bpos)? b.m: -b.m; - if (la >= sb) - { - q = (apos == bpos)? Fix16_m_max: Fix16_m_min; - a.range_error(q); - } - else - { - q = scaled_a / sb; - if ((scaled_a % sb) >= (sb / 2)) ++q; - if (apos != bpos) q = -q; - } - return Fix16(q); -} - -Fix32 operator / (const Fix32& a, const Fix32& b) -{ - _G_int32_t q; - int apos = (a.m >= 0); - _G_uint32_t la = (apos)? a.m : -a.m; - int bpos = (b.m >= 0); - _G_uint32_t lb = (bpos)? b.m: -b.m; - if (la >= lb) - { - q = (apos == bpos)? Fix32_m_max: Fix32_m_min; - a.range_error(q); - } - else // standard shift-based division alg - { - q = 0; - _G_int32_t r = la; - - for (int i = 32; i > 0; i--) - { - if ((unsigned)(r) > lb) { - q = (q << 1) | 1; - r -= lb; - } - else - q = (q << 1); - r <<= 1; - } - - if (apos != bpos) q = -q; // Fix sign - } - return Fix32(q); -} - - -// error handling - -void Fix16::overflow(short& i) const -{ - (*Fix16_overflow_handler)(i); -} - -void Fix32::overflow(_G_int32_t& i) const -{ - (*Fix32_overflow_handler)(i); -} - -void Fix16::range_error(short& i) const -{ - (*Fix16_range_error_handler)(i); -} - -void Fix32::range_error(_G_int32_t& i) const -{ - (*Fix32_range_error_handler)(i); -} - -// data definitions - -Fix16_peh Fix16_overflow_handler = Fix16_overflow_saturate; -Fix32_peh Fix32_overflow_handler = Fix32_overflow_saturate; - -Fix16_peh Fix16_range_error_handler = Fix16_warning; -Fix32_peh Fix32_range_error_handler = Fix32_warning; - -//function definitions - -Fix16_peh set_Fix16_overflow_handler(Fix16_peh new_handler) { - Fix16_peh old_handler = Fix16_overflow_handler; - Fix16_overflow_handler = new_handler; - return old_handler; -} - -Fix32_peh set_Fix32_overflow_handler(Fix32_peh new_handler) { - Fix32_peh old_handler = Fix32_overflow_handler; - Fix32_overflow_handler = new_handler; - return old_handler; -} - -void set_overflow_handler(Fix16_peh handler16, Fix32_peh handler32) { - set_Fix16_overflow_handler(handler16); - set_Fix32_overflow_handler(handler32); -} - -Fix16_peh set_Fix16_range_error_handler(Fix16_peh new_handler) { - Fix16_peh old_handler = Fix16_range_error_handler; - Fix16_range_error_handler = new_handler; - return old_handler; -} - -Fix32_peh set_Fix32_range_error_handler(Fix32_peh new_handler) { - Fix32_peh old_handler = Fix32_range_error_handler; - Fix32_range_error_handler = new_handler; - return old_handler; -} - -void set_range_error_handler(Fix16_peh handler16, Fix32_peh handler32) { - set_Fix16_range_error_handler(handler16); - set_Fix32_range_error_handler(handler32); -} - -void Fix16_overflow_saturate(short& i) - { i = (i > 0 ? Fix16_m_min : Fix16_m_max); } -void Fix16_ignore(short&) {} -void Fix16_warning(short&) - { cerr << "warning: Fix16 result out of range\n"; } -void Fix16_overflow_warning_saturate(short& i) - { cerr << "warning: Fix16 result out of range\n"; - Fix16_overflow_saturate(i); } -void Fix16_abort(short&) - { cerr << "error: Fix16 result out of range\n"; abort(); } - -void Fix32_ignore(_G_int32_t&) {} -void Fix32_overflow_saturate(_G_int32_t& i) - { i = (i > 0 ? Fix32_m_min : Fix32_m_max); } -void Fix32_warning(_G_int32_t&) - { cerr << "warning: Fix32 result out of range\n"; } -void Fix32_overflow_warning_saturate(_G_int32_t& i) - { cerr << "warning: Fix32 result out of range\n"; - Fix32_overflow_saturate(i); } -void Fix32_abort(_G_int32_t&) - { cerr << "error: Fix32 result out of range\n"; abort(); } - diff --git a/gnu/lib/libg++/libg++/src/Fix16.h b/gnu/lib/libg++/libg++/src/Fix16.h deleted file mode 100644 index 7f1336b308c..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix16.h +++ /dev/null @@ -1,648 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Kurt Baudendistel (gt-eedsp!baud@gatech.edu) - adapted for libg++ by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _Fix16_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Fix16_h 1 - -#include <stream.h> -#include <std.h> - -// constant definitions - -#define Fix16_fs ((double)((unsigned)(1 << 15))) - -#define Fix16_msb (1 << 15) -#define Fix16_m_max ((1 << 15) - 1) -#define Fix16_m_min ((short)(1 << 15)) - -#define Fix16_mult Fix16_fs -#define Fix16_div (1./Fix16_fs) -#define Fix16_max (1. - .5/Fix16_fs) -#define Fix16_min (-1.) - - -#define Fix32_fs ((double)((_G_uint32_t)(1 << 31))) - -#define Fix32_msb ((_G_uint32_t)(1 << 31)) -#define Fix32_m_max ((_G_int32_t)((1 << 31) - 1)) -#define Fix32_m_min ((_G_int32_t)(1 << 31)) - -#define Fix32_mult Fix32_fs -#define Fix32_div (1./Fix32_fs) -#define Fix32_max (1. - .5/Fix32_fs) -#define Fix32_min (-1.) - - -// -// Fix16 class: 16-bit Fixed point data type -// -// consists of a 16-bit mantissa (sign bit & 15 data bits). -// - -class Fix16 -{ - friend class Fix32; - - short m; - - short round(double d); - short assign(double d); - Fix16(short i); - Fix16(int i); - - operator double() const; - - -public: - Fix16(); - Fix16(const Fix16& f); - Fix16(double d); - Fix16(const Fix32& f); - - ~Fix16(); - - Fix16& operator=(const Fix16& f); - Fix16& operator=(double d); - Fix16& operator=(const Fix32& f); - - friend short& mantissa(Fix16& f); - friend const short& mantissa(const Fix16& f); - friend double value(const Fix16& f); - - Fix16 operator + () const; - Fix16 operator - () const; - - friend Fix16 operator + (const Fix16& f, const Fix16& g); - friend Fix16 operator - (const Fix16& f, const Fix16& g); - friend Fix32 operator * (const Fix16& f, const Fix16& g); - friend Fix16 operator / (const Fix16& f, const Fix16& g); - friend Fix16 operator << (const Fix16& f, int b); - friend Fix16 operator >> (const Fix16& f, int b); - - Fix16& operator += (const Fix16& f); - Fix16& operator -= (const Fix16& f); - Fix16& operator *= (const Fix16& ); - Fix16& operator /= (const Fix16& f); - - Fix16& operator <<=(int b); - Fix16& operator >>=(int b); - - friend int operator == (const Fix16& f, const Fix16& g); - friend int operator != (const Fix16& f, const Fix16& g); - friend int operator >= (const Fix16& f, const Fix16& g); - friend int operator <= (const Fix16& f, const Fix16& g); - friend int operator > (const Fix16& f, const Fix16& g); - friend int operator < (const Fix16& f, const Fix16& g); - - friend istream& operator >> (istream& s, Fix16& f); - friend ostream& operator << (ostream& s, const Fix16& f); - - void overflow(short&) const; - void range_error(short&) const; - - friend Fix16 operator * (const Fix16& f, int g); - friend Fix16 operator * (int g, const Fix16& f); - Fix16& operator *= (int g); -}; - - -// -// Fix32 class: 32-bit Fixed point data type -// -// consists of a 32-bit mantissa (sign bit & 31 data bits). -// - -class Fix32 -{ - friend class Fix16; - - _G_int32_t m; - - _G_int32_t round(double d); - _G_int32_t assign(double d); - - Fix32(_G_int32_t i); - operator double() const; - - -public: - Fix32(); - Fix32(const Fix32& f); - Fix32(const Fix16& f); - Fix32(double d); - ~Fix32(); - - Fix32& operator = (const Fix32& f); - Fix32& operator = (const Fix16& f); - Fix32& operator = (double d); - - friend _G_int32_t& mantissa(Fix32& f); - friend const _G_int32_t& mantissa(const Fix32& f); - friend double value(const Fix32& f); - - Fix32 operator + () const; - Fix32 operator - () const; - - friend Fix32 operator + (const Fix32& f, const Fix32& g); - friend Fix32 operator - (const Fix32& f, const Fix32& g); - friend Fix32 operator * (const Fix32& f, const Fix32& g); - friend Fix32 operator / (const Fix32& f, const Fix32& g); - friend Fix32 operator << (const Fix32& f, int b); - friend Fix32 operator >> (const Fix32& f, int b); - - friend Fix32 operator * (const Fix16& f, const Fix16& g); - - Fix32& operator += (const Fix32& f); - Fix32& operator -= (const Fix32& f); - Fix32& operator *= (const Fix32& f); - Fix32& operator /= (const Fix32& f); - Fix32& operator <<=(int b); - Fix32& operator >>=(int b); - - friend int operator == (const Fix32& f, const Fix32& g); - friend int operator != (const Fix32& f, const Fix32& g); - friend int operator >= (const Fix32& f, const Fix32& g); - friend int operator <= (const Fix32& f, const Fix32& g); - friend int operator > (const Fix32& f, const Fix32& g); - friend int operator < (const Fix32& f, const Fix32& g); - - friend istream& operator >> (istream& s, Fix32& f); - friend ostream& operator << (ostream& s, const Fix32& f); - - void overflow(_G_int32_t& i) const; - void range_error(_G_int32_t& i) const; - - friend Fix32 operator * (const Fix32& f, int g); - friend Fix32 operator * (int g, const Fix32& f); - Fix32& operator *= (int g); -}; - -// active error handler declarations - -typedef void (*Fix16_peh)(short&); -typedef void (*Fix32_peh)(_G_int32_t&); - -extern Fix16_peh Fix16_overflow_handler; -extern Fix32_peh Fix32_overflow_handler; - -extern Fix16_peh Fix16_range_error_handler; -extern Fix32_peh Fix32_range_error_handler; - -#if defined(SHORT_NAMES) || defined(VMS) -#define set_overflow_handler sohndl -#define set_range_error_handler srnghdl -#endif - - -// error handler declarations - -extern Fix16_peh set_Fix16_overflow_handler(Fix16_peh); -extern Fix32_peh set_Fix32_overflow_handler(Fix32_peh); -extern void set_overflow_handler(Fix16_peh, Fix32_peh); - -extern Fix16_peh set_Fix16_range_error_handler(Fix16_peh); -extern Fix32_peh set_Fix32_range_error_handler(Fix32_peh); -extern void set_range_error_handler(Fix16_peh, Fix32_peh); - -extern void - Fix16_ignore(short&), - Fix16_overflow_saturate(short&), - Fix16_overflow_warning_saturate(short&), - Fix16_warning(short&), - Fix16_abort(short&); - -extern void - Fix32_ignore(_G_int32_t&), - Fix32_overflow_saturate(_G_int32_t&), - Fix32_overflow_warning_saturate(_G_int32_t&), - Fix32_warning(_G_int32_t&), - Fix32_abort(_G_int32_t&); - - -inline Fix16::~Fix16() {} - -inline Fix32::~Fix32() {} - -inline short Fix16::round(double d) -{ - return short( (d >= 0)? d + 0.5 : d - 0.5); -} - -inline Fix16::Fix16(short i) -{ - m = i; -} - -inline Fix16::Fix16(int i) -{ - m = i; -} - -inline Fix16::operator double() const -{ - return Fix16_div * m; -} - -inline Fix16::Fix16() -{ - m = 0; -} - -inline Fix16::Fix16(const Fix16& f) -{ - m = f.m; -} - -inline Fix16::Fix16(double d) -{ - m = assign(d); -} - - -inline Fix16& Fix16::operator=(const Fix16& f) -{ - m = f.m; - return *this; -} - -inline Fix16& Fix16::operator=(double d) -{ - m = assign(d); - return *this; -} - - -inline Fix32::Fix32() -{ - m = 0; -} - -inline Fix32::Fix32(_G_int32_t i) -{ - m = i; -} - -inline Fix32:: operator double() const -{ - return Fix32_div * m; -} - - -inline Fix32::Fix32(const Fix32& f) -{ - m = f.m; -} - -inline Fix32::Fix32(const Fix16& f) -{ - m = _G_int32_t(f.m) << 16; -} - -inline Fix32::Fix32(double d) -{ - m = assign(d); -} - -inline Fix16::Fix16(const Fix32& f) -{ - m = f.m >> 16; -} - - -inline Fix16& Fix16::operator=(const Fix32& f) -{ - m = f.m >> 16; - return *this; -} - -inline Fix32& Fix32::operator=(const Fix32& f) -{ - m = f.m; - return *this; -} - -inline Fix32& Fix32::operator=(const Fix16& f) -{ - m = _G_int32_t(f.m) << 16; - return *this; -} - -inline Fix32& Fix32::operator=(double d) -{ - m = assign(d); - return *this; -} - -inline short& mantissa(Fix16& f) -{ - return f.m; -} - -inline const short& mantissa(const Fix16& f) -{ - return f.m; -} - -inline double value(const Fix16& f) -{ - return double(f); -} - -inline Fix16 Fix16::operator+() const -{ - return m; -} - -inline Fix16 Fix16::operator-() const -{ - return -m; -} - -inline Fix16 operator+(const Fix16& f, const Fix16& g) -{ - short sum = f.m + g.m; - if ( (f.m ^ sum) & (g.m ^ sum) & Fix16_msb ) - f.overflow(sum); - return sum; -} - -inline Fix16 operator-(const Fix16& f, const Fix16& g) -{ - short sum = f.m - g.m; - if ( (f.m ^ sum) & (-g.m ^ sum) & Fix16_msb ) - f.overflow(sum); - return sum; -} - -inline Fix32 operator*(const Fix16& f, const Fix16& g) -{ - return Fix32( _G_int32_t( _G_int32_t(f.m) * _G_int32_t(g.m) << 1)); -} - -inline Fix16 operator<<(const Fix16& a, int b) -{ - return a.m << b; -} - -inline Fix16 operator>>(const Fix16& a, int b) -{ - return a.m >> b; -} - -inline Fix16& Fix16:: operator+=(const Fix16& f) -{ - return *this = *this + f; -} - -inline Fix16& Fix16:: operator-=(const Fix16& f) -{ - return *this = *this - f; -} - -inline Fix16& Fix16::operator*=(const Fix16& f) -{ - return *this = *this * f; -} - -inline Fix16& Fix16:: operator/=(const Fix16& f) -{ - return *this = *this / f; -} - -inline Fix16& Fix16:: operator<<=(int b) -{ - return *this = *this << b; -} - -inline Fix16& Fix16:: operator>>=(int b) -{ - return *this = *this >> b; -} - -inline int operator==(const Fix16& f, const Fix16& g) -{ - return f.m == g.m; -} - -inline int operator!=(const Fix16& f, const Fix16& g) -{ - return f.m != g.m; -} - -inline int operator>=(const Fix16& f, const Fix16& g) -{ - return f.m >= g.m; -} - -inline int operator<=(const Fix16& f, const Fix16& g) -{ - return f.m <= g.m; -} - -inline int operator>(const Fix16& f, const Fix16& g) -{ - return f.m > g.m; -} - -inline int operator<(const Fix16& f, const Fix16& g) -{ - return f.m < g.m; -} - -inline istream& operator>>(istream& s, Fix16& f) -{ - double d; - s >> d; - f = d; - return s; -} - -inline ostream& operator<<(ostream& s, const Fix16& f) -{ - return s << double(f); -} - - -inline Fix16 operator*(const Fix16& f, int g) -{ - return Fix16(short(f.m * g)); -} - -inline Fix16 operator*(int g, const Fix16& f) -{ - return f * g; -} - - -inline Fix16& Fix16::operator*=(int g) -{ - return *this = *this * g; -} - -inline _G_int32_t Fix32::round(double d) -{ - return _G_int32_t( (d >= 0)? d + 0.5 : d - 0.5); -} - -inline _G_int32_t& mantissa(Fix32& f) -{ - return f.m; -} - -inline const _G_int32_t& mantissa(const Fix32& f) -{ - return f.m; -} - -inline double value(const Fix32& f) -{ - return double(f); -} - -inline Fix32 Fix32::operator+() const -{ - return m; -} - -inline Fix32 Fix32::operator-() const -{ - return -m; -} - -inline Fix32 operator+(const Fix32& f, const Fix32& g) -{ - _G_int32_t sum = f.m + g.m; - if ( (f.m ^ sum) & (g.m ^ sum) & Fix32_msb ) - f.overflow(sum); - return sum; -} - -inline Fix32 operator-(const Fix32& f, const Fix32& g) -{ - _G_int32_t sum = f.m - g.m; - if ( (f.m ^ sum) & (-g.m ^ sum) & Fix32_msb ) - f.overflow(sum); - return sum; -} - -inline Fix32 operator<<(const Fix32& a, int b) -{ - return a.m << b; -} - -inline Fix32 operator>>(const Fix32& a, int b) -{ - return a.m >> b; -} - -inline Fix32& Fix32::operator+=(const Fix32& f) -{ - return *this = *this + f; -} - -inline Fix32& Fix32::operator-=(const Fix32& f) -{ - return *this = *this - f; -} - -inline Fix32& Fix32::operator*=(const Fix32& f) -{ - return *this = *this * f; -} - -inline Fix32& Fix32::operator/=(const Fix32& f) -{ - return *this = *this / f; -} - - -inline Fix32& Fix32::operator<<=(int b) -{ - return *this = *this << b; -} - -inline Fix32& Fix32::operator>>=(int b) -{ - return *this = *this >> b; -} - -inline int operator==(const Fix32& f, const Fix32& g) -{ - return f.m == g.m; -} - -inline int operator!=(const Fix32& f, const Fix32& g) -{ - return f.m != g.m; -} - -inline int operator>=(const Fix32& f, const Fix32& g) -{ - return f.m >= g.m; -} - -inline int operator<=(const Fix32& f, const Fix32& g) -{ - return f.m <= g.m; -} - -inline int operator>(const Fix32& f, const Fix32& g) -{ - return f.m > g.m; -} - -inline int operator<(const Fix32& f, const Fix32& g) -{ - return f.m < g.m; -} - -inline istream& operator>>(istream& s, Fix32& f) -{ - double d; - s >> d; - f = d; - return s; -} - -inline ostream& operator<<(ostream& s, const Fix32& f) -{ - return s << double(f); -} - -inline Fix32 operator*(const Fix32& f, int g) -{ - return Fix32(_G_int32_t(f.m * g)); -} - -inline Fix32 operator*(int g, const Fix32& f) -{ - return f * g; -} - - - -inline Fix32& Fix32::operator*=(int g) -{ - return *this = *this * g; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Fix24.cc b/gnu/lib/libg++/libg++/src/Fix24.cc deleted file mode 100644 index 41878bb7c5e..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix24.cc +++ /dev/null @@ -1,329 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Kurt Baudendistel (gt-eedsp!baud@gatech.edu) - adapted for libg++ by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -// -// Fix24.cc : fixed precision class support functions -// - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Fix24.h> - -// basic operators too large to be inline - -_G_int32_t Fix24::assign(double d) -{ - if (d == 1.0) - return Fix24_m_max; - else if (d > Fix24_max) - { - _G_int32_t i = Fix24_m_max; - range_error(i); - return i; - } - else if (d < Fix24_min) - { - _G_int32_t i = Fix24_m_min; - range_error(i); - return i; - } - else { - // Round to 24 bits - d = (_G_int32_t) (d * (1 << 24) + ((d >= 0)? 0.5 : -0.5)); - /* Convert to integer format */ - return ((_G_int32_t) d) << (Fix24_shift - 24); - } -} - -twolongs Fix48::assign(double d) -{ - if (d == 1.0) - return Fix48_m_max; - else if (d > Fix48_max) - { - twolongs i = Fix48_m_max; - range_error(i); - return i; - } - else if (d < Fix48_min) - { - twolongs i = Fix48_m_min; - range_error(i); - return i; - } - else { - twolongs i; - int sign = (d < 0); - -/* First, convert the absolute value of d to a 48-bit integer format */ - if (d < 0) d = -d; - i.u = ((_G_int32_t)(d *= Fix24_mult)) & 0xffffff00; - i.l = ((_G_uint32_t)((d - i.u)* (Fix24_mult / (1 << 7)))) & 0xffffff00; - -/* Calculate the two's complement if d was negative */ - if (sign) { - _G_uint32_t oldlower = i.l; - i.l = (~i.l + 1) & 0xffffff00; - i.u = (~i.u + (((oldlower ^ i.l) & Fix24_msb)? 0 : 1)) & ~0xffL; - } - return i; - } -} - - -Fix48 operator * (const Fix24& a, const Fix24& b) -{ -// break a and b into lo and hi parts, and do a multiple-precision -// multiply, with rounding - - int apos = (a.m >= 0); - _G_uint32_t ua = (apos)? a.m : - a.m; - ua <<= 1; // ua is biased so result will be 47 bit mantissa, not 46: - _G_uint32_t hi_a = (ua >> 16) & ((1 << 16) - 1); - _G_uint32_t lo_a = ua & ((1 << 16) - 1); - - int bpos = (b.m >= 0); - _G_uint32_t ub = (bpos)? b.m : -b.m; - _G_uint32_t hi_b = (ub >> 16) & ((1 << 16) - 1); - _G_uint32_t lo_b = ub & ((1 << 16) - 1); - - _G_uint32_t - hi_r = hi_a * hi_b, - mi_r = hi_a * lo_b + lo_a * hi_b, - lo_r = lo_a * lo_b, - rl = ((hi_r << 16) & 0x00ffffffL) + (mi_r & 0x00ffffffL) + (lo_r >> 16); - twolongs r; - r.u = (hi_r & 0xffffff00L) + ((mi_r >> 16) & 0x0000ff00L) - + ((rl >> 16) & 0x0000ff00L); - r.l = rl << 8; - - if ( apos != bpos ) { - _G_uint32_t l = r.l; - r.l = -r.l; - r.u = (~r.u + ((l ^ r.l) & Fix24_msb ? 0 : Fix24_lsb)) & 0xffffff00; - } - return r; -} - -Fix24 operator / (const Fix24& a, const Fix24& b) -{ - _G_int32_t q; - int apos = (a.m >= 0); - _G_uint32_t la = (apos)? a.m : -a.m; - int bpos = (b.m >= 0); - _G_uint32_t lb = (bpos)? b.m: -b.m; - if (la >= lb) - { - q = (apos == bpos)? Fix24_m_max: Fix24_m_min; - a.range_error(q); - } - else // standard shift-based division alg - { - q = 0; - _G_int32_t r = la; - - for (int i = 32; i > 0; i--) - { - if ((unsigned)(r) > lb) { - q = (q << 1) | 1; - r -= lb; - } - else - q = (q << 1); - r <<= 1; - } - - q += 0x80; // Round result to 24 bits - if (apos != bpos) q = -q; // Fix sign - } - return (q & ~0xff); -} - - -Fix48 operator + (const Fix48& f, const Fix48& g) -{ - _G_int32_t lo_r = (f.m.l >> 8) + (g.m.l >> 8); - twolongs r; - r.u = f.m.u + g.m.u + (lo_r & 0x01000000L ? 0x00000100L : 0); - r.l = lo_r << 8; - - if ( (f.m.u ^ r.u) & (g.m.u ^ r.u) & Fix24_msb ) - f.overflow(r); - return r; -} - -Fix48 operator - (const Fix48& f, const Fix48& g) -{ - unsigned lo_r = (f.m.l >> 8) - (g.m.l >> 8); - twolongs r; - r.u = f.m.u - g.m.u - (lo_r & 0x01000000L ? 0x00000100L: 0); - r.l = lo_r << 8; - - if ( ((f.m.u ^ r.u) & (-g.m.u ^ r.u) & Fix24_msb) && g.m.u ) - f.overflow(r); - return r; -} - -Fix48 operator * (const Fix48& a, int b) -{ - twolongs r; - int bpos = (b >= 0); - unsigned ub = (bpos)? b : -b; - if ( ub >= 65536L ) { - r = (bpos)? Fix48_m_max : Fix48_m_min; - a.range_error(r); - } - else { - _G_uint32_t - lo_r = (a.m.l & 0xffff) * ub, - mi_r = ((a.m.l >> 16) & 0xffff) * ub, - hi_r = a.m.u * ub; - r.l = lo_r + (mi_r << 16); - r.u = hi_r + ((mi_r >> 8) & 0x00ffff00L); - if ( !bpos ) { - _G_uint32_t l = r.l; - r.l = -r.l & 0xffffffff; - r.u = ~r.u + ((l ^ r.l) & Fix24_msb ? 0 : Fix24_lsb); - } - } - return r; -} - -Fix48 operator << (const Fix48& a, int b) -{ - twolongs r; r.u = 0; r.l = 0; - if ( b >= 0 ) - if ( b < 24 ) { - r.u = (a.m.u << b) + ((a.m.l >> (24 - b)) & 0xffffff00L); - r.l = a.m.l << b; - } - else if ( b < 48 ) { - r.u = a.m.l << (b - 24); - } - return r; -} - -Fix48 operator >> (const Fix48& a, int b) -{ - twolongs r; r.u = 0; r.l = 0; - if ( b >= 0 ) - if ( b < 24 ) { - r.l = ((a.m.u << (24 - b)) & 0xffffffffL) + ((a.m.l >> b) & 0xffffff00L); - r.u = (a.m.u >> b) & ~0xffL; - } - else if ( b < 48 ) { - r.l = (a.m.u >> (b - 24)) & 0xffffff00L; - r.u = (a.m.u >> 24) & ~0xffL; - } - else { - r.l = (a.m.u >> 24) & ~0xffL; - r.u = r.l; - } - return r; -} - -// error handling - -void Fix24::overflow(_G_int32_t& i) const -{ - (*Fix24_overflow_handler)(i); -} - -void Fix48::overflow(twolongs& i) const -{ - (*Fix48_overflow_handler)(i); -} - -void Fix24::range_error(_G_int32_t& i) const -{ - (*Fix24_range_error_handler)(i); -} - -void Fix48::range_error(twolongs& i) const -{ - (*Fix48_range_error_handler)(i); -} - -// data definitions - -Fix24_peh Fix24_overflow_handler = Fix24_overflow_saturate; -Fix48_peh Fix48_overflow_handler = Fix48_overflow_saturate; - -Fix24_peh Fix24_range_error_handler = Fix24_warning; -Fix48_peh Fix48_range_error_handler = Fix48_warning; - -//function definitions - -Fix24_peh set_Fix24_overflow_handler(Fix24_peh new_handler) { - Fix24_peh old_handler = Fix24_overflow_handler; - Fix24_overflow_handler = new_handler; - return old_handler; -} - -Fix48_peh set_Fix48_overflow_handler(Fix48_peh new_handler) { - Fix48_peh old_handler = Fix48_overflow_handler; - Fix48_overflow_handler = new_handler; - return old_handler; -} - -void set_overflow_handler(Fix24_peh handler24, Fix48_peh handler48) { - set_Fix24_overflow_handler(handler24); - set_Fix48_overflow_handler(handler48); -} - -Fix24_peh set_Fix24_range_error_handler(Fix24_peh new_handler) { - Fix24_peh old_handler = Fix24_range_error_handler; - Fix24_range_error_handler = new_handler; - return old_handler; -} - -Fix48_peh set_Fix48_range_error_handler(Fix48_peh new_handler) { - Fix48_peh old_handler = Fix48_range_error_handler; - Fix48_range_error_handler = new_handler; - return old_handler; -} - -void set_range_error_handler(Fix24_peh handler24, Fix48_peh handler48) { - set_Fix24_range_error_handler(handler24); - set_Fix48_range_error_handler(handler48); -} - -void Fix24_overflow_saturate(_G_int32_t& i) - { i = (i > 0 ? Fix24_m_min : Fix24_m_max); } -void Fix24_ignore(_G_int32_t&) {} -void Fix24_warning(_G_int32_t&) - { cerr << "warning: Fix24 result out of range\n"; } -void Fix24_overflow_warning_saturate(_G_int32_t& i) - { cerr << "warning: Fix24 result out of range\n"; - Fix24_overflow_saturate(i); } -void Fix24_abort(_G_int32_t&) - { cerr << "error: Fix24 result out of range\n"; abort(); } - -void Fix48_ignore(twolongs&) {} -void Fix48_overflow_saturate(twolongs& i) - { i = (i.u > 0 ? Fix48_m_min : Fix48_m_max); } -void Fix48_warning(twolongs&) - { cerr << "warning: Fix48 result out of range\n"; } -void Fix48_overflow_warning_saturate(twolongs& i) - { cerr << "warning: Fix48 result out of range\n"; - Fix48_overflow_saturate(i); } -void Fix48_abort(twolongs&) - { cerr << "error: Fix48 result out of range\n"; abort(); } - diff --git a/gnu/lib/libg++/libg++/src/Fix24.h b/gnu/lib/libg++/libg++/src/Fix24.h deleted file mode 100644 index 10503c8bd1e..00000000000 --- a/gnu/lib/libg++/libg++/src/Fix24.h +++ /dev/null @@ -1,597 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Kurt Baudendistel (gt-eedsp!baud@gatech.edu) - adapted for libg++ by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _Fix24_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Fix24_h 1 - -#include <stream.h> -#include <std.h> - -// extra type definitions - -typedef struct { - _G_int32_t u; - _G_uint32_t l; -} twolongs; - -// constant definitions - -static const int - Fix24_shift = 31; - -static const double - Fix24_fs = 2147483648., // 2^Fix24_shift - Fix24_mult = Fix24_fs, - Fix24_div = 1./Fix24_fs, - Fix24_max = 1. - .5/Fix24_fs, - Fix24_min = -1.; - -static const _G_uint32_t - Fix24_msb = 0x80000000L, - Fix24_lsb = 0x00000100L, - Fix24_m_max = 0x7fffff00L, - Fix24_m_min = 0x80000000L; - -static const double - Fix48_fs = 36028797018963968., // 2^(24+Fix24_shift) - Fix48_max = 1. - .5/Fix48_fs, - Fix48_min = -1., - Fix48_div_u = 1./Fix24_fs, - Fix48_div_l = 1./Fix48_fs; - -static const twolongs - Fix48_msb = { 0x80000000L, 0L }, - Fix48_lsb = { 0L, 0x00000100L }, - Fix48_m_max = { 0x7fffff00L, 0xffffff00L }, - Fix48_m_min = { 0x80000000L, 0L }; - -// -// Fix24 class: 24-bit Fixed point data type -// -// consists of a 24-bit mantissa (sign bit & 23 data bits). -// - -class Fix24 -{ - friend class Fix48; - - _G_int32_t m; - - _G_int32_t assign(double d); - operator double() const; - Fix24(long i); - Fix24(int i); - - -public: - Fix24(); - Fix24(const Fix24& f); - Fix24(double d); - Fix24(const Fix48& f); - - ~Fix24(); - - Fix24& operator=(const Fix24& f); - Fix24& operator=(double d); - Fix24& operator=(const Fix48& f); - - friend _G_int32_t& mantissa(Fix24& f); - friend const _G_int32_t& mantissa(const Fix24& f); - friend double value(const Fix24& f); - - Fix24 operator + () const; - Fix24 operator - () const; - - friend Fix24 operator + (const Fix24& f, const Fix24& g); - friend Fix24 operator - (const Fix24& f, const Fix24& g); - friend Fix48 operator * (const Fix24& f, const Fix24& g); - friend Fix24 operator * (const Fix24& f, int g); - friend Fix24 operator * (int g, const Fix24& f); - friend Fix24 operator / (const Fix24& f, const Fix24& g); - friend Fix24 operator << (const Fix24& f, int b); - friend Fix24 operator >> (const Fix24& f, int b); - - Fix24& operator += (const Fix24& f); - Fix24& operator -= (const Fix24& f); - Fix24& operator *= (const Fix24& f); - Fix24& operator *= (int b); - Fix24& operator /= (const Fix24& f); - - Fix24& operator <<=(int b); - Fix24& operator >>=(int b); - - friend int operator == (const Fix24& f, const Fix24& g); - friend int operator != (const Fix24& f, const Fix24& g); - friend int operator >= (const Fix24& f, const Fix24& g); - friend int operator <= (const Fix24& f, const Fix24& g); - friend int operator > (const Fix24& f, const Fix24& g); - friend int operator < (const Fix24& f, const Fix24& g); - - friend istream& operator >> (istream& s, Fix24& f); - friend ostream& operator << (ostream& s, const Fix24& f); - - void overflow(_G_int32_t&) const; - void range_error(_G_int32_t&) const; -}; - - -// -// Fix48 class: 48-bit Fixed point data type -// -// consists of a 48-bit mantissa (sign bit & 47 data bits). -// - -class Fix48 -{ - friend class Fix24; - - twolongs m; - - twolongs assign(double d); - operator double() const; - Fix48(twolongs i); - -public: - Fix48(); - Fix48(const Fix48& f); - Fix48(const Fix24& f); - Fix48(double d); - ~Fix48(); - - Fix48& operator = (const Fix48& f); - Fix48& operator = (const Fix24& f); - Fix48& operator = (double d); - - friend twolongs& mantissa(Fix48& f); - friend const twolongs& mantissa(const Fix48& f); - friend double value(const Fix48& f); - - Fix48 operator + () const; - Fix48 operator - () const; - - friend Fix48 operator + (const Fix48& f, const Fix48& g); - friend Fix48 operator - (const Fix48& f, const Fix48& g); - friend Fix48 operator * (const Fix48& f, int g); - friend Fix48 operator * (int g, const Fix48& f); - friend Fix48 operator << (const Fix48& f, int b); - friend Fix48 operator >> (const Fix48& f, int b); - - friend Fix48 operator * (const Fix24& f, const Fix24& g); - - Fix48& operator += (const Fix48& f); - Fix48& operator -= (const Fix48& f); - Fix48& operator *= (int b); - Fix48& operator <<=(int b); - Fix48& operator >>=(int b); - - friend int operator == (const Fix48& f, const Fix48& g); - friend int operator != (const Fix48& f, const Fix48& g); - friend int operator >= (const Fix48& f, const Fix48& g); - friend int operator <= (const Fix48& f, const Fix48& g); - friend int operator > (const Fix48& f, const Fix48& g); - friend int operator < (const Fix48& f, const Fix48& g); - - friend istream& operator >> (istream& s, Fix48& f); - friend ostream& operator << (ostream& s, const Fix48& f); - - void overflow(twolongs& i) const; - void range_error(twolongs& i) const; -}; - - -// active error handler declarations - -typedef void (*Fix24_peh)(_G_int32_t&); -typedef void (*Fix48_peh)(twolongs&); - -extern Fix24_peh Fix24_overflow_handler; -extern Fix48_peh Fix48_overflow_handler; - -extern Fix24_peh Fix24_range_error_handler; -extern Fix48_peh Fix48_range_error_handler; - - -// error handler declarations - -#if defined(SHORT_NAMES) || defined(VMS) -#define set_overflow_handler sohndl -#define set_range_error_handler srnghdl -#endif - -extern Fix24_peh set_Fix24_overflow_handler(Fix24_peh); -extern Fix48_peh set_Fix48_overflow_handler(Fix48_peh); -extern void set_overflow_handler(Fix24_peh, Fix48_peh); - -extern Fix24_peh set_Fix24_range_error_handler(Fix24_peh); -extern Fix48_peh set_Fix48_range_error_handler(Fix48_peh); -extern void set_range_error_handler(Fix24_peh, Fix48_peh); - -extern void - Fix24_ignore(_G_int32_t&), - Fix24_overflow_saturate(_G_int32_t&), - Fix24_overflow_warning_saturate(_G_int32_t&), - Fix24_warning(_G_int32_t&), - Fix24_abort(_G_int32_t&); - -extern void - Fix48_ignore(twolongs&), - Fix48_overflow_saturate(twolongs&), - Fix48_overflow_warning_saturate(twolongs&), - Fix48_warning(twolongs&), - Fix48_abort(twolongs&); - - -inline Fix24::~Fix24() {} - -inline Fix48::~Fix48() {} - -inline Fix24::Fix24(long i) -{ - m = i; -} - -inline Fix24::Fix24(int i) -{ - m = i; -} - -inline Fix48::Fix48(const Fix48& f) -{ - m = f.m; -} - -inline Fix24::operator double() const -{ - return Fix24_div * m; -} - -inline Fix24::Fix24() -{ - m = 0; -} - -inline Fix24::Fix24(const Fix24& f) -{ - m = f.m; -} - -inline Fix24::Fix24(double d) -{ - m = assign(d); -} - -inline Fix24::Fix24(const Fix48& f) -{ - m = f.m.u; -} - -inline Fix24& Fix24::operator=(const Fix24& f) -{ - m = f.m; - return *this; -} - -inline Fix24& Fix24::operator=(double d) -{ - m = assign(d); - return *this; -} - -inline Fix24& Fix24::operator=(const Fix48& f) -{ - m = f.m.u; - return *this; -} - -inline _G_int32_t& mantissa(Fix24& f) -{ - return f.m; -} - -inline const _G_int32_t& mantissa(const Fix24& f) -{ - return f.m; -} - -inline double value(const Fix24& f) -{ - return double(f); -} - -inline Fix24 Fix24::operator+() const -{ - return m; -} - -inline Fix24 Fix24::operator-() const -{ - return -m; -} - -inline Fix24 operator+(const Fix24& f, const Fix24& g) -{ - _G_int32_t sum = f.m + g.m; - if ( (f.m ^ sum) & (g.m ^ sum) & Fix24_msb ) - f.overflow(sum); - return sum; -} - -inline Fix24 operator-(const Fix24& f, const Fix24& g) -{ - _G_int32_t sum = f.m - g.m; - if ( (f.m ^ sum) & (-g.m ^ sum) & Fix24_msb ) - f.overflow(sum); - return sum; -} - -inline Fix24 operator*(const Fix24& a, int b) -{ - return a.m * b; -} - -inline Fix24 operator*(int b, const Fix24& a) -{ - return a * b; -} - -inline Fix24 operator<<(const Fix24& a, int b) -{ - return a.m << b; -} - -inline Fix24 operator>>(const Fix24& a, int b) -{ - return (a.m >> b) & ~0xff; -} - -inline Fix24& Fix24:: operator+=(const Fix24& f) -{ - return *this = *this + f; -} - -inline Fix24& Fix24:: operator-=(const Fix24& f) -{ - return *this = *this - f; -} - -inline Fix24& Fix24::operator*=(const Fix24& f) -{ - return *this = *this * f; -} - -inline Fix24& Fix24:: operator/=(const Fix24& f) -{ - return *this = *this / f; -} - -inline Fix24& Fix24:: operator<<=(int b) -{ - return *this = *this << b; -} - -inline Fix24& Fix24:: operator>>=(int b) -{ - return *this = *this >> b; -} - -inline Fix24& Fix24::operator*=(int b) -{ - return *this = *this * b; -} - -inline int operator==(const Fix24& f, const Fix24& g) -{ - return f.m == g.m; -} - -inline int operator!=(const Fix24& f, const Fix24& g) -{ - return f.m != g.m; -} - -inline int operator>=(const Fix24& f, const Fix24& g) -{ - return f.m >= g.m; -} - -inline int operator<=(const Fix24& f, const Fix24& g) -{ - return f.m <= g.m; -} - -inline int operator>(const Fix24& f, const Fix24& g) -{ - return f.m > g.m; -} - -inline int operator<(const Fix24& f, const Fix24& g) -{ - return f.m < g.m; -} - -inline istream& operator>>(istream& s, Fix24& f) -{ - double d; - s >> d; - f = d; - return s; -} - -inline ostream& operator<<(ostream& s, const Fix24& f) -{ - return s << double(f); -} - -inline Fix48::Fix48(twolongs i) -{ - m = i; -} - -inline Fix48:: operator double() const -{ -/* - * Note: can't simply do Fix48_div_u * m.u + Fix48_div_l * m.l, because - * m.u is signed and m.l is unsigned. - */ - return (m.u >= 0)? Fix48_div_u * m.u + Fix48_div_l * m.l : - (Fix48_div_u * ((_G_uint32_t)(m.u & 0xffffff00)) - + Fix48_div_l * m.l) - 2; -} - -inline Fix48::Fix48() -{ - m.u = 0; - m.l = 0; -} - -inline Fix48::Fix48(const Fix24& f) -{ - m.u = f.m; - m.l = 0; -} - -inline Fix48::Fix48(double d) -{ - m = assign(d); -} - -inline Fix48& Fix48::operator=(const Fix48& f) -{ - m = f.m; - return *this; -} - -inline Fix48& Fix48::operator=(const Fix24& f) -{ - m.u = f.m; - m.l = 0; - return *this; -} - -inline Fix48& Fix48::operator=(double d) -{ - m = assign(d); - return *this; -} - -inline twolongs& mantissa(Fix48& f) -{ - return f.m; -} - -inline const twolongs& mantissa(const Fix48& f) -{ - return f.m; -} - -inline double value(const Fix48& f) -{ - return double(f); -} - -inline Fix48 Fix48::operator+() const -{ - return m; -} - -inline Fix48 Fix48::operator-() const -{ - twolongs n; - n.l = -m.l; - n.u = ~m.u + ((n.l ^ m.l) & Fix24_msb ? 0 : Fix24_lsb); - return Fix48(n); -} - -inline Fix48 operator*(int b, const Fix48& a) -{ - return a * b; -} - -inline Fix48& Fix48::operator+=(const Fix48& f) -{ - return *this = *this + f; -} - -inline Fix48& Fix48::operator-=(const Fix48& f) -{ - return *this = *this - f; -} - -inline Fix48& Fix48::operator*=(int b) -{ - return *this = *this * b; -} - -inline Fix48& Fix48::operator<<=(int b) -{ - return *this = *this << b; -} - -inline Fix48& Fix48::operator>>=(int b) -{ - return *this = *this >> b; -} - -inline int operator==(const Fix48& f, const Fix48& g) -{ - return f.m.u == g.m.u && f.m.l == g.m.l; -} - -inline int operator!=(const Fix48& f, const Fix48& g) -{ - return f.m.u != g.m.u || f.m.l != g.m.l; -} - -inline int operator>=(const Fix48& f, const Fix48& g) -{ - return f.m.u >= g.m.u || (f.m.u == g.m.u && f.m.l >= g.m.l); -} - -inline int operator<=(const Fix48& f, const Fix48& g) -{ - return f.m.u <= g.m.u || (f.m.u == g.m.u && f.m.l <= g.m.l); -} - -inline int operator>(const Fix48& f, const Fix48& g) -{ - return f.m.u > g.m.u || (f.m.u == g.m.u && f.m.l > g.m.l); -} - -inline int operator<(const Fix48& f, const Fix48& g) -{ - return f.m.u < g.m.u || (f.m.u == g.m.u && f.m.l < g.m.l); -} - -inline istream& operator>>(istream& s, Fix48& f) -{ - double d; - s >> d; - f = d; - return s; -} - -inline ostream& operator<<(ostream& s, const Fix48& f) -{ - return s << double(f); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Geom.cc b/gnu/lib/libg++/libg++/src/Geom.cc deleted file mode 100644 index 3e6372e5978..00000000000 --- a/gnu/lib/libg++/libg++/src/Geom.cc +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Geom.h> - -double Geometric::operator()() -{ - int samples; - for (samples = 1; pGenerator -> asDouble() < pMean; samples++); - return((double) samples); -} - diff --git a/gnu/lib/libg++/libg++/src/Geom.h b/gnu/lib/libg++/libg++/src/Geom.h deleted file mode 100644 index 064849ab8e6..00000000000 --- a/gnu/lib/libg++/libg++/src/Geom.h +++ /dev/null @@ -1,52 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Geometric_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Geometric_h - -#include <Random.h> - -class Geometric: public Random { -protected: - double pMean; -public: - Geometric(double mean, RNG *gen); - - double mean(); - double mean(double x); - - virtual double operator()(); - -}; - - -inline Geometric::Geometric(double mean, RNG *gen) : Random(gen) -{ - pMean = mean; -} - - -inline double Geometric::mean() { return pMean; } -inline double Geometric::mean(double x) { - double tmp = pMean; pMean = x; return tmp; -} - - -#endif diff --git a/gnu/lib/libg++/libg++/src/GetOpt.cc b/gnu/lib/libg++/libg++/src/GetOpt.cc deleted file mode 100644 index 8dc54a1fe60..00000000000 --- a/gnu/lib/libg++/libg++/src/GetOpt.cc +++ /dev/null @@ -1,253 +0,0 @@ -/* -Getopt for GNU. -Copyright (C) 1987, 1989 Free Software Foundation, Inc. - -(Modified by Douglas C. Schmidt for use with GNU G++.) -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -/* AIX requires the alloca decl to be the first thing in the file. */ -#ifdef __GNUC__ -#define alloca __builtin_alloca -#elif defined(sparc) -#include <alloca.h> -extern "C" void *__builtin_alloca(...); -#elif defined(_AIX) -#pragma alloca -#else -char *alloca (); -#endif -#include <GetOpt.h> - -char* GetOpt::nextchar = 0; -int GetOpt::first_nonopt = 0; -int GetOpt::last_nonopt = 0; - -GetOpt::GetOpt (int argc, char **argv, const char *optstring) - :opterr (1), nargc (argc), nargv (argv), noptstring (optstring) -{ - /* Initialize the internal data when the first call is made. - Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - first_nonopt = last_nonopt = optind = 1; - optarg = nextchar = 0; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - ordering = RETURN_IN_ORDER; - else if (getenv ("_POSIX_OPTION_ORDER") != 0) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; -} - -void -GetOpt::exchange (char **argv) -{ - int nonopts_size - = (last_nonopt - first_nonopt) * sizeof (char *); - char **temp = (char **) alloca (nonopts_size); - - /* Interchange the two blocks of data in argv. */ - - memcpy (temp, &argv[first_nonopt], nonopts_size); - memcpy (&argv[first_nonopt], &argv[last_nonopt], - (optind - last_nonopt) * sizeof (char *)); - memcpy (&argv[first_nonopt + optind - last_nonopt], temp, - nonopts_size); - - /* Update records for the slots the non-options now occupy. */ - - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of theoption characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - A colon in OPTSTRING means that the previous character is an option - that wants an argument. The argument is taken from the rest of the - current ARGV-element, or from the following ARGV-element, - and returned in `optarg'. - - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg'. - - If OPTSTRING starts with `-', it requests a different method of handling the - non-option ARGV-elements. See the comments about RETURN_IN_ORDER, above. */ - -int -GetOpt::operator () (void) -{ - if (nextchar == 0 || *nextchar == 0) - { - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange (nargv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Now skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < nargc - && (nargv[optind][0] != '-' - || nargv[optind][1] == 0)) - optind++; - last_nonopt = optind; - } - - /* Special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != nargc && !strcmp (nargv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange (nargv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = nargc; - - optind = nargc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == nargc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if (nargv[optind][0] != '-' || nargv[optind][1] == 0) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = nargv[optind++]; - return 0; - } - - /* We have found another option-ARGV-element. - Start decoding its characters. */ - - nextchar = nargv[optind] + 1; - } - - /* Look at and handle the next option-character. */ - - { - char c = *nextchar++; - char *temp = (char *) strchr (noptstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == 0) - optind++; - - if (temp == 0 || c == ':') - { - if (opterr != 0) - { - if (c < 040 || c >= 0177) - fprintf (stderr, "%s: unrecognized option, character code 0%o\n", - nargv[0], c); - else - fprintf (stderr, "%s: unrecognized option `-%c'\n", - nargv[0], c); - } - return '?'; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != 0) - { - optarg = nextchar; - optind++; - } - else - optarg = 0; - nextchar = 0; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != 0) - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == nargc) - { - if (opterr != 0) - fprintf (stderr, "%s: no argument for `-%c' option\n", - nargv[0], c); - c = '?'; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = nargv[optind++]; - nextchar = 0; - } - } - return c; - } -} diff --git a/gnu/lib/libg++/libg++/src/GetOpt.h b/gnu/lib/libg++/libg++/src/GetOpt.h deleted file mode 100644 index c554cac8321..00000000000 --- a/gnu/lib/libg++/libg++/src/GetOpt.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Getopt for GNU. - Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. - (Modified by Douglas C. Schmidt for use with GNU G++.) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of `argv' so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable _POSIX_OPTION_ORDER disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#ifndef GetOpt_h -#ifdef __GNUG__ -#pragma interface -#endif -#define GetOpt_h 1 - -#include <std.h> -#include <stdio.h> - -class GetOpt -{ -private: - /* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - - static char *nextchar; - - - /* Describe how to deal with options that follow non-option ARGV-elements. - - UNSPECIFIED means the caller did not specify anything; - the default is then REQUIRE_ORDER if the environment variable - _OPTIONS_FIRST is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options. - Stop option processing when the first non-option is seen. - This is what Unix does. - - PERMUTE is the default. We permute the contents of `argv' as we scan, - so that eventually all the options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code zero. - Using `-' as the first character of the list of option characters - requests this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - - enum OrderingEnum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; - OrderingEnum ordering; - - /* Handle permutation of arguments. */ - - /* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - - static int first_nonopt; - static int last_nonopt; - - void exchange (char **argv); -public: - /* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - - char *optarg; - - /* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - - int optind; - - /* Callers store zero here to inhibit the error message - for unrecognized options. */ - - int opterr; - - int nargc; - char **nargv; - const char *noptstring; - - GetOpt (int argc, char **argv, const char *optstring); - int operator () (void); -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/HypGeom.cc b/gnu/lib/libg++/libg++/src/HypGeom.cc deleted file mode 100644 index a283caddbc1..00000000000 --- a/gnu/lib/libg++/libg++/src/HypGeom.cc +++ /dev/null @@ -1,30 +0,0 @@ - -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <HypGeom.h> - -double HyperGeometric::operator()() -{ - double d = (pGenerator -> asDouble() > pP) ? (1.0 - pP) : (pP); - return(-pMean * log(pGenerator -> asDouble()) / (2.0 * d) ); -} - diff --git a/gnu/lib/libg++/libg++/src/HypGeom.h b/gnu/lib/libg++/libg++/src/HypGeom.h deleted file mode 100644 index 0aeeb7d78ee..00000000000 --- a/gnu/lib/libg++/libg++/src/HypGeom.h +++ /dev/null @@ -1,70 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _HyperGeometric_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _HyperGeometric_h - -#include <Random.h> - -class HyperGeometric: public Random { -protected: - double pMean; - double pVariance; - double pP; - void setState(); - -public: - HyperGeometric(double mean, double variance, RNG *gen); - - double mean(); - double mean(double x); - double variance(); - double variance(double x); - - virtual double operator()(); -}; - - -inline void HyperGeometric::setState() { - double z = pVariance / (pMean * pMean); - pP = 0.5 * (1.0 - sqrt((z - 1.0) / ( z + 1.0 ))); -} - -inline HyperGeometric::HyperGeometric(double mean, double variance, RNG *gen) -: Random(gen) { - pMean = mean; pVariance = variance; - setState(); -} - -inline double HyperGeometric::mean() { return pMean; }; - -inline double HyperGeometric::mean(double x) { - double t = pMean; pMean = x; - setState(); return t; -} - -inline double HyperGeometric::variance() { return pVariance; } - -inline double HyperGeometric::variance(double x) { - double t = pVariance; pVariance = x; - setState(); return t; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Incremental.h b/gnu/lib/libg++/libg++/src/Incremental.h deleted file mode 100644 index 267970a8cfb..00000000000 --- a/gnu/lib/libg++/libg++/src/Incremental.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef Incremental_h -#ifdef __GNUG__ -#pragma interface -#endif -#define Incremental_h -#define DECLARE_INIT_FUNCTION(USER_INIT_FUNCTION) \ -static void USER_INIT_FUNCTION (); extern void (*_initfn)(); \ -static struct xyzzy { xyzzy () {_initfn = USER_INIT_FUNCTION;}; \ -~xyzzy () {};} __2xyzzy; -#else -#error Incremental.h was not the first file included in this module -#endif diff --git a/gnu/lib/libg++/libg++/src/Intdouble.cc b/gnu/lib/libg++/libg++/src/Intdouble.cc deleted file mode 100644 index 065175b967a..00000000000 --- a/gnu/lib/libg++/libg++/src/Intdouble.cc +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright (C) 1988, 1993 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -// Routines for converting between Integers and doubles. -// Split up into a separate file to avoid Integer.o's need -// for libm.a on some systems (including SunOS 4). - -#include <Integer.h> -#include "Integer.hP" -#include <float.h> -#include <math.h> -#include <limits.h> - -#ifndef HUGE_VAL -#ifdef HUGE -#define HUGE_VAL HUGE -#else -#define HUGE_VAL DBL_MAX -#endif -#endif - -// convert to a double - -double Itodouble(const IntRep* rep) -{ - double d = 0.0; - double bound = DBL_MAX / 2.0; - for (int i = rep->len - 1; i >= 0; --i) - { - unsigned short a = I_RADIX >> 1; - while (a != 0) - { - if (d >= bound) - return (rep->sgn == I_NEGATIVE) ? -HUGE_VAL : HUGE_VAL; - d *= 2.0; - if (rep->s[i] & a) - d += 1.0; - a >>= 1; - } - } - if (rep->sgn == I_NEGATIVE) - return -d; - else - return d; -} - -// see whether op double() will work- -// have to actually try it in order to find out -// since otherwise might trigger fp exception - -int Iisdouble(const IntRep* rep) -{ - double d = 0.0; - double bound = DBL_MAX / 2.0; - for (int i = rep->len - 1; i >= 0; --i) - { - unsigned short a = I_RADIX >> 1; - while (a != 0) - { - if (d > bound || (d == bound && (i > 0 || (rep->s[i] & a)))) - return 0; - d *= 2.0; - if (rep->s[i] & a) - d += 1.0; - a >>= 1; - } - } - return 1; -} - -// real division of num / den - -double ratio(const Integer& num, const Integer& den) -{ - Integer q, r; - divide(num, den, q, r); - double d1 = q.as_double(); - - if (d1 >= DBL_MAX || d1 <= -DBL_MAX || sign(r) == 0) - return d1; - else // use as much precision as available for fractional part - { - double d2 = 0.0; - double d3 = 0.0; - int cont = 1; - for (int i = den.rep->len - 1; i >= 0 && cont; --i) - { - unsigned short a = I_RADIX >> 1; - while (a != 0) - { - if (d2 + 1.0 == d2) // out of precision when we get here - { - cont = 0; - break; - } - - d2 *= 2.0; - if (den.rep->s[i] & a) - d2 += 1.0; - - if (i < r.rep->len) - { - d3 *= 2.0; - if (r.rep->s[i] & a) - d3 += 1.0; - } - - a >>= 1; - } - } - - if (sign(r) < 0) - d3 = -d3; - return d1 + d3 / d2; - } -} - -double -Integer::as_double () const -{ - return Itodouble (rep); -} - -int -Integer::fits_in_double () const -{ - return Iisdouble(rep); -} diff --git a/gnu/lib/libg++/libg++/src/Integer.cc b/gnu/lib/libg++/libg++/src/Integer.cc deleted file mode 100644 index 926b28ace68..00000000000 --- a/gnu/lib/libg++/libg++/src/Integer.cc +++ /dev/null @@ -1,2282 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - Some of the following algorithms are very loosely based on those from - MIT C-Scheme bignum.c, which is - Copyright (c) 1987 Massachusetts Institute of Technology - - with other guidance from Knuth, vol. 2 - - Thanks to the creators of the algorithms. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Integer.h> -#include <std.h> -#include <ctype.h> -#include <limits.h> -#include <Obstack.h> -#include <AllocRing.h> -#include <new.h> -#include <builtin.h> -#include "Integer.hP" - -#undef OK - -IntRep _ZeroRep = {1, 0, 1, {0}}; -IntRep _OneRep = {1, 0, 1, {1}}; -IntRep _MinusOneRep = {1, 0, 0, {1}}; - - -// utilities to extract and transfer bits - -// get low bits - -inline static unsigned short extract(unsigned long x) -{ - return x & I_MAXNUM; -} - -// transfer high bits to low - -inline static unsigned long down(unsigned long x) -{ - return (x >> I_SHIFT) & I_MAXNUM; -} - -// transfer low bits to high - -inline static unsigned long up(unsigned long x) -{ - return x << I_SHIFT; -} - -// compare two equal-length reps - -inline static int docmp(const unsigned short* x, const unsigned short* y, int l) -{ - int diff = 0; - const unsigned short* xs = &(x[l]); - const unsigned short* ys = &(y[l]); - while (l-- > 0 && (diff = (*--xs) - (*--ys)) == 0); - return diff; -} - -// figure out max length of result of +, -, etc. - -inline static int calc_len(int len1, int len2, int pad) -{ - return (len1 >= len2)? len1 + pad : len2 + pad; -} - -// ensure len & sgn are correct - -inline static void Icheck(IntRep* rep) -{ - int l = rep->len; - const unsigned short* p = &(rep->s[l]); - while (l > 0 && *--p == 0) --l; - if ((rep->len = l) == 0) rep->sgn = I_POSITIVE; -} - - -// zero out the end of a rep - -inline static void Iclear_from(IntRep* rep, int p) -{ - unsigned short* cp = &(rep->s[p]); - const unsigned short* cf = &(rep->s[rep->len]); - while(cp < cf) *cp++ = 0; -} - -// copy parts of a rep - -static inline void scpy(const unsigned short* src, unsigned short* dest,int nb) -{ - while (--nb >= 0) *dest++ = *src++; -} - -// make sure an argument is valid - -static inline void nonnil(const IntRep* rep) -{ - if (rep == 0) - (*lib_error_handler)("Integer", "operation on uninitialized Integer"); -} - -// allocate a new Irep. Pad to something close to a power of two. - -inline static IntRep* Inew(int newlen) -{ - unsigned int siz = sizeof(IntRep) + newlen * sizeof(short) + - MALLOC_MIN_OVERHEAD; - unsigned int allocsiz = MINIntRep_SIZE; - while (allocsiz < siz) allocsiz <<= 1; // find a power of 2 - allocsiz -= MALLOC_MIN_OVERHEAD; - if (allocsiz >= MAXIntRep_SIZE * sizeof(short)) - (*lib_error_handler)("Integer", "Requested length out of range"); - - IntRep* rep = new (operator new (allocsiz)) IntRep; - rep->sz = (allocsiz - sizeof(IntRep) + sizeof(short)) / sizeof(short); - return rep; -} - -// allocate: use the bits in src if non-null, clear the rest - -IntRep* Ialloc(IntRep* old, const unsigned short* src, int srclen, int newsgn, - int newlen) -{ - IntRep* rep; - if (old == 0 || newlen > old->sz) - rep = Inew(newlen); - else - rep = old; - - rep->len = newlen; - rep->sgn = newsgn; - - scpy(src, rep->s, srclen); - Iclear_from(rep, srclen); - - if (old != rep && old != 0 && !STATIC_IntRep(old)) delete old; - return rep; -} - -// allocate and clear - -IntRep* Icalloc(IntRep* old, int newlen) -{ - IntRep* rep; - if (old == 0 || newlen > old->sz) - { - if (old != 0 && !STATIC_IntRep(old)) delete old; - rep = Inew(newlen); - } - else - rep = old; - - rep->len = newlen; - rep->sgn = I_POSITIVE; - Iclear_from(rep, 0); - - return rep; -} - -// reallocate - -IntRep* Iresize(IntRep* old, int newlen) -{ - IntRep* rep; - unsigned short oldlen; - if (old == 0) - { - oldlen = 0; - rep = Inew(newlen); - rep->sgn = I_POSITIVE; - } - else - { - oldlen = old->len; - if (newlen > old->sz) - { - rep = Inew(newlen); - scpy(old->s, rep->s, oldlen); - rep->sgn = old->sgn; - if (!STATIC_IntRep(old)) delete old; - } - else - rep = old; - } - - rep->len = newlen; - Iclear_from(rep, oldlen); - - return rep; -} - - -// same, for straight copy - -IntRep* Icopy(IntRep* old, const IntRep* src) -{ - if (old == src) return old; - IntRep* rep; - if (src == 0) - { - if (old == 0) - rep = Inew(0); - else - { - rep = old; - Iclear_from(rep, 0); - } - rep->len = 0; - rep->sgn = I_POSITIVE; - } - else - { - int newlen = src->len; - if (old == 0 || newlen > old->sz) - { - if (old != 0 && !STATIC_IntRep(old)) delete old; - rep = Inew(newlen); - } - else - rep = old; - - rep->len = newlen; - rep->sgn = src->sgn; - - scpy(src->s, rep->s, newlen); - } - - return rep; -} - -// allocate & copy space for a long - -IntRep* Icopy_long(IntRep* old, long x) -{ - int newsgn = (x >= 0); - IntRep* rep = Icopy_ulong(old, newsgn ? x : -x); - rep->sgn = newsgn; - return rep; -} - -IntRep* Icopy_ulong(IntRep* old, unsigned long x) -{ - unsigned short src[SHORT_PER_LONG]; - - unsigned short srclen = 0; - while (x != 0) - { - src[srclen++] = extract(x); - x = down(x); - } - - IntRep* rep; - if (old == 0 || srclen > old->sz) - { - if (old != 0 && !STATIC_IntRep(old)) delete old; - rep = Inew(srclen); - } - else - rep = old; - - rep->len = srclen; - rep->sgn = I_POSITIVE; - - scpy(src, rep->s, srclen); - - return rep; -} - -// special case for zero -- it's worth it! - -IntRep* Icopy_zero(IntRep* old) -{ - if (old == 0 || STATIC_IntRep(old)) - return &_ZeroRep; - - old->len = 0; - old->sgn = I_POSITIVE; - - return old; -} - -// special case for 1 or -1 - -IntRep* Icopy_one(IntRep* old, int newsgn) -{ - if (old == 0 || 1 > old->sz) - { - if (old != 0 && !STATIC_IntRep(old)) delete old; - return newsgn==I_NEGATIVE ? &_MinusOneRep : &_OneRep; - } - - old->sgn = newsgn; - old->len = 1; - old->s[0] = 1; - - return old; -} - -// convert to a legal two's complement long if possible -// if too big, return most negative/positive value - -long Itolong(const IntRep* rep) -{ - if ((unsigned)(rep->len) > (unsigned)(SHORT_PER_LONG)) - return (rep->sgn == I_POSITIVE) ? LONG_MAX : LONG_MIN; - else if (rep->len == 0) - return 0; - else if ((unsigned)(rep->len) < (unsigned)(SHORT_PER_LONG)) - { - unsigned long a = rep->s[rep->len-1]; - if (SHORT_PER_LONG > 2) // normally optimized out - { - for (int i = rep->len - 2; i >= 0; --i) - a = up(a) | rep->s[i]; - } - return (rep->sgn == I_POSITIVE)? a : -((long)a); - } - else - { - unsigned long a = rep->s[SHORT_PER_LONG - 1]; - if (a >= I_MINNUM) - return (rep->sgn == I_POSITIVE) ? LONG_MAX : LONG_MIN; - else - { - a = up(a) | rep->s[SHORT_PER_LONG - 2]; - if (SHORT_PER_LONG > 2) - { - for (int i = SHORT_PER_LONG - 3; i >= 0; --i) - a = up(a) | rep->s[i]; - } - return (rep->sgn == I_POSITIVE)? a : -((long)a); - } - } -} - -// test whether op long() will work. -// careful about asymmetry between LONG_MIN & LONG_MAX - -int Iislong(const IntRep* rep) -{ - unsigned int l = rep->len; - if (l < SHORT_PER_LONG) - return 1; - else if (l > SHORT_PER_LONG) - return 0; - else if ((unsigned)(rep->s[SHORT_PER_LONG - 1]) < (unsigned)(I_MINNUM)) - return 1; - else if (rep->sgn == I_NEGATIVE && rep->s[SHORT_PER_LONG - 1] == I_MINNUM) - { - for (unsigned int i = 0; i < SHORT_PER_LONG - 1; ++i) - if (rep->s[i] != 0) - return 0; - return 1; - } - else - return 0; -} - -// comparison functions - -int compare(const IntRep* x, const IntRep* y) -{ - int diff = x->sgn - y->sgn; - if (diff == 0) - { - diff = x->len - y->len; - if (diff == 0) - diff = docmp(x->s, y->s, x->len); - if (x->sgn == I_NEGATIVE) - diff = -diff; - } - return diff; -} - -int ucompare(const IntRep* x, const IntRep* y) -{ - int diff = x->len - y->len; - if (diff == 0) - { - int l = x->len; - const unsigned short* xs = &(x->s[l]); - const unsigned short* ys = &(y->s[l]); - while (l-- > 0 && (diff = (*--xs) - (*--ys)) == 0); - } - return diff; -} - -int compare(const IntRep* x, long y) -{ - int xl = x->len; - int xsgn = x->sgn; - if (y == 0) - { - if (xl == 0) - return 0; - else if (xsgn == I_NEGATIVE) - return -1; - else - return 1; - } - else - { - int ysgn = y >= 0; - unsigned long uy = (ysgn)? y : -y; - int diff = xsgn - ysgn; - if (diff == 0) - { - diff = xl - SHORT_PER_LONG; - if (diff <= 0) - { - unsigned short tmp[SHORT_PER_LONG]; - int yl = 0; - while (uy != 0) - { - tmp[yl++] = extract(uy); - uy = down(uy); - } - diff = xl - yl; - if (diff == 0) - diff = docmp(x->s, tmp, xl); - } - if (xsgn == I_NEGATIVE) - diff = -diff; - } - return diff; - } -} - -int ucompare(const IntRep* x, long y) -{ - int xl = x->len; - if (y == 0) - return xl; - else - { - unsigned long uy = (y >= 0)? y : -y; - int diff = xl - SHORT_PER_LONG; - if (diff <= 0) - { - unsigned short tmp[SHORT_PER_LONG]; - int yl = 0; - while (uy != 0) - { - tmp[yl++] = extract(uy); - uy = down(uy); - } - diff = xl - yl; - if (diff == 0) - diff = docmp(x->s, tmp, xl); - } - return diff; - } -} - - - -// arithmetic functions - -IntRep* add(const IntRep* x, int negatex, - const IntRep* y, int negatey, IntRep* r) -{ - nonnil(x); - nonnil(y); - - int xl = x->len; - int yl = y->len; - - int xsgn = (negatex && xl != 0) ? !x->sgn : x->sgn; - int ysgn = (negatey && yl != 0) ? !y->sgn : y->sgn; - - int xrsame = x == r; - int yrsame = y == r; - - if (yl == 0) - r = Ialloc(r, x->s, xl, xsgn, xl); - else if (xl == 0) - r = Ialloc(r, y->s, yl, ysgn, yl); - else if (xsgn == ysgn) - { - if (xrsame || yrsame) - r = Iresize(r, calc_len(xl, yl, 1)); - else - r = Icalloc(r, calc_len(xl, yl, 1)); - r->sgn = xsgn; - unsigned short* rs = r->s; - const unsigned short* as; - const unsigned short* bs; - const unsigned short* topa; - const unsigned short* topb; - if (xl >= yl) - { - as = (xrsame)? r->s : x->s; - topa = &(as[xl]); - bs = (yrsame)? r->s : y->s; - topb = &(bs[yl]); - } - else - { - bs = (xrsame)? r->s : x->s; - topb = &(bs[xl]); - as = (yrsame)? r->s : y->s; - topa = &(as[yl]); - } - unsigned long sum = 0; - while (bs < topb) - { - sum += (unsigned long)(*as++) + (unsigned long)(*bs++); - *rs++ = extract(sum); - sum = down(sum); - } - while (sum != 0 && as < topa) - { - sum += (unsigned long)(*as++); - *rs++ = extract(sum); - sum = down(sum); - } - if (sum != 0) - *rs = extract(sum); - else if (rs != as) - while (as < topa) - *rs++ = *as++; - } - else - { - int comp = ucompare(x, y); - if (comp == 0) - r = Icopy_zero(r); - else - { - if (xrsame || yrsame) - r = Iresize(r, calc_len(xl, yl, 0)); - else - r = Icalloc(r, calc_len(xl, yl, 0)); - unsigned short* rs = r->s; - const unsigned short* as; - const unsigned short* bs; - const unsigned short* topa; - const unsigned short* topb; - if (comp > 0) - { - as = (xrsame)? r->s : x->s; - topa = &(as[xl]); - bs = (yrsame)? r->s : y->s; - topb = &(bs[yl]); - r->sgn = xsgn; - } - else - { - bs = (xrsame)? r->s : x->s; - topb = &(bs[xl]); - as = (yrsame)? r->s : y->s; - topa = &(as[yl]); - r->sgn = ysgn; - } - unsigned long hi = 1; - while (bs < topb) - { - hi += (unsigned long)(*as++) + I_MAXNUM - (unsigned long)(*bs++); - *rs++ = extract(hi); - hi = down(hi); - } - while (hi == 0 && as < topa) - { - hi = (unsigned long)(*as++) + I_MAXNUM; - *rs++ = extract(hi); - hi = down(hi); - } - if (rs != as) - while (as < topa) - *rs++ = *as++; - } - } - Icheck(r); - return r; -} - - -IntRep* add(const IntRep* x, int negatex, long y, IntRep* r) -{ - nonnil(x); - int xl = x->len; - int xsgn = (negatex && xl != 0) ? !x->sgn : x->sgn; - int xrsame = x == r; - - int ysgn = (y >= 0); - unsigned long uy = (ysgn)? y : -y; - - if (y == 0) - r = Ialloc(r, x->s, xl, xsgn, xl); - else if (xl == 0) - r = Icopy_long(r, y); - else if (xsgn == ysgn) - { - if (xrsame) - r = Iresize(r, calc_len(xl, SHORT_PER_LONG, 1)); - else - r = Icalloc(r, calc_len(xl, SHORT_PER_LONG, 1)); - r->sgn = xsgn; - unsigned short* rs = r->s; - const unsigned short* as = (xrsame)? r->s : x->s; - const unsigned short* topa = &(as[xl]); - unsigned long sum = 0; - while (as < topa && uy != 0) - { - unsigned long u = extract(uy); - uy = down(uy); - sum += (unsigned long)(*as++) + u; - *rs++ = extract(sum); - sum = down(sum); - } - while (sum != 0 && as < topa) - { - sum += (unsigned long)(*as++); - *rs++ = extract(sum); - sum = down(sum); - } - if (sum != 0) - *rs = extract(sum); - else if (rs != as) - while (as < topa) - *rs++ = *as++; - } - else - { - unsigned short tmp[SHORT_PER_LONG]; - int yl = 0; - while (uy != 0) - { - tmp[yl++] = extract(uy); - uy = down(uy); - } - int comp = xl - yl; - if (comp == 0) - comp = docmp(x->s, tmp, yl); - if (comp == 0) - r = Icopy_zero(r); - else - { - if (xrsame) - r = Iresize(r, calc_len(xl, yl, 0)); - else - r = Icalloc(r, calc_len(xl, yl, 0)); - unsigned short* rs = r->s; - const unsigned short* as; - const unsigned short* bs; - const unsigned short* topa; - const unsigned short* topb; - if (comp > 0) - { - as = (xrsame)? r->s : x->s; - topa = &(as[xl]); - bs = tmp; - topb = &(bs[yl]); - r->sgn = xsgn; - } - else - { - bs = (xrsame)? r->s : x->s; - topb = &(bs[xl]); - as = tmp; - topa = &(as[yl]); - r->sgn = ysgn; - } - unsigned long hi = 1; - while (bs < topb) - { - hi += (unsigned long)(*as++) + I_MAXNUM - (unsigned long)(*bs++); - *rs++ = extract(hi); - hi = down(hi); - } - while (hi == 0 && as < topa) - { - hi = (unsigned long)(*as++) + I_MAXNUM; - *rs++ = extract(hi); - hi = down(hi); - } - if (rs != as) - while (as < topa) - *rs++ = *as++; - } - } - Icheck(r); - return r; -} - - -IntRep* multiply(const IntRep* x, const IntRep* y, IntRep* r) -{ - nonnil(x); - nonnil(y); - int xl = x->len; - int yl = y->len; - int rl = xl + yl; - int rsgn = x->sgn == y->sgn; - int xrsame = x == r; - int yrsame = y == r; - int xysame = x == y; - - if (xl == 0 || yl == 0) - r = Icopy_zero(r); - else if (xl == 1 && x->s[0] == 1) - r = Icopy(r, y); - else if (yl == 1 && y->s[0] == 1) - r = Icopy(r, x); - else if (!(xysame && xrsame)) - { - if (xrsame || yrsame) - r = Iresize(r, rl); - else - r = Icalloc(r, rl); - unsigned short* rs = r->s; - unsigned short* topr = &(rs[rl]); - - // use best inner/outer loop params given constraints - unsigned short* currentr; - const unsigned short* bota; - const unsigned short* as; - const unsigned short* botb; - const unsigned short* topb; - if (xrsame) - { - currentr = &(rs[xl-1]); - bota = rs; - as = currentr; - botb = y->s; - topb = &(botb[yl]); - } - else if (yrsame) - { - currentr = &(rs[yl-1]); - bota = rs; - as = currentr; - botb = x->s; - topb = &(botb[xl]); - } - else if (xl <= yl) - { - currentr = &(rs[xl-1]); - bota = x->s; - as = &(bota[xl-1]); - botb = y->s; - topb = &(botb[yl]); - } - else - { - currentr = &(rs[yl-1]); - bota = y->s; - as = &(bota[yl-1]); - botb = x->s; - topb = &(botb[xl]); - } - - while (as >= bota) - { - unsigned long ai = (unsigned long)(*as--); - unsigned short* rs = currentr--; - *rs = 0; - if (ai != 0) - { - unsigned long sum = 0; - const unsigned short* bs = botb; - while (bs < topb) - { - sum += ai * (unsigned long)(*bs++) + (unsigned long)(*rs); - *rs++ = extract(sum); - sum = down(sum); - } - while (sum != 0 && rs < topr) - { - sum += (unsigned long)(*rs); - *rs++ = extract(sum); - sum = down(sum); - } - } - } - } - else // x, y, and r same; compute over diagonals - { - r = Iresize(r, rl); - unsigned short* botr = r->s; - unsigned short* topr = &(botr[rl]); - unsigned short* rs = &(botr[rl - 2]); - - const unsigned short* bota = (xrsame)? botr : x->s; - const unsigned short* loa = &(bota[xl - 1]); - const unsigned short* hia = loa; - - for (; rs >= botr; --rs) - { - const unsigned short* h = hia; - const unsigned short* l = loa; - unsigned long prod = (unsigned long)(*h) * (unsigned long)(*l); - *rs = 0; - - for(;;) - { - unsigned short* rt = rs; - unsigned long sum = prod + (unsigned long)(*rt); - *rt++ = extract(sum); - sum = down(sum); - while (sum != 0 && rt < topr) - { - sum += (unsigned long)(*rt); - *rt++ = extract(sum); - sum = down(sum); - } - if (h > l) - { - rt = rs; - sum = prod + (unsigned long)(*rt); - *rt++ = extract(sum); - sum = down(sum); - while (sum != 0 && rt < topr) - { - sum += (unsigned long)(*rt); - *rt++ = extract(sum); - sum = down(sum); - } - if (--h >= ++l) - prod = (unsigned long)(*h) * (unsigned long)(*l); - else - break; - } - else - break; - } - if (loa > bota) - --loa; - else - --hia; - } - } - r->sgn = rsgn; - Icheck(r); - return r; -} - - -IntRep* multiply(const IntRep* x, long y, IntRep* r) -{ - nonnil(x); - int xl = x->len; - - if (xl == 0 || y == 0) - r = Icopy_zero(r); - else if (y == 1) - r = Icopy(r, x); - else - { - int ysgn = y >= 0; - int rsgn = x->sgn == ysgn; - unsigned long uy = (ysgn)? y : -y; - unsigned short tmp[SHORT_PER_LONG]; - int yl = 0; - while (uy != 0) - { - tmp[yl++] = extract(uy); - uy = down(uy); - } - - int rl = xl + yl; - int xrsame = x == r; - if (xrsame) - r = Iresize(r, rl); - else - r = Icalloc(r, rl); - - unsigned short* rs = r->s; - unsigned short* topr = &(rs[rl]); - unsigned short* currentr; - const unsigned short* bota; - const unsigned short* as; - const unsigned short* botb; - const unsigned short* topb; - - if (xrsame) - { - currentr = &(rs[xl-1]); - bota = rs; - as = currentr; - botb = tmp; - topb = &(botb[yl]); - } - else if (xl <= yl) - { - currentr = &(rs[xl-1]); - bota = x->s; - as = &(bota[xl-1]); - botb = tmp; - topb = &(botb[yl]); - } - else - { - currentr = &(rs[yl-1]); - bota = tmp; - as = &(bota[yl-1]); - botb = x->s; - topb = &(botb[xl]); - } - - while (as >= bota) - { - unsigned long ai = (unsigned long)(*as--); - unsigned short* rs = currentr--; - *rs = 0; - if (ai != 0) - { - unsigned long sum = 0; - const unsigned short* bs = botb; - while (bs < topb) - { - sum += ai * (unsigned long)(*bs++) + (unsigned long)(*rs); - *rs++ = extract(sum); - sum = down(sum); - } - while (sum != 0 && rs < topr) - { - sum += (unsigned long)(*rs); - *rs++ = extract(sum); - sum = down(sum); - } - } - } - r->sgn = rsgn; - } - Icheck(r); - return r; -} - - -// main division routine - -static void do_divide(unsigned short* rs, - const unsigned short* ys, int yl, - unsigned short* qs, int ql) -{ - const unsigned short* topy = &(ys[yl]); - unsigned short d1 = ys[yl - 1]; - unsigned short d2 = ys[yl - 2]; - - int l = ql - 1; - int i = l + yl; - - for (; l >= 0; --l, --i) - { - unsigned short qhat; // guess q - if (d1 == rs[i]) - qhat = I_MAXNUM; - else - { - unsigned long lr = up((unsigned long)rs[i]) | rs[i-1]; - qhat = lr / d1; - } - - for(;;) // adjust q, use docmp to avoid overflow problems - { - unsigned short ts[3]; - unsigned long prod = (unsigned long)d2 * (unsigned long)qhat; - ts[0] = extract(prod); - prod = down(prod) + (unsigned long)d1 * (unsigned long)qhat; - ts[1] = extract(prod); - ts[2] = extract(down(prod)); - if (docmp(ts, &(rs[i-2]), 3) > 0) - --qhat; - else - break; - }; - - // multiply & subtract - - const unsigned short* yt = ys; - unsigned short* rt = &(rs[l]); - unsigned long prod = 0; - unsigned long hi = 1; - while (yt < topy) - { - prod = (unsigned long)qhat * (unsigned long)(*yt++) + down(prod); - hi += (unsigned long)(*rt) + I_MAXNUM - (unsigned long)(extract(prod)); - *rt++ = extract(hi); - hi = down(hi); - } - hi += (unsigned long)(*rt) + I_MAXNUM - (unsigned long)(down(prod)); - *rt = extract(hi); - hi = down(hi); - - // off-by-one, add back - - if (hi == 0) - { - --qhat; - yt = ys; - rt = &(rs[l]); - hi = 0; - while (yt < topy) - { - hi = (unsigned long)(*rt) + (unsigned long)(*yt++) + down(hi); - *rt++ = extract(hi); - } - *rt = 0; - } - if (qs != 0) - qs[l] = qhat; - } -} - -// divide by single digit, return remainder -// if q != 0, then keep the result in q, else just compute rem - -static int unscale(const unsigned short* x, int xl, unsigned short y, - unsigned short* q) -{ - if (xl == 0 || y == 1) - return 0; - else if (q != 0) - { - unsigned short* botq = q; - unsigned short* qs = &(botq[xl - 1]); - const unsigned short* xs = &(x[xl - 1]); - unsigned long rem = 0; - while (qs >= botq) - { - rem = up(rem) | *xs--; - unsigned long u = rem / y; - *qs-- = extract(u); - rem -= u * y; - } - int r = extract(rem); - return r; - } - else // same loop, a bit faster if just need rem - { - const unsigned short* botx = x; - const unsigned short* xs = &(botx[xl - 1]); - unsigned long rem = 0; - while (xs >= botx) - { - rem = up(rem) | *xs--; - unsigned long u = rem / y; - rem -= u * y; - } - int r = extract(rem); - return r; - } -} - - -IntRep* div(const IntRep* x, const IntRep* y, IntRep* q) -{ - nonnil(x); - nonnil(y); - int xl = x->len; - int yl = y->len; - if (yl == 0) (*lib_error_handler)("Integer", "attempted division by zero"); - - int comp = ucompare(x, y); - int xsgn = x->sgn; - int ysgn = y->sgn; - - int samesign = xsgn == ysgn; - - if (comp < 0) - q = Icopy_zero(q); - else if (comp == 0) - q = Icopy_one(q, samesign); - else if (yl == 1) - { - q = Icopy(q, x); - unscale(q->s, q->len, y->s[0], q->s); - } - else - { - IntRep* yy = 0; - IntRep* r = 0; - unsigned short prescale = (I_RADIX / (1 + y->s[yl - 1])); - if (prescale != 1 || y == q) - { - yy = multiply(y, ((long)prescale & I_MAXNUM), yy); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - yy = (IntRep*)y; - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - int ql = xl - yl + 1; - - q = Icalloc(q, ql); - do_divide(r->s, yy->s, yl, q->s, ql); - - if (yy != y && !STATIC_IntRep(yy)) delete yy; - if (!STATIC_IntRep(r)) delete r; - } - q->sgn = samesign; - Icheck(q); - return q; -} - -IntRep* div(const IntRep* x, long y, IntRep* q) -{ - nonnil(x); - int xl = x->len; - if (y == 0) (*lib_error_handler)("Integer", "attempted division by zero"); - - unsigned short ys[SHORT_PER_LONG]; - unsigned long u; - int ysgn = y >= 0; - if (ysgn) - u = y; - else - u = -y; - int yl = 0; - while (u != 0) - { - ys[yl++] = extract(u); - u = down(u); - } - - int comp = xl - yl; - if (comp == 0) comp = docmp(x->s, ys, xl); - - int xsgn = x->sgn; - int samesign = xsgn == ysgn; - - if (comp < 0) - q = Icopy_zero(q); - else if (comp == 0) - { - q = Icopy_one(q, samesign); - } - else if (yl == 1) - { - q = Icopy(q, x); - unscale(q->s, q->len, ys[0], q->s); - } - else - { - IntRep* r = 0; - unsigned short prescale = (I_RADIX / (1 + ys[yl - 1])); - if (prescale != 1) - { - unsigned long prod = (unsigned long)prescale * (unsigned long)ys[0]; - ys[0] = extract(prod); - prod = down(prod) + (unsigned long)prescale * (unsigned long)ys[1]; - ys[1] = extract(prod); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - int ql = xl - yl + 1; - - q = Icalloc(q, ql); - do_divide(r->s, ys, yl, q->s, ql); - - if (!STATIC_IntRep(r)) delete r; - } - q->sgn = samesign; - Icheck(q); - return q; -} - - -void divide(const Integer& Ix, long y, Integer& Iq, long& rem) -{ - const IntRep* x = Ix.rep; - nonnil(x); - IntRep* q = Iq.rep; - int xl = x->len; - if (y == 0) (*lib_error_handler)("Integer", "attempted division by zero"); - - unsigned short ys[SHORT_PER_LONG]; - unsigned long u; - int ysgn = y >= 0; - if (ysgn) - u = y; - else - u = -y; - int yl = 0; - while (u != 0) - { - ys[yl++] = extract(u); - u = down(u); - } - - int comp = xl - yl; - if (comp == 0) comp = docmp(x->s, ys, xl); - - int xsgn = x->sgn; - int samesign = xsgn == ysgn; - - if (comp < 0) - { - rem = Itolong(x); - q = Icopy_zero(q); - } - else if (comp == 0) - { - q = Icopy_one(q, samesign); - rem = 0; - } - else if (yl == 1) - { - q = Icopy(q, x); - rem = unscale(q->s, q->len, ys[0], q->s); - } - else - { - IntRep* r = 0; - unsigned short prescale = (I_RADIX / (1 + ys[yl - 1])); - if (prescale != 1) - { - unsigned long prod = (unsigned long)prescale * (unsigned long)ys[0]; - ys[0] = extract(prod); - prod = down(prod) + (unsigned long)prescale * (unsigned long)ys[1]; - ys[1] = extract(prod); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - int ql = xl - yl + 1; - - q = Icalloc(q, ql); - - do_divide(r->s, ys, yl, q->s, ql); - - if (prescale != 1) - { - Icheck(r); - unscale(r->s, r->len, prescale, r->s); - } - Icheck(r); - rem = Itolong(r); - if (!STATIC_IntRep(r)) delete r; - } - rem = abs(rem); - if (xsgn == I_NEGATIVE) rem = -rem; - q->sgn = samesign; - Icheck(q); - Iq.rep = q; -} - - -void divide(const Integer& Ix, const Integer& Iy, Integer& Iq, Integer& Ir) -{ - const IntRep* x = Ix.rep; - nonnil(x); - const IntRep* y = Iy.rep; - nonnil(y); - IntRep* q = Iq.rep; - IntRep* r = Ir.rep; - - int xl = x->len; - int yl = y->len; - if (yl == 0) - (*lib_error_handler)("Integer", "attempted division by zero"); - - int comp = ucompare(x, y); - int xsgn = x->sgn; - int ysgn = y->sgn; - - int samesign = xsgn == ysgn; - - if (comp < 0) - { - q = Icopy_zero(q); - r = Icopy(r, x); - } - else if (comp == 0) - { - q = Icopy_one(q, samesign); - r = Icopy_zero(r); - } - else if (yl == 1) - { - q = Icopy(q, x); - int rem = unscale(q->s, q->len, y->s[0], q->s); - r = Icopy_long(r, rem); - if (rem != 0) - r->sgn = xsgn; - } - else - { - IntRep* yy = 0; - unsigned short prescale = (I_RADIX / (1 + y->s[yl - 1])); - if (prescale != 1 || y == q || y == r) - { - yy = multiply(y, ((long)prescale & I_MAXNUM), yy); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - yy = (IntRep*)y; - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - int ql = xl - yl + 1; - - q = Icalloc(q, ql); - do_divide(r->s, yy->s, yl, q->s, ql); - - if (yy != y && !STATIC_IntRep(yy)) delete yy; - if (prescale != 1) - { - Icheck(r); - unscale(r->s, r->len, prescale, r->s); - } - } - q->sgn = samesign; - Icheck(q); - Iq.rep = q; - Icheck(r); - Ir.rep = r; -} - -IntRep* mod(const IntRep* x, const IntRep* y, IntRep* r) -{ - nonnil(x); - nonnil(y); - int xl = x->len; - int yl = y->len; - if (yl == 0) (*lib_error_handler)("Integer", "attempted division by zero"); - - int comp = ucompare(x, y); - int xsgn = x->sgn; - - if (comp < 0) - r = Icopy(r, x); - else if (comp == 0) - r = Icopy_zero(r); - else if (yl == 1) - { - int rem = unscale(x->s, xl, y->s[0], 0); - r = Icopy_long(r, rem); - if (rem != 0) - r->sgn = xsgn; - } - else - { - IntRep* yy = 0; - unsigned short prescale = (I_RADIX / (1 + y->s[yl - 1])); - if (prescale != 1 || y == r) - { - yy = multiply(y, ((long)prescale & I_MAXNUM), yy); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - yy = (IntRep*)y; - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - do_divide(r->s, yy->s, yl, 0, xl - yl + 1); - - if (yy != y && !STATIC_IntRep(yy)) delete yy; - - if (prescale != 1) - { - Icheck(r); - unscale(r->s, r->len, prescale, r->s); - } - } - Icheck(r); - return r; -} - -IntRep* mod(const IntRep* x, long y, IntRep* r) -{ - nonnil(x); - int xl = x->len; - if (y == 0) (*lib_error_handler)("Integer", "attempted division by zero"); - - unsigned short ys[SHORT_PER_LONG]; - unsigned long u; - int ysgn = y >= 0; - if (ysgn) - u = y; - else - u = -y; - int yl = 0; - while (u != 0) - { - ys[yl++] = extract(u); - u = down(u); - } - - int comp = xl - yl; - if (comp == 0) comp = docmp(x->s, ys, xl); - - int xsgn = x->sgn; - - if (comp < 0) - r = Icopy(r, x); - else if (comp == 0) - r = Icopy_zero(r); - else if (yl == 1) - { - int rem = unscale(x->s, xl, ys[0], 0); - r = Icopy_long(r, rem); - if (rem != 0) - r->sgn = xsgn; - } - else - { - unsigned short prescale = (I_RADIX / (1 + ys[yl - 1])); - if (prescale != 1) - { - unsigned long prod = (unsigned long)prescale * (unsigned long)ys[0]; - ys[0] = extract(prod); - prod = down(prod) + (unsigned long)prescale * (unsigned long)ys[1]; - ys[1] = extract(prod); - r = multiply(x, ((long)prescale & I_MAXNUM), r); - } - else - { - r = Icalloc(r, xl + 1); - scpy(x->s, r->s, xl); - } - - do_divide(r->s, ys, yl, 0, xl - yl + 1); - - if (prescale != 1) - { - Icheck(r); - unscale(r->s, r->len, prescale, r->s); - } - } - Icheck(r); - return r; -} - -IntRep* lshift(const IntRep* x, long y, IntRep* r) -{ - nonnil(x); - int xl = x->len; - if (xl == 0 || y == 0) - { - r = Icopy(r, x); - return r; - } - - int xrsame = x == r; - int rsgn = x->sgn; - - long ay = (y < 0)? -y : y; - int bw = ay / I_SHIFT; - int sw = ay % I_SHIFT; - - if (y > 0) - { - int rl = bw + xl + 1; - if (xrsame) - r = Iresize(r, rl); - else - r = Icalloc(r, rl); - - unsigned short* botr = r->s; - unsigned short* rs = &(botr[rl - 1]); - const unsigned short* botx = (xrsame)? botr : x->s; - const unsigned short* xs = &(botx[xl - 1]); - unsigned long a = 0; - while (xs >= botx) - { - a = up(a) | ((unsigned long)(*xs--) << sw); - *rs-- = extract(down(a)); - } - *rs-- = extract(a); - while (rs >= botr) - *rs-- = 0; - } - else - { - int rl = xl - bw; - if (rl < 0) - r = Icopy_zero(r); - else - { - if (xrsame) - r = Iresize(r, rl); - else - r = Icalloc(r, rl); - int rw = I_SHIFT - sw; - unsigned short* rs = r->s; - unsigned short* topr = &(rs[rl]); - const unsigned short* botx = (xrsame)? rs : x->s; - const unsigned short* xs = &(botx[bw]); - const unsigned short* topx = &(botx[xl]); - unsigned long a = (unsigned long)(*xs++) >> sw; - while (xs < topx) - { - a |= (unsigned long)(*xs++) << rw; - *rs++ = extract(a); - a = down(a); - } - *rs++ = extract(a); - if (xrsame) topr = (unsigned short*)topx; - while (rs < topr) - *rs++ = 0; - } - } - r->sgn = rsgn; - Icheck(r); - return r; -} - -IntRep* lshift(const IntRep* x, const IntRep* yy, int negatey, IntRep* r) -{ - long y = Itolong(yy); - if (negatey) - y = -y; - - return lshift(x, y, r); -} - -IntRep* bitop(const IntRep* x, const IntRep* y, IntRep* r, char op) -{ - nonnil(x); - nonnil(y); - int xl = x->len; - int yl = y->len; - int xsgn = x->sgn; - int xrsame = x == r; - int yrsame = y == r; - if (xrsame || yrsame) - r = Iresize(r, calc_len(xl, yl, 0)); - else - r = Icalloc(r, calc_len(xl, yl, 0)); - r->sgn = xsgn; - unsigned short* rs = r->s; - unsigned short* topr = &(rs[r->len]); - const unsigned short* as; - const unsigned short* bs; - const unsigned short* topb; - if (xl >= yl) - { - as = (xrsame)? rs : x->s; - bs = (yrsame)? rs : y->s; - topb = &(bs[yl]); - } - else - { - bs = (xrsame)? rs : x->s; - topb = &(bs[xl]); - as = (yrsame)? rs : y->s; - } - - switch (op) - { - case '&': - while (bs < topb) *rs++ = *as++ & *bs++; - while (rs < topr) *rs++ = 0; - break; - case '|': - while (bs < topb) *rs++ = *as++ | *bs++; - while (rs < topr) *rs++ = *as++; - break; - case '^': - while (bs < topb) *rs++ = *as++ ^ *bs++; - while (rs < topr) *rs++ = *as++; - break; - } - Icheck(r); - return r; -} - -IntRep* bitop(const IntRep* x, long y, IntRep* r, char op) -{ - nonnil(x); - unsigned short tmp[SHORT_PER_LONG]; - unsigned long u; - int newsgn; - if (newsgn = (y >= 0)) - u = y; - else - u = -y; - - int l = 0; - while (u != 0) - { - tmp[l++] = extract(u); - u = down(u); - } - - int xl = x->len; - int yl = l; - int xsgn = x->sgn; - int xrsame = x == r; - if (xrsame) - r = Iresize(r, calc_len(xl, yl, 0)); - else - r = Icalloc(r, calc_len(xl, yl, 0)); - r->sgn = xsgn; - unsigned short* rs = r->s; - unsigned short* topr = &(rs[r->len]); - const unsigned short* as; - const unsigned short* bs; - const unsigned short* topb; - if (xl >= yl) - { - as = (xrsame)? rs : x->s; - bs = tmp; - topb = &(bs[yl]); - } - else - { - bs = (xrsame)? rs : x->s; - topb = &(bs[xl]); - as = tmp; - } - - switch (op) - { - case '&': - while (bs < topb) *rs++ = *as++ & *bs++; - while (rs < topr) *rs++ = 0; - break; - case '|': - while (bs < topb) *rs++ = *as++ | *bs++; - while (rs < topr) *rs++ = *as++; - break; - case '^': - while (bs < topb) *rs++ = *as++ ^ *bs++; - while (rs < topr) *rs++ = *as++; - break; - } - Icheck(r); - return r; -} - - - -IntRep* compl(const IntRep* src, IntRep* r) -{ - nonnil(src); - r = Icopy(r, src); - unsigned short* s = r->s; - unsigned short* top = &(s[r->len - 1]); - while (s < top) - { - unsigned short cmp = ~(*s); - *s++ = cmp; - } - unsigned short a = *s; - unsigned short b = 0; - while (a != 0) - { - b <<= 1; - if (!(a & 1)) b |= 1; - a >>= 1; - } - *s = b; - Icheck(r); - return r; -} - -void (setbit)(Integer& x, long b) -{ - if (b >= 0) - { - int bw = (unsigned long)b / I_SHIFT; - int sw = (unsigned long)b % I_SHIFT; - int xl = x.rep ? x.rep->len : 0; - if (xl <= bw) - x.rep = Iresize(x.rep, calc_len(xl, bw+1, 0)); - x.rep->s[bw] |= (1 << sw); - Icheck(x.rep); - } -} - -void clearbit(Integer& x, long b) -{ - if (b >= 0) - { - if (x.rep == 0) - x.rep = &_ZeroRep; - else - { - int bw = (unsigned long)b / I_SHIFT; - int sw = (unsigned long)b % I_SHIFT; - if (x.rep->len > bw) - x.rep->s[bw] &= ~(1 << sw); - } - Icheck(x.rep); - } -} - -int testbit(const Integer& x, long b) -{ - if (x.rep != 0 && b >= 0) - { - int bw = (unsigned long)b / I_SHIFT; - int sw = (unsigned long)b % I_SHIFT; - return (bw < x.rep->len && (x.rep->s[bw] & (1 << sw)) != 0); - } - else - return 0; -} - -// A version of knuth's algorithm B / ex. 4.5.3.34 -// A better version that doesn't bother shifting all of `t' forthcoming - -IntRep* gcd(const IntRep* x, const IntRep* y) -{ - nonnil(x); - nonnil(y); - int ul = x->len; - int vl = y->len; - - if (vl == 0) - return Ialloc(0, x->s, ul, I_POSITIVE, ul); - else if (ul == 0) - return Ialloc(0, y->s, vl, I_POSITIVE, vl); - - IntRep* u = Ialloc(0, x->s, ul, I_POSITIVE, ul); - IntRep* v = Ialloc(0, y->s, vl, I_POSITIVE, vl); - -// find shift so that both not even - - long k = 0; - int l = (ul <= vl)? ul : vl; - int cont = 1; - for (int i = 0; i < l && cont; ++i) - { - unsigned long a = (i < ul)? u->s[i] : 0; - unsigned long b = (i < vl)? v->s[i] : 0; - for (int j = 0; j < I_SHIFT; ++j) - { - if ((a | b) & 1) - { - cont = 0; - break; - } - else - { - ++k; - a >>= 1; - b >>= 1; - } - } - } - - if (k != 0) - { - u = lshift(u, -k, u); - v = lshift(v, -k, v); - } - - IntRep* t; - if (u->s[0] & 01) - t = Ialloc(0, v->s, v->len, !v->sgn, v->len); - else - t = Ialloc(0, u->s, u->len, u->sgn, u->len); - - while (t->len != 0) - { - long s = 0; // shift t until odd - cont = 1; - int tl = t->len; - for (int i = 0; i < tl && cont; ++i) - { - unsigned long a = t->s[i]; - for (int j = 0; j < I_SHIFT; ++j) - { - if (a & 1) - { - cont = 0; - break; - } - else - { - ++s; - a >>= 1; - } - } - } - - if (s != 0) t = lshift(t, -s, t); - - if (t->sgn == I_POSITIVE) - { - u = Icopy(u, t); - t = add(t, 0, v, 1, t); - } - else - { - v = Ialloc(v, t->s, t->len, !t->sgn, t->len); - t = add(t, 0, u, 0, t); - } - } - if (!STATIC_IntRep(t)) delete t; - if (!STATIC_IntRep(v)) delete v; - if (k != 0) u = lshift(u, k, u); - return u; -} - - - -long lg(const IntRep* x) -{ - nonnil(x); - int xl = x->len; - if (xl == 0) - return 0; - - long l = (xl - 1) * I_SHIFT - 1; - unsigned short a = x->s[xl-1]; - - while (a != 0) - { - a = a >> 1; - ++l; - } - return l; -} - -IntRep* power(const IntRep* x, long y, IntRep* r) -{ - nonnil(x); - int sgn; - if (x->sgn == I_POSITIVE || (!(y & 1))) - sgn = I_POSITIVE; - else - sgn = I_NEGATIVE; - - int xl = x->len; - - if (y == 0 || (xl == 1 && x->s[0] == 1)) - r = Icopy_one(r, sgn); - else if (xl == 0 || y < 0) - r = Icopy_zero(r); - else if (y == 1 || y == -1) - r = Icopy(r, x); - else - { - int maxsize = ((lg(x) + 1) * y) / I_SHIFT + 2; // pre-allocate space - IntRep* b = Ialloc(0, x->s, xl, I_POSITIVE, maxsize); - b->len = xl; - r = Icalloc(r, maxsize); - r = Icopy_one(r, I_POSITIVE); - for(;;) - { - if (y & 1) - r = multiply(r, b, r); - if ((y >>= 1) == 0) - break; - else - b = multiply(b, b, b); - } - if (!STATIC_IntRep(b)) delete b; - } - r->sgn = sgn; - Icheck(r); - return r; -} - -IntRep* abs(const IntRep* src, IntRep* dest) -{ - nonnil(src); - if (src != dest) - dest = Icopy(dest, src); - dest->sgn = I_POSITIVE; - return dest; -} - -IntRep* negate(const IntRep* src, IntRep* dest) -{ - nonnil(src); - if (src != dest) - dest = Icopy(dest, src); - if (dest->len != 0) - dest->sgn = !dest->sgn; - return dest; -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -Integer sqrt(const Integer& x) return r(x) -{ - int s = sign(x); - if (s < 0) x.error("Attempted square root of negative Integer"); - if (s != 0) - { - r >>= (lg(x) / 2); // get close - Integer q; - div(x, r, q); - while (q < r) - { - r += q; - r >>= 1; - div(x, r, q); - } - } - return; -} - -Integer lcm(const Integer& x, const Integer& y) return r -{ - if (!x.initialized() || !y.initialized()) - x.error("operation on uninitialized Integer"); - Integer g; - if (sign(x) == 0 || sign(y) == 0) - g = 1; - else - g = gcd(x, y); - div(x, g, r); - mul(r, y, r); -} - -#else -Integer sqrt(const Integer& x) -{ - Integer r(x); - int s = sign(x); - if (s < 0) x.error("Attempted square root of negative Integer"); - if (s != 0) - { - r >>= (lg(x) / 2); // get close - Integer q; - div(x, r, q); - while (q < r) - { - r += q; - r >>= 1; - div(x, r, q); - } - } - return r; -} - -Integer lcm(const Integer& x, const Integer& y) -{ - Integer r; - if (!x.initialized() || !y.initialized()) - x.error("operation on uninitialized Integer"); - Integer g; - if (sign(x) == 0 || sign(y) == 0) - g = 1; - else - g = gcd(x, y); - div(x, g, r); - mul(r, y, r); - return r; -} - -#endif - - - -IntRep* atoIntRep(const char* s, int base) -{ - int sl = strlen(s); - IntRep* r = Icalloc(0, sl * (lg(base) + 1) / I_SHIFT + 1); - if (s != 0) - { - char sgn; - while (isspace(*s)) ++s; - if (*s == '-') - { - sgn = I_NEGATIVE; - s++; - } - else if (*s == '+') - { - sgn = I_POSITIVE; - s++; - } - else - sgn = I_POSITIVE; - for (;;) - { - long digit; - if (*s >= '0' && *s <= '9') digit = *s - '0'; - else if (*s >= 'a' && *s <= 'z') digit = *s - 'a' + 10; - else if (*s >= 'A' && *s <= 'Z') digit = *s - 'A' + 10; - else break; - if (digit >= base) break; - r = multiply(r, base, r); - r = add(r, 0, digit, r); - ++s; - } - r->sgn = sgn; - } - return r; -} - - - -extern AllocRing _libgxx_fmtq; - -char* Itoa(const IntRep* x, int base, int width) -{ - int fmtlen = (x->len + 1) * I_SHIFT / lg(base) + 4 + width; - char* fmtbase = (char *) _libgxx_fmtq.alloc(fmtlen); - char* f = cvtItoa(x, fmtbase, fmtlen, base, 0, width, 0, ' ', 'X', 0); - return f; -} - -ostream& operator << (ostream& s, const Integer& y) -{ -#ifdef _OLD_STREAMS - return s << Itoa(y.rep); -#else - if (s.opfx()) - { - int base = (s.flags() & ios::oct) ? 8 : (s.flags() & ios::hex) ? 16 : 10; - int width = s.width(); - y.printon(s, base, width); - } - return s; -#endif -} - -void Integer::printon(ostream& s, int base /* =10 */, int width /* =0 */) const -{ - int align_right = !(s.flags() & ios::left); - int showpos = s.flags() & ios::showpos; - int showbase = s.flags() & ios::showbase; - char fillchar = s.fill(); - char Xcase = (s.flags() & ios::uppercase)? 'X' : 'x'; - const IntRep* x = rep; - int fmtlen = (x->len + 1) * I_SHIFT / lg(base) + 4 + width; - char* fmtbase = new char[fmtlen]; - char* f = cvtItoa(x, fmtbase, fmtlen, base, showbase, width, align_right, - fillchar, Xcase, showpos); - s.write(f, fmtlen); - delete [] fmtbase; -} - -char* cvtItoa(const IntRep* x, char* fmt, int& fmtlen, int base, int showbase, - int width, int align_right, char fillchar, char Xcase, - int showpos) -{ - char* e = fmt + fmtlen - 1; - char* s = e; - *--s = 0; - - if (x->len == 0) - *--s = '0'; - else - { - IntRep* z = Icopy(0, x); - - // split division by base into two parts: - // first divide by biggest power of base that fits in an unsigned short, - // then use straight signed div/mods from there. - - // find power - int bpower = 1; - unsigned short b = base; - unsigned short maxb = I_MAXNUM / base; - while (b < maxb) - { - b *= base; - ++bpower; - } - for(;;) - { - int rem = unscale(z->s, z->len, b, z->s); - Icheck(z); - if (z->len == 0) - { - while (rem != 0) - { - char ch = rem % base; - rem /= base; - if (ch >= 10) - ch += 'a' - 10; - else - ch += '0'; - *--s = ch; - } - if (!STATIC_IntRep(z)) delete z; - break; - } - else - { - for (int i = 0; i < bpower; ++i) - { - char ch = rem % base; - rem /= base; - if (ch >= 10) - ch += 'a' - 10; - else - ch += '0'; - *--s = ch; - } - } - } - } - - if (base == 8 && showbase) - *--s = '0'; - else if (base == 16 && showbase) - { - *--s = Xcase; - *--s = '0'; - } - if (x->sgn == I_NEGATIVE) *--s = '-'; - else if (showpos) *--s = '+'; - int w = e - s - 1; - if (!align_right || w >= width) - { - while (w++ < width) - *--s = fillchar; - fmtlen = e - s - 1; - return s; - } - else - { - char* p = fmt; - for (char* t = s; *t != 0; ++t, ++p) *p = *t; - while (w++ < width) *p++ = fillchar; - *p = 0; - fmtlen = p - fmt; - return fmt; - } -} - -char* dec(const Integer& x, int width) -{ - return Itoa(x, 10, width); -} - -char* oct(const Integer& x, int width) -{ - return Itoa(x, 8, width); -} - -char* hex(const Integer& x, int width) -{ - return Itoa(x, 16, width); -} - -istream& operator >> (istream& stream, Integer& val) -{ - if (!stream.ipfx0()) - return stream; - int sign = ' '; - register streambuf* sb = stream.rdbuf(); - int base = 10; - int ndigits = 0; - register int ch = sb->sbumpc(); - while (ch != EOF && isspace(ch)) - ch = sb->sbumpc(); - if (ch == '+' || ch == '-') - { - sign = ch; - ch = sb->sbumpc(); - while (ch != EOF && isspace(ch)) - ch = sb->sbumpc(); - } - if (ch == EOF) goto eof_fail; - if (!(stream.flags() & ios::basefield)) - { - if (ch == '0') - { - ch = sb->sbumpc(); - if (ch == EOF) { } - else if (ch == 'x' || ch == 'X') - { - base = 16; - ch = sb->sbumpc(); - if (ch == EOF) goto eof_fail; - } - else - { - sb->sputbackc(ch); - base = 8; - ch = '0'; - } - } - } - else if ((stream.flags() & ios::basefield) == ios::hex) - base = 16; - else if ((stream.flags() & ios::basefield) == ios::oct) - base = 8; - - val.rep = Icopy_zero(val.rep); - - for (;;) - { - if (ch == EOF) - break; - int digit; - if (ch >= '0' && ch <= '9') - digit = ch - '0'; - else if (ch >= 'A' && ch <= 'F') - digit = ch - 'A' + 10; - else if (ch >= 'a' && ch <= 'f') - digit = ch - 'a' + 10; - else - digit = 999; - if (digit >= base) - { - sb->sputbackc(ch); - if (ndigits == 0) - goto fail; - else - goto done; - } - ndigits++; - switch (base) - { - case 8: - val <<= 3; - break; - case 16: - val <<= 4; - break; - default: - val *= base; - break; - } - val += digit; - ch = sb->sbumpc(); - } - fail: - stream.set(ios::failbit); - done: - if (sign == '-') - val.negate(); - return stream; - eof_fail: - stream.set(ios::failbit|ios::eofbit); - return stream; -} - -int Integer::OK() const -{ - if (rep != 0) - { - int l = rep->len; - int s = rep->sgn; - int v = l <= rep->sz || STATIC_IntRep(rep); // length within bounds - v &= s == 0 || s == 1; // legal sign - Icheck(rep); // and correctly adjusted - v &= rep->len == l; - v &= rep->sgn == s; - if (v) - return v; - } - error("invariant failure"); - return 0; -} - -void Integer::error(const char* msg) const -{ - (*lib_error_handler)("Integer", msg); -} - diff --git a/gnu/lib/libg++/libg++/src/Integer.h b/gnu/lib/libg++/libg++/src/Integer.h deleted file mode 100644 index b98a349272c..00000000000 --- a/gnu/lib/libg++/libg++/src/Integer.h +++ /dev/null @@ -1,1134 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _Integer_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Integer_h 1 - -#include <iostream.h> - -#undef OK - -struct IntRep // internal Integer representations -{ - unsigned short len; // current length - unsigned short sz; // allocated space (0 means static). - short sgn; // 1 means >= 0; 0 means < 0 - unsigned short s[1]; // represented as ushort array starting here -}; - -// True if REP is staticly (or manually) allocated, -// and should not be deleted by an Integer destructor. -#define STATIC_IntRep(rep) ((rep)->sz==0) - -extern IntRep* Ialloc(IntRep*, const unsigned short *, int, int, int); -extern IntRep* Icalloc(IntRep*, int); -extern IntRep* Icopy_ulong(IntRep*, unsigned long); -extern IntRep* Icopy_long(IntRep*, long); -extern IntRep* Icopy(IntRep*, const IntRep*); -extern IntRep* Iresize(IntRep*, int); -extern IntRep* add(const IntRep*, int, const IntRep*, int, IntRep*); -extern IntRep* add(const IntRep*, int, long, IntRep*); -extern IntRep* multiply(const IntRep*, const IntRep*, IntRep*); -extern IntRep* multiply(const IntRep*, long, IntRep*); -extern IntRep* lshift(const IntRep*, long, IntRep*); -extern IntRep* lshift(const IntRep*, const IntRep*, int, IntRep*); -extern IntRep* bitop(const IntRep*, const IntRep*, IntRep*, char); -extern IntRep* bitop(const IntRep*, long, IntRep*, char); -extern IntRep* power(const IntRep*, long, IntRep*); -extern IntRep* div(const IntRep*, const IntRep*, IntRep*); -extern IntRep* mod(const IntRep*, const IntRep*, IntRep*); -extern IntRep* div(const IntRep*, long, IntRep*); -extern IntRep* mod(const IntRep*, long, IntRep*); -extern IntRep* compl(const IntRep*, IntRep*); -extern IntRep* abs(const IntRep*, IntRep*); -extern IntRep* negate(const IntRep*, IntRep*); -extern IntRep* pow(const IntRep*, long); -extern IntRep* gcd(const IntRep*, const IntRep* y); -extern int compare(const IntRep*, const IntRep*); -extern int compare(const IntRep*, long); -extern int ucompare(const IntRep*, const IntRep*); -extern int ucompare(const IntRep*, long); -extern char* Itoa(const IntRep* x, int base = 10, int width = 0); -extern char* cvtItoa(const IntRep* x, char* fmt, int& fmtlen, int base, - int showbase, int width, int align_right, - char fillchar, char Xcase, int showpos); -extern IntRep* atoIntRep(const char* s, int base = 10); -extern long Itolong(const IntRep*); -extern int Iislong(const IntRep*); -extern long lg(const IntRep*); - -extern IntRep _ZeroRep, _OneRep, _MinusOneRep; - -class Integer -{ -protected: - IntRep* rep; -public: - Integer(); - Integer(int); - Integer(long); - Integer(unsigned long); - Integer(IntRep*); - Integer(const Integer&); - - ~Integer(); - Integer& operator = (const Integer&); - Integer& operator = (long); - -// unary operations to self - - Integer& operator ++ (); - Integer& operator -- (); - void negate(); // negate in-place - void abs(); // absolute-value in-place - void complement(); // bitwise complement in-place - -// assignment-based operations - - Integer& operator += (const Integer&); - Integer& operator -= (const Integer&); - Integer& operator *= (const Integer&); - Integer& operator /= (const Integer&); - Integer& operator %= (const Integer&); - Integer& operator <<=(const Integer&); - Integer& operator >>=(const Integer&); - Integer& operator &= (const Integer&); - Integer& operator |= (const Integer&); - Integer& operator ^= (const Integer&); - - Integer& operator += (long); - Integer& operator -= (long); - Integer& operator *= (long); - Integer& operator /= (long); - Integer& operator %= (long); - Integer& operator <<=(long); - Integer& operator >>=(long); - Integer& operator &= (long); - Integer& operator |= (long); - Integer& operator ^= (long); - -// (constructive binary operations are inlined below) - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) - friend Integer operator <? (const Integer& x, const Integer& y); // min - friend Integer operator >? (const Integer& x, const Integer& y); // max -#endif - -// builtin Integer functions that must be friends - - friend long lg (const Integer&); // floor log base 2 of abs(x) - friend double ratio(const Integer& x, const Integer& y); - // return x/y as a double - - friend Integer gcd(const Integer&, const Integer&); - friend int even(const Integer&); // true if even - friend int odd(const Integer&); // true if odd - friend int sign(const Integer&); // returns -1, 0, +1 - - friend void (setbit)(Integer& x, long b); // set b'th bit of x - friend void clearbit(Integer& x, long b); // clear b'th bit - friend int testbit(const Integer& x, long b); // return b'th bit - -// procedural versions of operators - - friend void abs(const Integer& x, Integer& dest); - friend void negate(const Integer& x, Integer& dest); - friend void complement(const Integer& x, Integer& dest); - - friend int compare(const Integer&, const Integer&); - friend int ucompare(const Integer&, const Integer&); - friend void add(const Integer& x, const Integer& y, Integer& dest); - friend void sub(const Integer& x, const Integer& y, Integer& dest); - friend void mul(const Integer& x, const Integer& y, Integer& dest); - friend void div(const Integer& x, const Integer& y, Integer& dest); - friend void mod(const Integer& x, const Integer& y, Integer& dest); - friend void divide(const Integer& x, const Integer& y, - Integer& q, Integer& r); -#ifndef __STRICT_ANSI__ - friend void and(const Integer& x, const Integer& y, Integer& dest); - friend void or(const Integer& x, const Integer& y, Integer& dest); - friend void xor(const Integer& x, const Integer& y, Integer& dest); -#endif - friend void lshift(const Integer& x, const Integer& y, Integer& dest); - friend void rshift(const Integer& x, const Integer& y, Integer& dest); - friend void pow(const Integer& x, const Integer& y, Integer& dest); - - friend int compare(const Integer&, long); - friend int ucompare(const Integer&, long); - friend void add(const Integer& x, long y, Integer& dest); - friend void sub(const Integer& x, long y, Integer& dest); - friend void mul(const Integer& x, long y, Integer& dest); - friend void div(const Integer& x, long y, Integer& dest); - friend void mod(const Integer& x, long y, Integer& dest); - friend void divide(const Integer& x, long y, Integer& q, long& r); -#ifndef __STRICT_ANSI__ - friend void and(const Integer& x, long y, Integer& dest); - friend void or(const Integer& x, long y, Integer& dest); - friend void xor(const Integer& x, long y, Integer& dest); -#endif - friend void lshift(const Integer& x, long y, Integer& dest); - friend void rshift(const Integer& x, long y, Integer& dest); - friend void pow(const Integer& x, long y, Integer& dest); - - friend int compare(long, const Integer&); - friend int ucompare(long, const Integer&); - friend void add(long x, const Integer& y, Integer& dest); - friend void sub(long x, const Integer& y, Integer& dest); - friend void mul(long x, const Integer& y, Integer& dest); -#ifndef __STRICT_ANSI__ - friend void and(long x, const Integer& y, Integer& dest); - friend void or(long x, const Integer& y, Integer& dest); - friend void xor(long x, const Integer& y, Integer& dest); -#endif - - friend Integer operator & (const Integer&, const Integer&); - friend Integer operator & (const Integer&, long); - friend Integer operator & (long, const Integer&); - friend Integer operator | (const Integer&, const Integer&); - friend Integer operator | (const Integer&, long); - friend Integer operator | (long, const Integer&); - friend Integer operator ^ (const Integer&, const Integer&); - friend Integer operator ^ (const Integer&, long); - friend Integer operator ^ (long, const Integer&); - -// coercion & conversion - - int fits_in_long() const { return Iislong(rep); } - int fits_in_double() const; - - long as_long() const { return Itolong(rep); } - double as_double() const; - - friend char* Itoa(const Integer& x, int base = 10, int width = 0); - friend Integer atoI(const char* s, int base = 10); - void printon(ostream& s, int base = 10, int width = 0) const; - - friend istream& operator >> (istream& s, Integer& y); - friend ostream& operator << (ostream& s, const Integer& y); - -// error detection - - int initialized() const; - void error(const char* msg) const; - int OK() const; -}; - - -// (These are declared inline) - - int operator == (const Integer&, const Integer&); - int operator == (const Integer&, long); - int operator != (const Integer&, const Integer&); - int operator != (const Integer&, long); - int operator < (const Integer&, const Integer&); - int operator < (const Integer&, long); - int operator <= (const Integer&, const Integer&); - int operator <= (const Integer&, long); - int operator > (const Integer&, const Integer&); - int operator > (const Integer&, long); - int operator >= (const Integer&, const Integer&); - int operator >= (const Integer&, long); - Integer operator - (const Integer&); - Integer operator ~ (const Integer&); - Integer operator + (const Integer&, const Integer&); - Integer operator + (const Integer&, long); - Integer operator + (long, const Integer&); - Integer operator - (const Integer&, const Integer&); - Integer operator - (const Integer&, long); - Integer operator - (long, const Integer&); - Integer operator * (const Integer&, const Integer&); - Integer operator * (const Integer&, long); - Integer operator * (long, const Integer&); - Integer operator / (const Integer&, const Integer&); - Integer operator / (const Integer&, long); - Integer operator % (const Integer&, const Integer&); - Integer operator % (const Integer&, long); - Integer operator << (const Integer&, const Integer&); - Integer operator << (const Integer&, long); - Integer operator >> (const Integer&, const Integer&); - Integer operator >> (const Integer&, long); - - Integer abs(const Integer&); // absolute value - Integer sqr(const Integer&); // square - - Integer pow(const Integer& x, const Integer& y); - Integer pow(const Integer& x, long y); - Integer Ipow(long x, long y); // x to the y as Integer - - -extern char* dec(const Integer& x, int width = 0); -extern char* oct(const Integer& x, int width = 0); -extern char* hex(const Integer& x, int width = 0); -extern Integer sqrt(const Integer&); // floor of square root -extern Integer lcm(const Integer& x, const Integer& y); // least common mult - - -typedef Integer IntTmp; // for backward compatibility - -inline Integer::Integer() :rep(&_ZeroRep) {} - -inline Integer::Integer(IntRep* r) :rep(r) {} - -inline Integer::Integer(int y) :rep(Icopy_long(0, (long)y)) {} - -inline Integer::Integer(long y) :rep(Icopy_long(0, y)) {} - -inline Integer::Integer(unsigned long y) :rep(Icopy_ulong(0, y)) {} - -inline Integer::Integer(const Integer& y) :rep(Icopy(0, y.rep)) {} - -inline Integer::~Integer() { if (rep && !STATIC_IntRep(rep)) delete rep; } - -inline Integer& Integer::operator = (const Integer& y) -{ - rep = Icopy(rep, y.rep); - return *this; -} - -inline Integer& Integer::operator = (long y) -{ - rep = Icopy_long(rep, y); - return *this; -} - -inline int Integer::initialized() const -{ - return rep != 0; -} - -// procedural versions - -inline int compare(const Integer& x, const Integer& y) -{ - return compare(x.rep, y.rep); -} - -inline int ucompare(const Integer& x, const Integer& y) -{ - return ucompare(x.rep, y.rep); -} - -inline int compare(const Integer& x, long y) -{ - return compare(x.rep, y); -} - -inline int ucompare(const Integer& x, long y) -{ - return ucompare(x.rep, y); -} - -inline int compare(long x, const Integer& y) -{ - return -compare(y.rep, x); -} - -inline int ucompare(long x, const Integer& y) -{ - return -ucompare(y.rep, x); -} - -inline void add(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = add(x.rep, 0, y.rep, 0, dest.rep); -} - -inline void sub(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = add(x.rep, 0, y.rep, 1, dest.rep); -} - -inline void mul(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = multiply(x.rep, y.rep, dest.rep); -} - -inline void div(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = div(x.rep, y.rep, dest.rep); -} - -inline void mod(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = mod(x.rep, y.rep, dest.rep); -} - -#ifndef __STRICT_ANSI__ -inline void and(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(x.rep, y.rep, dest.rep, '&'); -} - -inline void or(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(x.rep, y.rep, dest.rep, '|'); -} - -inline void xor(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(x.rep, y.rep, dest.rep, '^'); -} -#endif - -inline void lshift(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = lshift(x.rep, y.rep, 0, dest.rep); -} - -inline void rshift(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = lshift(x.rep, y.rep, 1, dest.rep); -} - -inline void pow(const Integer& x, const Integer& y, Integer& dest) -{ - dest.rep = power(x.rep, Itolong(y.rep), dest.rep); // not incorrect -} - -inline void add(const Integer& x, long y, Integer& dest) -{ - dest.rep = add(x.rep, 0, y, dest.rep); -} - -inline void sub(const Integer& x, long y, Integer& dest) -{ - dest.rep = add(x.rep, 0, -y, dest.rep); -} - -inline void mul(const Integer& x, long y, Integer& dest) -{ - dest.rep = multiply(x.rep, y, dest.rep); -} - -inline void div(const Integer& x, long y, Integer& dest) -{ - dest.rep = div(x.rep, y, dest.rep); -} - -inline void mod(const Integer& x, long y, Integer& dest) -{ - dest.rep = mod(x.rep, y, dest.rep); -} - -#ifndef __STRICT_ANSI__ -inline void and(const Integer& x, long y, Integer& dest) -{ - dest.rep = bitop(x.rep, y, dest.rep, '&'); -} - -inline void or(const Integer& x, long y, Integer& dest) -{ - dest.rep = bitop(x.rep, y, dest.rep, '|'); -} - -inline void xor(const Integer& x, long y, Integer& dest) -{ - dest.rep = bitop(x.rep, y, dest.rep, '^'); -} -#endif - -inline void lshift(const Integer& x, long y, Integer& dest) -{ - dest.rep = lshift(x.rep, y, dest.rep); -} - -inline void rshift(const Integer& x, long y, Integer& dest) -{ - dest.rep = lshift(x.rep, -y, dest.rep); -} - -inline void pow(const Integer& x, long y, Integer& dest) -{ - dest.rep = power(x.rep, y, dest.rep); -} - -inline void abs(const Integer& x, Integer& dest) -{ - dest.rep = abs(x.rep, dest.rep); -} - -inline void negate(const Integer& x, Integer& dest) -{ - dest.rep = negate(x.rep, dest.rep); -} - -inline void complement(const Integer& x, Integer& dest) -{ - dest.rep = compl(x.rep, dest.rep); -} - -inline void add(long x, const Integer& y, Integer& dest) -{ - dest.rep = add(y.rep, 0, x, dest.rep); -} - -inline void sub(long x, const Integer& y, Integer& dest) -{ - dest.rep = add(y.rep, 1, x, dest.rep); -} - -inline void mul(long x, const Integer& y, Integer& dest) -{ - dest.rep = multiply(y.rep, x, dest.rep); -} - -#ifndef __STRICT_ANSI__ -inline void and(long x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(y.rep, x, dest.rep, '&'); -} - -inline void or(long x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(y.rep, x, dest.rep, '|'); -} - -inline void xor(long x, const Integer& y, Integer& dest) -{ - dest.rep = bitop(y.rep, x, dest.rep, '^'); -} -#endif - - -// operator versions - -inline int operator == (const Integer& x, const Integer& y) -{ - return compare(x, y) == 0; -} - -inline int operator == (const Integer& x, long y) -{ - return compare(x, y) == 0; -} - -inline int operator != (const Integer& x, const Integer& y) -{ - return compare(x, y) != 0; -} - -inline int operator != (const Integer& x, long y) -{ - return compare(x, y) != 0; -} - -inline int operator < (const Integer& x, const Integer& y) -{ - return compare(x, y) < 0; -} - -inline int operator < (const Integer& x, long y) -{ - return compare(x, y) < 0; -} - -inline int operator <= (const Integer& x, const Integer& y) -{ - return compare(x, y) <= 0; -} - -inline int operator <= (const Integer& x, long y) -{ - return compare(x, y) <= 0; -} - -inline int operator > (const Integer& x, const Integer& y) -{ - return compare(x, y) > 0; -} - -inline int operator > (const Integer& x, long y) -{ - return compare(x, y) > 0; -} - -inline int operator >= (const Integer& x, const Integer& y) -{ - return compare(x, y) >= 0; -} - -inline int operator >= (const Integer& x, long y) -{ - return compare(x, y) >= 0; -} - - -inline Integer& Integer::operator += (const Integer& y) -{ - add(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator += (long y) -{ - add(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator ++ () -{ - add(*this, 1, *this); - return *this; -} - - -inline Integer& Integer::operator -= (const Integer& y) -{ - sub(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator -= (long y) -{ - sub(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator -- () -{ - add(*this, -1, *this); - return *this; -} - - - -inline Integer& Integer::operator *= (const Integer& y) -{ - mul(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator *= (long y) -{ - mul(*this, y, *this); - return *this; -} - - -inline Integer& Integer::operator &= (const Integer& y) -{ - rep = bitop(rep, y.rep, rep, '&'); - return *this; -} - -inline Integer& Integer::operator &= (long y) -{ - rep = bitop(rep, y, rep, '&'); - return *this; -} - -inline Integer& Integer::operator |= (const Integer& y) -{ - rep = bitop(rep, y.rep, rep, '|'); - return *this; -} - -inline Integer& Integer::operator |= (long y) -{ - rep = bitop(rep, y, rep, '|'); - return *this; -} - - -inline Integer& Integer::operator ^= (const Integer& y) -{ - rep = bitop(rep, y.rep, rep, '^'); - return *this; -} - -inline Integer& Integer::operator ^= (long y) -{ - rep = bitop(rep, y, rep, '^'); - return *this; -} - - - -inline Integer& Integer::operator /= (const Integer& y) -{ - div(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator /= (long y) -{ - div(*this, y, *this); - return *this; -} - - -inline Integer& Integer::operator <<= (const Integer& y) -{ - lshift(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator <<= (long y) -{ - lshift(*this, y, *this); - return *this; -} - - -inline Integer& Integer::operator >>= (const Integer& y) -{ - rshift(*this, y, *this); - return *this; -} - -inline Integer& Integer::operator >>= (long y) -{ - rshift(*this, y, *this); - return *this; -} - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) -inline Integer operator <? (const Integer& x, const Integer& y) -{ - return (compare(x.rep, y.rep) <= 0) ? x : y; -} - -inline Integer operator >? (const Integer& x, const Integer& y) -{ - return (compare(x.rep, y.rep) >= 0)? x : y; -} -#endif - - -inline void Integer::abs() -{ - ::abs(*this, *this); -} - -inline void Integer::negate() -{ - ::negate(*this, *this); -} - - -inline void Integer::complement() -{ - ::complement(*this, *this); -} - - -inline int sign(const Integer& x) -{ - return (x.rep->len == 0) ? 0 : ( (x.rep->sgn == 1) ? 1 : -1 ); -} - -inline int even(const Integer& y) -{ - return y.rep->len == 0 || !(y.rep->s[0] & 1); -} - -inline int odd(const Integer& y) -{ - return y.rep->len > 0 && (y.rep->s[0] & 1); -} - -inline char* Itoa(const Integer& y, int base, int width) -{ - return Itoa(y.rep, base, width); -} - - - -inline long lg(const Integer& x) -{ - return lg(x.rep); -} - -// constructive operations - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -inline Integer operator + (const Integer& x, const Integer& y) return r -{ - add(x, y, r); -} - -inline Integer operator + (const Integer& x, long y) return r -{ - add(x, y, r); -} - -inline Integer operator + (long x, const Integer& y) return r -{ - add(x, y, r); -} - -inline Integer operator - (const Integer& x, const Integer& y) return r -{ - sub(x, y, r); -} - -inline Integer operator - (const Integer& x, long y) return r -{ - sub(x, y, r); -} - -inline Integer operator - (long x, const Integer& y) return r -{ - sub(x, y, r); -} - -inline Integer operator * (const Integer& x, const Integer& y) return r -{ - mul(x, y, r); -} - -inline Integer operator * (const Integer& x, long y) return r -{ - mul(x, y, r); -} - -inline Integer operator * (long x, const Integer& y) return r -{ - mul(x, y, r); -} - -inline Integer sqr(const Integer& x) return r -{ - mul(x, x, r); -} - -inline Integer operator & (const Integer& x, const Integer& y) return r -{ - r.rep = bitop(x.rep, y.rep, r.rep, '&'); -} - -inline Integer operator & (const Integer& x, long y) return r -{ - r.rep = bitop(x.rep, y, r.rep, '&'); -} - -inline Integer operator & (long x, const Integer& y) return r -{ - r.rep = bitop(y.rep, x, r.rep, '&'); -} - -inline Integer operator | (const Integer& x, const Integer& y) return r -{ - r.rep = bitop(x.rep, y.rep, r.rep, '|'); -} - -inline Integer operator | (const Integer& x, long y) return r -{ - r.rep = bitop(x.rep, y, r.rep, '|'); -} - -inline Integer operator | (long x, const Integer& y) return r -{ - r.rep = bitop(y.rep, x, r.rep, '|'); -} - -inline Integer operator ^ (const Integer& x, const Integer& y) return r -{ - r.rep = bitop(x.rep, y.rep, r.rep, '^'); -} - -inline Integer operator ^ (const Integer& x, long y) return r -{ - r.rep = bitop (x.rep, y, r.rep, '^'); -} - -inline Integer operator ^ (long x, const Integer& y) return r -{ - r.rep = bitop (y.rep, x, r.rep, '^'); -} - -inline Integer operator / (const Integer& x, const Integer& y) return r -{ - div(x, y, r); -} - -inline Integer operator / (const Integer& x, long y) return r -{ - div(x, y, r); -} - -inline Integer operator % (const Integer& x, const Integer& y) return r -{ - mod(x, y, r); -} - -inline Integer operator % (const Integer& x, long y) return r -{ - mod(x, y, r); -} - -inline Integer operator << (const Integer& x, const Integer& y) return r -{ - lshift(x, y, r); -} - -inline Integer operator << (const Integer& x, long y) return r -{ - lshift(x, y, r); -} - -inline Integer operator >> (const Integer& x, const Integer& y) return r; -{ - rshift(x, y, r); -} - -inline Integer operator >> (const Integer& x, long y) return r -{ - rshift(x, y, r); -} - -inline Integer pow(const Integer& x, long y) return r -{ - pow(x, y, r); -} - -inline Integer Ipow(long x, long y) return r(x) -{ - pow(r, y, r); -} - -inline Integer pow(const Integer& x, const Integer& y) return r -{ - pow(x, y, r); -} - - - -inline Integer abs(const Integer& x) return r -{ - abs(x, r); -} - -inline Integer operator - (const Integer& x) return r -{ - negate(x, r); -} - -inline Integer operator ~ (const Integer& x) return r -{ - complement(x, r); -} - -inline Integer atoI(const char* s, int base) return r -{ - r.rep = atoIntRep(s, base); -} - -inline Integer gcd(const Integer& x, const Integer& y) return r -{ - r.rep = gcd(x.rep, y.rep); -} - -#else /* NO_NRV */ - -inline Integer operator + (const Integer& x, const Integer& y) -{ - Integer r; add(x, y, r); return r; -} - -inline Integer operator + (const Integer& x, long y) -{ - Integer r; add(x, y, r); return r; -} - -inline Integer operator + (long x, const Integer& y) -{ - Integer r; add(x, y, r); return r; -} - -inline Integer operator - (const Integer& x, const Integer& y) -{ - Integer r; sub(x, y, r); return r; -} - -inline Integer operator - (const Integer& x, long y) -{ - Integer r; sub(x, y, r); return r; -} - -inline Integer operator - (long x, const Integer& y) -{ - Integer r; sub(x, y, r); return r; -} - -inline Integer operator * (const Integer& x, const Integer& y) -{ - Integer r; mul(x, y, r); return r; -} - -inline Integer operator * (const Integer& x, long y) -{ - Integer r; mul(x, y, r); return r; -} - -inline Integer operator * (long x, const Integer& y) -{ - Integer r; mul(x, y, r); return r; -} - -inline Integer sqr(const Integer& x) -{ - Integer r; mul(x, x, r); return r; -} - -inline Integer operator & (const Integer& x, const Integer& y) -{ - Integer r; and(x, y, r); return r; -} - -inline Integer operator & (const Integer& x, long y) -{ - Integer r; and(x, y, r); return r; -} - -inline Integer operator & (long x, const Integer& y) -{ - Integer r; and(x, y, r); return r; -} - -inline Integer operator | (const Integer& x, const Integer& y) -{ - Integer r; or(x, y, r); return r; -} - -inline Integer operator | (const Integer& x, long y) -{ - Integer r; or(x, y, r); return r; -} - -inline Integer operator | (long x, const Integer& y) -{ - Integer r; or(x, y, r); return r; -} - -inline Integer operator ^ (const Integer& x, const Integer& y) -{ - Integer r; r.rep = bitop(x.rep, y.rep, r.rep, '^'); return r; -} - -inline Integer operator ^ (const Integer& x, long y) -{ - Integer r; r.rep = bitop(x.rep, y, r.rep, '^'); return r; -} - -inline Integer operator ^ (long x, const Integer& y) -{ - Integer r; r.rep = bitop(y.rep, x, r.rep, '^'); return r; -} - -inline Integer operator / (const Integer& x, const Integer& y) -{ - Integer r; div(x, y, r); return r; -} - -inline Integer operator / (const Integer& x, long y) -{ - Integer r; div(x, y, r); return r; -} - -inline Integer operator % (const Integer& x, const Integer& y) -{ - Integer r; mod(x, y, r); return r; -} - -inline Integer operator % (const Integer& x, long y) -{ - Integer r; mod(x, y, r); return r; -} - -inline Integer operator << (const Integer& x, const Integer& y) -{ - Integer r; lshift(x, y, r); return r; -} - -inline Integer operator << (const Integer& x, long y) -{ - Integer r; lshift(x, y, r); return r; -} - -inline Integer operator >> (const Integer& x, const Integer& y) -{ - Integer r; rshift(x, y, r); return r; -} - -inline Integer operator >> (const Integer& x, long y) -{ - Integer r; rshift(x, y, r); return r; -} - -inline Integer pow(const Integer& x, long y) -{ - Integer r; pow(x, y, r); return r; -} - -inline Integer Ipow(long x, long y) -{ - Integer r(x); pow(r, y, r); return r; -} - -inline Integer pow(const Integer& x, const Integer& y) -{ - Integer r; pow(x, y, r); return r; -} - - - -inline Integer abs(const Integer& x) -{ - Integer r; abs(x, r); return r; -} - -inline Integer operator - (const Integer& x) -{ - Integer r; negate(x, r); return r; -} - -inline Integer operator ~ (const Integer& x) -{ - Integer r; complement(x, r); return r; -} - -inline Integer atoI(const char* s, int base) -{ - Integer r; r.rep = atoIntRep(s, base); return r; -} - -inline Integer gcd(const Integer& x, const Integer& y) -{ - Integer r; r.rep = gcd(x.rep, y.rep); return r; -} - -#endif /* NO_NRV */ - -inline Integer& Integer::operator %= (const Integer& y) -{ - *this = *this % y; // mod(*this, y, *this) doesn't work. - return *this; -} - -inline Integer& Integer::operator %= (long y) -{ - *this = *this % y; // mod(*this, y, *this) doesn't work. - return *this; -} -#endif /* !_Integer_h */ diff --git a/gnu/lib/libg++/libg++/src/Integer.hP b/gnu/lib/libg++/libg++/src/Integer.hP deleted file mode 100644 index b8a80394265..00000000000 --- a/gnu/lib/libg++/libg++/src/Integer.hP +++ /dev/null @@ -1,30 +0,0 @@ -// Stuff used to implement the Integer class. -// WARNING: Its internals WILL change! - -/* - Sizes of shifts for multiple-precision arithmetic. - These should not be changed unless Integer representation - as unsigned shorts is changed in the implementation files. -*/ - -#define I_SHIFT (sizeof(short) * CHAR_BIT) -#define I_RADIX ((unsigned long)(1L << I_SHIFT)) -#define I_MAXNUM ((unsigned long)((I_RADIX - 1))) -#define I_MINNUM ((unsigned long)(I_RADIX >> 1)) -#define I_POSITIVE 1 -#define I_NEGATIVE 0 - -/* All routines assume SHORT_PER_LONG > 1 */ -#define SHORT_PER_LONG ((unsigned)(((sizeof(long) + sizeof(short) - 1) / sizeof(short)))) -#define CHAR_PER_LONG ((unsigned)sizeof(long)) - -/* - minimum and maximum sizes for an IntRep -*/ - -#define MINIntRep_SIZE 16 -#define MAXIntRep_SIZE I_MAXNUM - -#ifndef MALLOC_MIN_OVERHEAD -#define MALLOC_MIN_OVERHEAD 4 -#endif diff --git a/gnu/lib/libg++/libg++/src/LogNorm.cc b/gnu/lib/libg++/libg++/src/LogNorm.cc deleted file mode 100644 index 446a9fe7f84..00000000000 --- a/gnu/lib/libg++/libg++/src/LogNorm.cc +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Normal.h> - -#include <LogNorm.h> - -// -// See Simulation, Modelling & Analysis by Law & Kelton, pp260 -// -// - -double LogNormal::operator()() -{ - return exp (this->Normal::operator()() ); -} - - diff --git a/gnu/lib/libg++/libg++/src/LogNorm.h b/gnu/lib/libg++/libg++/src/LogNorm.h deleted file mode 100644 index 18fc1f11d23..00000000000 --- a/gnu/lib/libg++/libg++/src/LogNorm.h +++ /dev/null @@ -1,78 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _LogNormal_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _LogNormal_h - -#include <Normal.h> - -class LogNormal: public Normal { -protected: - double logMean; - double logVariance; - void setState(); -public: - LogNormal(double mean, double variance, RNG *gen); - double mean(); - double mean(double x); - double variance(); - double variance(double x); - virtual double operator()(); -}; - - -inline void LogNormal::setState() -{ - double m2 = logMean * logMean; - pMean = log(m2 / sqrt(logVariance + m2) ); -// from ch@heike.informatik.uni-dortmund.de: -// (was pVariance = log((sqrt(logVariance + m2)/m2 )); ) - pStdDev = sqrt(log((logVariance + m2)/m2 )); -} - -inline LogNormal::LogNormal(double mean, double variance, RNG *gen) - : Normal(mean, variance, gen) -{ - logMean = mean; - logVariance = variance; - setState(); -} - -inline double LogNormal::mean() { - return logMean; -} - -inline double LogNormal::mean(double x) -{ - double t=logMean; logMean = x; setState(); - return t; -} - -inline double LogNormal::variance() { - return logVariance; -} - -inline double LogNormal::variance(double x) -{ - double t=logVariance; logVariance = x; setState(); - return t; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/MLCG.cc b/gnu/lib/libg++/libg++/src/MLCG.cc deleted file mode 100644 index 8e624772f34..00000000000 --- a/gnu/lib/libg++/libg++/src/MLCG.cc +++ /dev/null @@ -1,103 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <MLCG.h> -// -// SEED_TABLE_SIZE must be a power of 2 -// - - -#define SEED_TABLE_SIZE 32 - -static _G_int32_t seedTable[SEED_TABLE_SIZE] = { -0xbdcc47e5, 0x54aea45d, 0xec0df859, 0xda84637b, -0xc8c6cb4f, 0x35574b01, 0x28260b7d, 0x0d07fdbf, -0x9faaeeb0, 0x613dd169, 0x5ce2d818, 0x85b9e706, -0xab2469db, 0xda02b0dc, 0x45c60d6e, 0xffe49d10, -0x7224fea3, 0xf9684fc9, 0xfc7ee074, 0x326ce92a, -0x366d13b5, 0x17aaa731, 0xeb83a675, 0x7781cb32, -0x4ec7c92d, 0x7f187521, 0x2cf346b4, 0xad13310f, -0xb89cff2b, 0x12164de1, 0xa865168d, 0x32b56cdf -}; - -MLCG::MLCG(_G_int32_t seed1, _G_int32_t seed2) -{ - initialSeedOne = seed1; - initialSeedTwo = seed2; - reset(); -} - -void -MLCG::reset() -{ - _G_int32_t seed1 = initialSeedOne; - _G_int32_t seed2 = initialSeedTwo; - - // - // Most people pick stupid seed numbers that do not have enough - // bits. In this case, if they pick a small seed number, we - // map that to a specific seed. - // - if (seed1 < 0) { - seed1 = (seed1 + 2147483561); - seed1 = (seed1 < 0) ? -seed1 : seed1; - } - - if (seed2 < 0) { - seed2 = (seed2 + 2147483561); - seed2 = (seed2 < 0) ? -seed2 : seed2; - } - - if (seed1 > -1 && seed1 < SEED_TABLE_SIZE) { - seedOne = seedTable[seed1]; - } else { - seedOne = seed1 ^ seedTable[seed1 & (SEED_TABLE_SIZE-1)]; - } - - if (seed2 > -1 && seed2 < SEED_TABLE_SIZE) { - seedTwo = seedTable[seed2]; - } else { - seedTwo = seed2 ^ seedTable[ seed2 & (SEED_TABLE_SIZE-1) ]; - } - seedOne = (seedOne % 2147483561) + 1; - seedTwo = (seedTwo % 2147483397) + 1; -} - -_G_uint32_t MLCG::asLong() -{ - _G_int32_t k = seedOne % 53668; - - seedOne = 40014 * (seedOne-k * 53668) - k * 12211; - if (seedOne < 0) { - seedOne += 2147483563; - } - - k = seedTwo % 52774; - seedTwo = 40692 * (seedTwo - k * 52774) - k * 3791; - if (seedTwo < 0) { - seedTwo += 2147483399; - } - - _G_int32_t z = seedOne - seedTwo; - if (z < 1) { - z += 2147483562; - } - return( (unsigned long) z); -} - diff --git a/gnu/lib/libg++/libg++/src/MLCG.h b/gnu/lib/libg++/libg++/src/MLCG.h deleted file mode 100644 index 0ae817cd777..00000000000 --- a/gnu/lib/libg++/libg++/src/MLCG.h +++ /dev/null @@ -1,87 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _MLCG_h -#define _MLCG_h 1 -#ifdef __GNUG__ -#pragma interface -#endif - -#include <RNG.h> -#include <math.h> - -// -// Multiplicative Linear Conguential Generator -// - -class MLCG : public RNG { - _G_int32_t initialSeedOne; - _G_int32_t initialSeedTwo; - _G_int32_t seedOne; - _G_int32_t seedTwo; - -protected: - -public: - MLCG(_G_int32_t seed1 = 0, _G_int32_t seed2 = 1); - // - // Return a long-words word of random bits - // - virtual _G_uint32_t asLong(); - virtual void reset(); - _G_int32_t seed1(); - void seed1(_G_int32_t); - _G_int32_t seed2(); - void seed2(_G_int32_t); - void reseed(_G_int32_t, _G_int32_t); -}; - -inline _G_int32_t -MLCG::seed1() -{ - return(seedOne); -} - -inline void -MLCG::seed1(_G_int32_t s) -{ - initialSeedOne = s; - reset(); -} - -inline _G_int32_t -MLCG::seed2() -{ - return(seedTwo); -} - -inline void -MLCG::seed2(_G_int32_t s) -{ - initialSeedTwo = s; - reset(); -} - -inline void -MLCG::reseed(_G_int32_t s1, _G_int32_t s2) -{ - initialSeedOne = s1; - initialSeedTwo = s2; - reset(); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/NegExp.cc b/gnu/lib/libg++/libg++/src/NegExp.cc deleted file mode 100644 index f07769aff60..00000000000 --- a/gnu/lib/libg++/libg++/src/NegExp.cc +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <NegExp.h> - -double NegativeExpntl::operator()() -{ - return(-pMean * log(pGenerator -> asDouble())); -} - diff --git a/gnu/lib/libg++/libg++/src/NegExp.h b/gnu/lib/libg++/libg++/src/NegExp.h deleted file mode 100644 index 08f17afde95..00000000000 --- a/gnu/lib/libg++/libg++/src/NegExp.h +++ /dev/null @@ -1,55 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _NegativeExpntl_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _NegativeExpntl_h 1 - - -// -// Negative Exponential Random Numbers -// -// - -#include <Random.h> - -class NegativeExpntl: public Random { -protected: - double pMean; -public: - NegativeExpntl(double xmean, RNG *gen); - double mean(); - double mean(double x); - - virtual double operator()(); -}; - - -inline NegativeExpntl::NegativeExpntl(double xmean, RNG *gen) -: Random(gen) { - pMean = xmean; -} - -inline double NegativeExpntl::mean() { return pMean; } -inline double NegativeExpntl::mean(double x) { - double t = pMean; pMean = x; - return t; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Normal.cc b/gnu/lib/libg++/libg++/src/Normal.cc deleted file mode 100644 index 29219b4a730..00000000000 --- a/gnu/lib/libg++/libg++/src/Normal.cc +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Normal.h> -// -// See Simulation, Modelling & Analysis by Law & Kelton, pp259 -// -// This is the ``polar'' method. -// - -double Normal::operator()() -{ - - if (haveCachedNormal == 1) { - haveCachedNormal = 0; - return(cachedNormal * pStdDev + pMean ); - } else { - - for(;;) { - double u1 = pGenerator -> asDouble(); - double u2 = pGenerator -> asDouble(); - double v1 = 2 * u1 - 1; - double v2 = 2 * u2 - 1; - double w = (v1 * v1) + (v2 * v2); - -// -// We actually generate two IID normal distribution variables. -// We cache the one & return the other. -// - if (w <= 1) { - double y = sqrt( (-2 * log(w)) / w); - double x1 = v1 * y; - double x2 = v2 * y; - - haveCachedNormal = 1; - cachedNormal = x2; - return(x1 * pStdDev + pMean); - } - } - } -} - diff --git a/gnu/lib/libg++/libg++/src/Normal.h b/gnu/lib/libg++/libg++/src/Normal.h deleted file mode 100644 index 5e19f7ae606..00000000000 --- a/gnu/lib/libg++/libg++/src/Normal.h +++ /dev/null @@ -1,66 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Normal_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Normal_h - -#include <Random.h> - -class Normal: public Random { - char haveCachedNormal; - double cachedNormal; - -protected: - double pMean; - double pVariance; - double pStdDev; - -public: - Normal(double xmean, double xvariance, RNG *gen); - double mean(); - double mean(double x); - double variance(); - double variance(double x); - virtual double operator()(); -}; - - -inline Normal::Normal(double xmean, double xvariance, RNG *gen) -: Random(gen) { - pMean = xmean; - pVariance = xvariance; - pStdDev = sqrt(pVariance); - haveCachedNormal = 0; -} - -inline double Normal::mean() { return pMean; }; -inline double Normal::mean(double x) { - double t=pMean; pMean = x; - return t; -} - -inline double Normal::variance() { return pVariance; } -inline double Normal::variance(double x) { - double t=pVariance; pVariance = x; - pStdDev = sqrt(pVariance); - return t; -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/Obstack.cc b/gnu/lib/libg++/libg++/src/Obstack.cc deleted file mode 100644 index abef732979f..00000000000 --- a/gnu/lib/libg++/libg++/src/Obstack.cc +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <limits.h> -#include <builtin.h> -#include <Obstack.h> -#include <new.h> - -/* We use subtraction of (char *)0 instead of casting to int - because on word-addressable machines a simple cast to int - may ignore the byte-within-word field of the pointer. */ - -#ifndef __PTR_TO_INT -#define __PTR_TO_INT(P) ((P) - (char *)0) -#endif - -#ifndef __INT_TO_PTR -#define __INT_TO_PTR(P) ((P) + (char *)0) -#endif - -Obstack::Obstack(int size, int alignment) -{ - alignmentmask = alignment - 1; - chunksize = size; - chunk = 0; - nextfree = objectbase = 0; - chunklimit = 0; -} - -void Obstack::_free(void* obj) -{ - _obstack_chunk* lp; - _obstack_chunk* plp; - - lp = chunk; - while (lp != 0 && ((void*)lp > obj || (void*)(lp)->limit < obj)) - { - plp = lp -> prev; - delete [] (char*)lp; - lp = plp; - } - if (lp) - { - objectbase = nextfree = (char *)(obj); - chunklimit = lp->limit; - chunk = lp; - } - else if (obj != 0) - (*lib_error_handler)("Obstack", "deletion of nonexistent obj"); -} - -void Obstack::newchunk(int size) -{ - _obstack_chunk* old_chunk = chunk; - _obstack_chunk* new_chunk; - long new_size; - int obj_size = nextfree - objectbase; - - new_size = (obj_size + size) << 1; - if (new_size < chunksize) - new_size = chunksize; - - new_chunk = chunk = new (operator new (new_size)) _obstack_chunk; - new_chunk->prev = old_chunk; - new_chunk->limit = chunklimit = (char *) new_chunk + new_size; - - memcpy((void*)new_chunk->contents, (void*)objectbase, obj_size); - objectbase = new_chunk->contents; - nextfree = objectbase + obj_size; -} - -void* Obstack::finish() -{ - void* value = (void*) objectbase; - nextfree = __INT_TO_PTR (__PTR_TO_INT (nextfree + alignmentmask) - & ~alignmentmask); - if (nextfree - (char*)chunk > chunklimit - (char*)chunk) - nextfree = chunklimit; - objectbase = nextfree; - return value; -} - -int Obstack::contains(void* obj) // true if obj somewhere in Obstack -{ - _obstack_chunk* ch; - for (ch = chunk; - ch != 0 && (obj < (void*)ch || obj >= (void*)(ch->limit)); - ch = ch->prev); - - return ch != 0; -} - -int Obstack::OK() -{ - int v = chunksize > 0; // valid size - v &= alignmentmask != 0; // and alignment - v &= chunk != 0; - v &= objectbase >= chunk->contents; - v &= nextfree >= objectbase; - v &= nextfree <= chunklimit; - v &= chunklimit == chunk->limit; - _obstack_chunk* p = chunk; - // allow lots of chances to find bottom! - long x = LONG_MAX; - while (p != 0 && x != 0) { --x; p = p->prev; } - v &= x > 0; - if (!v) - (*lib_error_handler)("Obstack", "invariant failure"); - return v; -} diff --git a/gnu/lib/libg++/libg++/src/Obstack.h b/gnu/lib/libg++/libg++/src/Obstack.h deleted file mode 100644 index 8dd9d09c91b..00000000000 --- a/gnu/lib/libg++/libg++/src/Obstack.h +++ /dev/null @@ -1,218 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -#ifndef _Obstack_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Obstack_h 1 - -#include <std.h> - -#undef OK - -class Obstack -{ - struct _obstack_chunk - { - char* limit; - _obstack_chunk* prev; - char contents[4]; - }; - -protected: - long chunksize; - _obstack_chunk* chunk; - char* objectbase; - char* nextfree; - char* chunklimit; - int alignmentmask; - - void _free(void* obj); - void newchunk(int size); - -public: - Obstack(int size = 4080, int alignment = 4); // 4080=4096-mallocslop - - ~Obstack(); - - void* base(); - void* next_free(); - int alignment_mask(); - int chunk_size(); - int size(); - int room(); - int contains(void* p); // does Obstack hold pointer p? - - void grow(const void* data, int size); - void grow(const void* data, int size, char terminator); - void grow(const char* s); - void grow(char c); - void grow_fast(char c); - void blank(int size); - void blank_fast(int size); - - void* finish(); - void* finish(char terminator); - - void* copy(const void* data, int size); - void* copy(const void* data, int size, char terminator); - void* copy(const char* s); - void* copy(char c); - void* alloc(int size); - - void free(void* obj); - void shrink(int size = 1); // suggested by ken@cs.rochester.edu - - int OK(); // rep invariant -}; - - -inline Obstack::~Obstack() -{ - _free(0); -} - -inline void* Obstack::base() -{ - return objectbase; -} - -inline void* Obstack::next_free() -{ - return nextfree; -} - -inline int Obstack::alignment_mask() -{ - return alignmentmask; -} - -inline int Obstack::chunk_size() -{ - return chunksize; -} - -inline int Obstack::size() -{ - return nextfree - objectbase; -} - -inline int Obstack::room() -{ - return chunklimit - nextfree; -} - -inline void Obstack:: grow(const void* data, int size) -{ - if (nextfree+size > chunklimit) - newchunk(size); - memcpy(nextfree, data, size); - nextfree += size; -} - -inline void Obstack:: grow(const void* data, int size, char terminator) -{ - if (nextfree+size+1 > chunklimit) - newchunk(size+1); - memcpy(nextfree, data, size); - nextfree += size; - *(nextfree)++ = terminator; -} - -inline void Obstack:: grow(const char* s) -{ - grow((const void*)s, strlen(s), 0); -} - -inline void Obstack:: grow(char c) -{ - if (nextfree+1 > chunklimit) - newchunk(1); - *(nextfree)++ = c; -} - -inline void Obstack:: blank(int size) -{ - if (nextfree+size > chunklimit) - newchunk(size); - nextfree += size; -} - -inline void* Obstack::finish(char terminator) -{ - grow(terminator); - return finish(); -} - -inline void* Obstack::copy(const void* data, int size) -{ - grow (data, size); - return finish(); -} - -inline void* Obstack::copy(const void* data, int size, char terminator) -{ - grow(data, size, terminator); - return finish(); -} - -inline void* Obstack::copy(const char* s) -{ - grow((const void*)s, strlen(s), 0); - return finish(); -} - -inline void* Obstack::copy(char c) -{ - grow(c); - return finish(); -} - -inline void* Obstack::alloc(int size) -{ - blank(size); - return finish(); -} - -inline void Obstack:: free(void* obj) -{ - if (obj >= (void*)chunk && obj<(void*)chunklimit) - nextfree = objectbase = (char *) obj; - else - _free(obj); -} - -inline void Obstack:: grow_fast(char c) -{ - *(nextfree)++ = c; -} - -inline void Obstack:: blank_fast(int size) -{ - nextfree += size; -} - -inline void Obstack:: shrink(int size) // from ken@cs.rochester.edu -{ - if (nextfree >= objectbase + size) - nextfree -= size; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Pix.h b/gnu/lib/libg++/libg++/src/Pix.h deleted file mode 100644 index be90525c631..00000000000 --- a/gnu/lib/libg++/libg++/src/Pix.h +++ /dev/null @@ -1,5 +0,0 @@ - -#ifndef _Pix_h -#define _Pix_h 1 -typedef void* Pix; -#endif diff --git a/gnu/lib/libg++/libg++/src/Poisson.cc b/gnu/lib/libg++/libg++/src/Poisson.cc deleted file mode 100644 index b7fac8f5ca3..00000000000 --- a/gnu/lib/libg++/libg++/src/Poisson.cc +++ /dev/null @@ -1,36 +0,0 @@ - -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Poisson.h> - -double Poisson::operator()() -{ - double bound = exp(-1.0 * pMean); - int count = 0; - - for (double product = 1.0; - product >= bound; - product *= pGenerator -> asDouble()) { - count++; - } - return(count - 1); -} diff --git a/gnu/lib/libg++/libg++/src/Poisson.h b/gnu/lib/libg++/libg++/src/Poisson.h deleted file mode 100644 index 2566de5aa50..00000000000 --- a/gnu/lib/libg++/libg++/src/Poisson.h +++ /dev/null @@ -1,51 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Poisson_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Poisson_h - -#include <Random.h> - -class Poisson: public Random { -protected: - double pMean; -public: - Poisson(double mean, RNG *gen); - - double mean(); - double mean(double x); - - virtual double operator()(); -}; - - -inline Poisson::Poisson(double mean, RNG *gen) -: Random(gen) { - pMean = mean; -} - -inline double Poisson::mean() { return pMean; } -inline double Poisson::mean(double x) { - double t = pMean; - pMean = x; - return t; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/RNG.cc b/gnu/lib/libg++/libg++/src/RNG.cc deleted file mode 100644 index 81f55a07f8c..00000000000 --- a/gnu/lib/libg++/libg++/src/RNG.cc +++ /dev/null @@ -1,131 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1989 Free Software Foundation - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <assert.h> -#include <builtin.h> -#include <RNG.h> - -// These two static fields get initialized by RNG::RNG(). -PrivateRNGSingleType RNG::singleMantissa; -PrivateRNGDoubleType RNG::doubleMantissa; - -// -// The scale constant is 2^-31. It is used to scale a 31 bit -// long to a double. -// - -//static const double randomDoubleScaleConstant = 4.656612873077392578125e-10; -//static const float randomFloatScaleConstant = 4.656612873077392578125e-10; - -static char initialized = 0; - -RNG::RNG() -{ - if (!initialized) - { - - assert (sizeof(double) == 2 * sizeof(_G_uint32_t)); - - // - // The following is a hack that I attribute to - // Andres Nowatzyk at CMU. The intent of the loop - // is to form the smallest number 0 <= x < 1.0, - // which is then used as a mask for two longwords. - // this gives us a fast way way to produce double - // precision numbers from longwords. - // - // I know that this works for IEEE and VAX floating - // point representations. - // - // A further complication is that gnu C will blow - // the following loop, unless compiled with -ffloat-store, - // because it uses extended representations for some of - // of the comparisons. Thus, we have the following hack. - // If we could specify #pragma optimize, we wouldn't need this. - // - - PrivateRNGDoubleType t; - PrivateRNGSingleType s; - -#if _IEEE == 1 - - t.d = 1.5; - if ( t.u[1] == 0 ) { // sun word order? - t.u[0] = 0x3fffffff; - t.u[1] = 0xffffffff; - } - else { - t.u[0] = 0xffffffff; // encore word order? - t.u[1] = 0x3fffffff; - } - - s.u = 0x3fffffff; -#else - volatile double x = 1.0; // volatile needed when fp hardware used, - // and has greater precision than memory doubles - double y = 0.5; - do { // find largest fp-number < 2.0 - t.d = x; - x += y; - y *= 0.5; - } while (x != t.d && x < 2.0); - - volatile float xx = 1.0; // volatile needed when fp hardware used, - // and has greater precision than memory floats - float yy = 0.5; - do { // find largest fp-number < 2.0 - s.s = xx; - xx += yy; - yy *= 0.5; - } while (xx != s.s && xx < 2.0); -#endif - // set doubleMantissa to 1 for each doubleMantissa bit - doubleMantissa.d = 1.0; - doubleMantissa.u[0] ^= t.u[0]; - doubleMantissa.u[1] ^= t.u[1]; - - // set singleMantissa to 1 for each singleMantissa bit - singleMantissa.s = 1.0; - singleMantissa.u ^= s.u; - - initialized = 1; - } -} - -float RNG::asFloat() -{ - PrivateRNGSingleType result; - result.s = 1.0; - result.u |= (asLong() & singleMantissa.u); - result.s -= 1.0; - assert( result.s < 1.0 && result.s >= 0); - return( result.s ); -} - -double RNG::asDouble() -{ - PrivateRNGDoubleType result; - result.d = 1.0; - result.u[0] |= (asLong() & doubleMantissa.u[0]); - result.u[1] |= (asLong() & doubleMantissa.u[1]); - result.d -= 1.0; - assert( result.d < 1.0 && result.d >= 0); - return( result.d ); -} - diff --git a/gnu/lib/libg++/libg++/src/RNG.h b/gnu/lib/libg++/libg++/src/RNG.h deleted file mode 100644 index cb3fbfb1732..00000000000 --- a/gnu/lib/libg++/libg++/src/RNG.h +++ /dev/null @@ -1,58 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _RNG_h -#define _RNG_h 1 -#ifdef __GNUG__ -#pragma interface -#endif - -#include <assert.h> -#include <math.h> -#include <_G_config.h> - -union PrivateRNGSingleType { // used to access floats as unsigneds - float s; - _G_uint32_t u; -}; - -union PrivateRNGDoubleType { // used to access doubles as unsigneds - double d; - _G_uint32_t u[2]; -}; - -// -// Base class for Random Number Generators. See ACG and MLCG for instances. -// -class RNG { - static PrivateRNGSingleType singleMantissa; // mantissa bit vector - static PrivateRNGDoubleType doubleMantissa; // mantissa bit vector -public: - RNG(); - // - // Return a long-words word of random bits - // - virtual _G_uint32_t asLong() = 0; - virtual void reset() = 0; - // - // Return random bits converted to either a float or a double - // - float asFloat(); - double asDouble(); -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/Random.cc b/gnu/lib/libg++/libg++/src/Random.cc deleted file mode 100644 index 572a602cf7a..00000000000 --- a/gnu/lib/libg++/libg++/src/Random.cc +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Random.h> diff --git a/gnu/lib/libg++/libg++/src/Random.h b/gnu/lib/libg++/libg++/src/Random.h deleted file mode 100644 index 2a6d0ee54a3..00000000000 --- a/gnu/lib/libg++/libg++/src/Random.h +++ /dev/null @@ -1,54 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Random_h -#define _Random_h 1 -#ifdef __GNUG__ -#pragma interface -#endif - -#include <math.h> -#include <RNG.h> - -class Random { -protected: - RNG *pGenerator; -public: - Random(RNG *generator); - virtual double operator()() = 0; - - RNG *generator(); - void generator(RNG *p); -}; - - -inline Random::Random(RNG *gen) -{ - pGenerator = gen; -} - -inline RNG *Random::generator() -{ - return(pGenerator); -} - -inline void Random::generator(RNG *p) -{ - pGenerator = p; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Rational.cc b/gnu/lib/libg++/libg++/src/Rational.cc deleted file mode 100644 index 07bcd4f1d17..00000000000 --- a/gnu/lib/libg++/libg++/src/Rational.cc +++ /dev/null @@ -1,416 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Rational.h> -#include <std.h> -#include <math.h> -#include <builtin.h> -#include <float.h> - -#undef OK - -void Rational::error(const char* msg) const -{ - (*lib_error_handler)("Rational", msg); -} - -static const Integer _Int_One(1); - -void Rational::normalize() -{ - int s = sign(den); - if (s == 0) - error("Zero denominator."); - else if (s < 0) - { - den.negate(); - num.negate(); - } - - Integer g = gcd(num, den); - if (ucompare(g, _Int_One) != 0) - { - num /= g; - den /= g; - } -} - -void add(const Rational& x, const Rational& y, Rational& r) -{ - if (&r != &x && &r != &y) - { - mul(x.num, y.den, r.num); - mul(x.den, y.num, r.den); - add(r.num, r.den, r.num); - mul(x.den, y.den, r.den); - } - else - { - Integer tmp; - mul(x.den, y.num, tmp); - mul(x.num, y.den, r.num); - add(r.num, tmp, r.num); - mul(x.den, y.den, r.den); - } - r.normalize(); -} - -void sub(const Rational& x, const Rational& y, Rational& r) -{ - if (&r != &x && &r != &y) - { - mul(x.num, y.den, r.num); - mul(x.den, y.num, r.den); - sub(r.num, r.den, r.num); - mul(x.den, y.den, r.den); - } - else - { - Integer tmp; - mul(x.den, y.num, tmp); - mul(x.num, y.den, r.num); - sub(r.num, tmp, r.num); - mul(x.den, y.den, r.den); - } - r.normalize(); -} - -void mul(const Rational& x, const Rational& y, Rational& r) -{ - mul(x.num, y.num, r.num); - mul(x.den, y.den, r.den); - r.normalize(); -} - -void div(const Rational& x, const Rational& y, Rational& r) -{ - if (&r != &x && &r != &y) - { - mul(x.num, y.den, r.num); - mul(x.den, y.num, r.den); - } - else - { - Integer tmp; - mul(x.num, y.den, tmp); - mul(y.num, x.den, r.den); - r.num = tmp; - } - r.normalize(); -} - - - - -void Rational::invert() -{ - Integer tmp = num; - num = den; - den = tmp; - int s = sign(den); - if (s == 0) - error("Zero denominator."); - else if (s < 0) - { - den.negate(); - num.negate(); - } -} - -int compare(const Rational& x, const Rational& y) -{ - int xsgn = sign(x.num); - int ysgn = sign(y.num); - int d = xsgn - ysgn; - if (d == 0 && xsgn != 0) d = compare(x.num * y.den, x.den * y.num); - return d; -} - -Rational::Rational(double x) -{ - num = 0; - den = 1; - if (x != 0.0) - { - int neg = x < 0; - if (neg) - x = -x; - - const long shift = 15; // a safe shift per step - const double width = 32768.0; // = 2^shift - const int maxiter = 20; // ought not be necessary, but just in case, - // max 300 bits of precision - int expt; - double mantissa = frexp(x, &expt); - long exponent = expt; - double intpart; - int k = 0; - while (mantissa != 0.0 && k++ < maxiter) - { - mantissa *= width; - mantissa = modf(mantissa, &intpart); - num <<= shift; - num += (long)intpart; - exponent -= shift; - } - if (exponent > 0) - num <<= exponent; - else if (exponent < 0) - den <<= -exponent; - if (neg) - num.negate(); - } - normalize(); -} - - -Integer trunc(const Rational& x) -{ - return x.num / x.den ; -} - - -Rational pow(const Rational& x, const Integer& y) -{ - long yy = y.as_long(); - return pow(x, yy); -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -Rational operator - (const Rational& x) return r(x) -{ - r.negate(); -} - -Rational abs(const Rational& x) return r(x) -{ - if (sign(r.num) < 0) r.negate(); -} - - -Rational sqr(const Rational& x) return r -{ - mul(x.num, x.num, r.num); - mul(x.den, x.den, r.den); - r.normalize(); -} - -Integer floor(const Rational& x) return q -{ - Integer r; - divide(x.num, x.den, q, r); - if (sign(x.num) < 0 && sign(r) != 0) --q; -} - -Integer ceil(const Rational& x) return q -{ - Integer r; - divide(x.num, x.den, q, r); - if (sign(x.num) >= 0 && sign(r) != 0) ++q; -} - -Integer round(const Rational& x) return q -{ - Integer r; - divide(x.num, x.den, q, r); - r <<= 1; - if (ucompare(r, x.den) >= 0) - { - if (sign(x.num) >= 0) - ++q; - else - --q; - } -} - -// power: no need to normalize since num & den already relatively prime - -Rational pow(const Rational& x, long y) return r -{ - if (y >= 0) - { - pow(x.num, y, r.num); - pow(x.den, y, r.den); - } - else - { - y = -y; - pow(x.num, y, r.den); - pow(x.den, y, r.num); - if (sign(r.den) < 0) - { - r.num.negate(); - r.den.negate(); - } - } -} - -#else - -Rational operator - (const Rational& x) -{ - Rational r(x); r.negate(); return r; -} - -Rational abs(const Rational& x) -{ - Rational r(x); - if (sign(r.num) < 0) r.negate(); - return r; -} - - -Rational sqr(const Rational& x) -{ - Rational r; - mul(x.num, x.num, r.num); - mul(x.den, x.den, r.den); - r.normalize(); - return r; -} - -Integer floor(const Rational& x) -{ - Integer q; - Integer r; - divide(x.num, x.den, q, r); - if (sign(x.num) < 0 && sign(r) != 0) --q; - return q; -} - -Integer ceil(const Rational& x) -{ - Integer q; - Integer r; - divide(x.num, x.den, q, r); - if (sign(x.num) >= 0 && sign(r) != 0) ++q; - return q; -} - -Integer round(const Rational& x) -{ - Integer q; - Integer r; - divide(x.num, x.den, q, r); - r <<= 1; - if (ucompare(r, x.den) >= 0) - { - if (sign(x.num) >= 0) - ++q; - else - --q; - } - return q; -} - -Rational pow(const Rational& x, long y) -{ - Rational r; - if (y >= 0) - { - pow(x.num, y, r.num); - pow(x.den, y, r.den); - } - else - { - y = -y; - pow(x.num, y, r.den); - pow(x.den, y, r.num); - if (sign(r.den) < 0) - { - r.num.negate(); - r.den.negate(); - } - } - return r; -} - -#endif - -ostream& operator << (ostream& s, const Rational& y) -{ - if (y.denominator() == 1L) - s << y.numerator(); - else - { - s << y.numerator(); - s << "/"; - s << y.denominator(); - } - return s; -} - -istream& operator >> (istream& s, Rational& y) -{ -#ifdef _OLD_STREAMS - if (!s.good()) - { - return s; - } -#else - if (!s.ipfx(0)) - { - s.clear(ios::failbit|s.rdstate()); // Redundant if using GNU iostreams. - return s; - } -#endif - Integer n = 0; - Integer d = 1; - if (s >> n) - { - char ch = 0; - s.get(ch); - if (ch == '/') - { - s >> d; - } - else - { - s.putback(ch); - } - } - y = Rational(n, d); - return s; -} - -int Rational::OK() const -{ - int v = num.OK() && den.OK(); // have valid num and denom - if (v) - { - v &= sign(den) > 0; // denominator positive; - v &= ucompare(gcd(num, den), _Int_One) == 0; // relatively prime - } - if (!v) error("invariant failure"); - return v; -} - -int -Rational::fits_in_float() const -{ - return Rational (FLT_MIN) <= *this && *this <= Rational (FLT_MAX); -} - -int -Rational::fits_in_double() const -{ - return Rational (DBL_MIN) <= *this && *this <= Rational (DBL_MAX); -} diff --git a/gnu/lib/libg++/libg++/src/Rational.h b/gnu/lib/libg++/libg++/src/Rational.h deleted file mode 100644 index 6542c49f9e4..00000000000 --- a/gnu/lib/libg++/libg++/src/Rational.h +++ /dev/null @@ -1,290 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _Rational_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Rational_h 1 - -#include <Integer.h> -#include <math.h> - -#undef OK - -class Rational -{ -protected: - Integer num; - Integer den; - - void normalize(); - -public: - Rational(); - Rational(double); - Rational(int n); - Rational(long n); - Rational(int n, int d); - Rational(long n, long d); - Rational(long n, unsigned long d); - Rational(unsigned long n, long d); - Rational(unsigned long n, unsigned long d); - Rational(const Integer& n); - Rational(const Integer& n, const Integer& d); - Rational(const Rational&); - - ~Rational(); - - Rational& operator = (const Rational& y); - - friend int operator == (const Rational& x, const Rational& y); - friend int operator != (const Rational& x, const Rational& y); - friend int operator < (const Rational& x, const Rational& y); - friend int operator <= (const Rational& x, const Rational& y); - friend int operator > (const Rational& x, const Rational& y); - friend int operator >= (const Rational& x, const Rational& y); - - friend Rational operator + (const Rational& x, const Rational& y); - friend Rational operator - (const Rational& x, const Rational& y); - friend Rational operator * (const Rational& x, const Rational& y); - friend Rational operator / (const Rational& x, const Rational& y); - - Rational& operator += (const Rational& y); - Rational& operator -= (const Rational& y); - Rational& operator *= (const Rational& y); - Rational& operator /= (const Rational& y); - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) - friend Rational operator <? (const Rational& x, const Rational& y); // min - friend Rational operator >? (const Rational& x, const Rational& y); // max -#endif - - friend Rational operator - (const Rational& x); - - -// builtin Rational functions - - - void negate(); // x = -x - void invert(); // x = 1/x - - friend int sign(const Rational& x); // -1, 0, or +1 - friend Rational abs(const Rational& x); // absolute value - friend Rational sqr(const Rational& x); // square - friend Rational pow(const Rational& x, long y); - friend Rational pow(const Rational& x, const Integer& y); - const Integer& numerator() const; - const Integer& denominator() const; - -// coercion & conversion - - operator double() const; - friend Integer floor(const Rational& x); - friend Integer ceil(const Rational& x); - friend Integer trunc(const Rational& x); - friend Integer round(const Rational& x); - - friend istream& operator >> (istream& s, Rational& y); - friend ostream& operator << (ostream& s, const Rational& y); - - int fits_in_float() const; - int fits_in_double() const; - -// procedural versions of operators - - friend int compare(const Rational& x, const Rational& y); - friend void add(const Rational& x, const Rational& y, Rational& dest); - friend void sub(const Rational& x, const Rational& y, Rational& dest); - friend void mul(const Rational& x, const Rational& y, Rational& dest); - friend void div(const Rational& x, const Rational& y, Rational& dest); - -// error detection - - void error(const char* msg) const; - int OK() const; - -}; - -typedef Rational RatTmp; // backwards compatibility - -inline Rational::Rational() : num(&_ZeroRep), den(&_OneRep) {} -inline Rational::~Rational() {} - -inline Rational::Rational(const Rational& y) :num(y.num), den(y.den) {} - -inline Rational::Rational(const Integer& n) :num(n), den(&_OneRep) {} - -inline Rational::Rational(const Integer& n, const Integer& d) :num(n),den(d) -{ - normalize(); -} - -inline Rational::Rational(long n) :num(n), den(&_OneRep) { } - -inline Rational::Rational(int n) :num(n), den(&_OneRep) { } - -inline Rational::Rational(long n, long d) :num(n), den(d) { normalize(); } -inline Rational::Rational(int n, int d) :num(n), den(d) { normalize(); } -inline Rational::Rational(long n, unsigned long d) :num(n), den(d) -{ - normalize(); -} -inline Rational::Rational(unsigned long n, long d) :num(n), den(d) -{ - normalize(); -} -inline Rational::Rational(unsigned long n, unsigned long d) :num(n), den(d) -{ - normalize(); -} - -inline Rational& Rational::operator = (const Rational& y) -{ - num = y.num; den = y.den; - return *this; -} - -inline int operator == (const Rational& x, const Rational& y) -{ - return compare(x.num, y.num) == 0 && compare(x.den, y.den) == 0; -} - -inline int operator != (const Rational& x, const Rational& y) -{ - return compare(x.num, y.num) != 0 || compare(x.den, y.den) != 0; -} - -inline int operator < (const Rational& x, const Rational& y) -{ - return compare(x, y) < 0; -} - -inline int operator <= (const Rational& x, const Rational& y) -{ - return compare(x, y) <= 0; -} - -inline int operator > (const Rational& x, const Rational& y) -{ - return compare(x, y) > 0; -} - -inline int operator >= (const Rational& x, const Rational& y) -{ - return compare(x, y) >= 0; -} - -inline int sign(const Rational& x) -{ - return sign(x.num); -} - -inline void Rational::negate() -{ - num.negate(); -} - - -inline Rational& Rational::operator += (const Rational& y) -{ - add(*this, y, *this); - return *this; -} - -inline Rational& Rational::operator -= (const Rational& y) -{ - sub(*this, y, *this); - return *this; -} - -inline Rational& Rational::operator *= (const Rational& y) -{ - mul(*this, y, *this); - return *this; -} - -inline Rational& Rational::operator /= (const Rational& y) -{ - div(*this, y, *this); - return *this; -} - -inline const Integer& Rational::numerator() const { return num; } -inline const Integer& Rational::denominator() const { return den; } -inline Rational::operator double() const { return ratio(num, den); } - -#if defined (__GNUG__) && ! defined (__STRICT_ANSI__) -inline Rational operator <? (const Rational& x, const Rational& y) -{ - if (compare(x, y) <= 0) return x; else return y; -} - -inline Rational operator >? (const Rational& x, const Rational& y) -{ - if (compare(x, y) >= 0) return x; else return y; -} -#endif - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -inline Rational operator + (const Rational& x, const Rational& y) return r -{ - add(x, y, r); -} - -inline Rational operator - (const Rational& x, const Rational& y) return r -{ - sub(x, y, r); -} - -inline Rational operator * (const Rational& x, const Rational& y) return r -{ - mul(x, y, r); -} - -inline Rational operator / (const Rational& x, const Rational& y) return r -{ - div(x, y, r); -} - -#else /* NO_NRV */ - -inline Rational operator + (const Rational& x, const Rational& y) -{ - Rational r; add(x, y, r); return r; -} - -inline Rational operator - (const Rational& x, const Rational& y) -{ - Rational r; sub(x, y, r); return r; -} - -inline Rational operator * (const Rational& x, const Rational& y) -{ - Rational r; mul(x, y, r); return r; -} - -inline Rational operator / (const Rational& x, const Rational& y) -{ - Rational r; div(x, y, r); return r; -} -#endif - -#endif diff --git a/gnu/lib/libg++/libg++/src/Regex.cc b/gnu/lib/libg++/libg++/src/Regex.cc deleted file mode 100644 index 642fd88e245..00000000000 --- a/gnu/lib/libg++/libg++/src/Regex.cc +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - Regex class implementation - */ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <std.h> -#include <ctype.h> -#include <new.h> -#include <builtin.h> - -extern "C" { -#if 1 -#include <rx.h> -#else -#include <regex.h> -#endif -} - -#include <Regex.h> - -Regex::~Regex() -{ - if (buf->buffer) free(buf->buffer); - if (buf->fastmap) free(buf->fastmap); - if (buf->translate) free (buf->translate); - - if (reg->start) - free (reg->start); - if (reg->end) - free (reg->end); - - delete(buf); - delete(reg); -} - -Regex::Regex(const char* t, int fast, int bufsize, - const char* transtable) -{ - int tlen = (t == 0)? 0 : strlen(t); - buf = new re_pattern_buffer; - memset (buf, 0, sizeof(re_pattern_buffer)); - reg = new re_registers; - reg->start = 0; - reg->end = 0; - if (fast) - buf->fastmap = (char*)malloc(256); - else - buf->fastmap = 0; - buf->translate = (unsigned char*)transtable; - if (tlen > bufsize) - bufsize = tlen; - buf->allocated = bufsize; - buf->buffer = (char *)malloc(buf->allocated); - const char* msg = re_compile_pattern((const char*)t, tlen, buf); - if (msg != 0) - (*lib_error_handler)("Regex", msg); - else if (fast) - re_compile_fastmap(buf); -} - -int Regex::match_info(int& start, int& length, int nth) const -{ - if ((unsigned)(nth) >= RE_NREGS) - return 0; - else - { - start = reg->start[nth]; - length = reg->end[nth] - start; - return start >= 0 && length >= 0; - } -} - -int Regex::search(const char* s, int len, int& matchlen, int startpos) const -{ - int matchpos, pos, range; - if (startpos >= 0) - { - pos = startpos; - range = len - startpos; - } - else - { - pos = len + startpos; - range = -pos; - } - matchpos = re_search_2(buf, 0, 0, (char*)s, len, pos, range, reg, len); - if (matchpos >= 0) - matchlen = reg->end[0] - reg->start[0]; - else - matchlen = 0; - return matchpos; -} - -int Regex::match(const char*s, int len, int p) const -{ - if (p < 0) - { - p += len; - if (p > len) - return -1; - return re_match_2(buf, 0, 0, (char*)s, p, 0, reg, p); - } - else if (p > len) - return -1; - else - return re_match_2(buf, 0, 0, (char*)s, len, p, reg, len); -} - -int Regex::OK() const -{ -// can't verify much, since we've lost the original string - int v = buf != 0; // have a regex buf - v &= buf->buffer != 0; // with a pat - if (!v) (*lib_error_handler)("Regex", "invariant failure"); - return v; -} - -/* - some built-in Regular expressions -*/ - -const Regex RXwhite("[ \n\t\r\v\f]+", 1); -const Regex RXint("-?[0-9]+", 1); -const Regex RXdouble("-?\\(\\([0-9]+\\.[0-9]*\\)\\|\\([0-9]+\\)\\|\\(\\.[0-9]+\\)\\)\\([eE][---+]?[0-9]+\\)?", 1, 200); -const Regex RXalpha("[A-Za-z]+", 1); -const Regex RXlowercase("[a-z]+", 1); -const Regex RXuppercase("[A-Z]+", 1); -const Regex RXalphanum("[0-9A-Za-z]+", 1); -const Regex RXidentifier("[A-Za-z_][A-Za-z0-9_]*", 1); - diff --git a/gnu/lib/libg++/libg++/src/Regex.h b/gnu/lib/libg++/libg++/src/Regex.h deleted file mode 100644 index 47f9a853a33..00000000000 --- a/gnu/lib/libg++/libg++/src/Regex.h +++ /dev/null @@ -1,78 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -#ifndef _Regex_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Regex_h 1 - -#undef OK - -#if defined(SHORT_NAMES) || defined(VMS) -#define re_compile_pattern recmppat -#define re_pattern_buffer repatbuf -#define re_registers reregs -#endif - -struct re_pattern_buffer; // defined elsewhere -struct re_registers; - -class Regex -{ -private: - - Regex(const Regex&) {} // no X(X&) - void operator = (const Regex&) {} // no assignment - -protected: - re_pattern_buffer* buf; - re_registers* reg; - -public: - Regex(const char* t, - int fast = 0, - int bufsize = 40, - const char* transtable = 0); - - ~Regex(); - - int match(const char* s, int len, int pos = 0) const; - int search(const char* s, int len, - int& matchlen, int startpos = 0) const; - int match_info(int& start, int& length, int nth = 0) const; - - int OK() const; // representation invariant -}; - -// some built in regular expressions - -extern const Regex RXwhite; // = "[ \n\t\r\v\f]+" -extern const Regex RXint; // = "-?[0-9]+" -extern const Regex RXdouble; // = "-?\\(\\([0-9]+\\.[0-9]*\\)\\| - // \\([0-9]+\\)\\|\\(\\.[0-9]+\\)\\) - // \\([eE][---+]?[0-9]+\\)?" -extern const Regex RXalpha; // = "[A-Za-z]+" -extern const Regex RXlowercase; // = "[a-z]+" -extern const Regex RXuppercase; // = "[A-Z]+" -extern const Regex RXalphanum; // = "[0-9A-Za-z]+" -extern const Regex RXidentifier; // = "[A-Za-z_][A-Za-z0-9_]*" - - -#endif diff --git a/gnu/lib/libg++/libg++/src/RndInt.cc b/gnu/lib/libg++/libg++/src/RndInt.cc deleted file mode 100644 index c09f1e504d3..00000000000 --- a/gnu/lib/libg++/libg++/src/RndInt.cc +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <RndInt.h> diff --git a/gnu/lib/libg++/libg++/src/RndInt.h b/gnu/lib/libg++/libg++/src/RndInt.h deleted file mode 100644 index 7a73aee1c0b..00000000000 --- a/gnu/lib/libg++/libg++/src/RndInt.h +++ /dev/null @@ -1,176 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1990 Free Software Foundation - adapted from a submission from John Reidl <riedl@cs.purdue.edu> - - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU CC General Public -License for full details. - -Everyone is granted permission to copy, modify and redistribute -GNU CC, but only under the conditions described in the -GNU CC General Public License. A copy of this license is -supposed to have been given to you along with GNU CC so you -can know your rights and responsibilities. It should be in a -file named COPYING. Among other things, the copyright notice -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _RandomInteger_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _RandomInteger_h 1 - -// RandomInteger uses a random number generator to generate an integer -// in a specified range. By default the range is 0..1. Since in my -// experience random numbers are often needed for a wide variety of -// ranges in the same program, this generator accepts a new low or high value -// as an argument to the asLong and operator() methods to temporarily -// override stored values - -#include <math.h> -#include <RNG.h> - -class RandomInteger -{ - protected: - RNG *pGenerator; - long pLow; - long pHigh; - - long _asLong(long, long); - - public: - - RandomInteger(long low, long high, RNG *gen); - RandomInteger(long high, RNG *gen); - RandomInteger(RNG *gen); - -// read params - - long low() const; - long high() const; - RNG* generator() const; - -// change params - - long low(long x); - long high(long x); - RNG* generator(RNG *gen); - -// get a random number - - long asLong(); - long operator()(); // synonym for asLong - int asInt(); // (possibly) truncate as int - -// override params for one shot - - long asLong(long high); - long asLong(long low, long high); - - long operator () (long high); // synonyms - long operator () (long low, long high); - -}; - - -inline RandomInteger::RandomInteger(long low, long high, RNG *gen) - : pGenerator(gen), - pLow((low < high) ? low : high), - pHigh((low < high) ? high : low) - -{} - -inline RandomInteger::RandomInteger(long high, RNG *gen) - : pGenerator(gen), - pLow((0 < high) ? 0 : high), - pHigh((0 < high) ? high : 0) -{} - - -inline RandomInteger::RandomInteger(RNG *gen) - : pGenerator(gen), - pLow(0), - pHigh(1) -{} - -inline RNG* RandomInteger::generator() const { return pGenerator;} -inline long RandomInteger::low() const { return pLow; } -inline long RandomInteger::high() const { return pHigh; } - -inline RNG* RandomInteger::generator(RNG *gen) -{ - RNG *tmp = pGenerator; pGenerator = gen; return tmp; -} - -inline long RandomInteger::low(long x) -{ - long tmp = pLow; pLow = x; return tmp; -} - -inline long RandomInteger:: high(long x) -{ - long tmp = pHigh; pHigh = x; return tmp; -} - -inline long RandomInteger:: _asLong(long low, long high) -{ - return (pGenerator->asLong() % (high-low+1)) + low; -} - - -inline long RandomInteger:: asLong() -{ - return _asLong(pLow, pHigh); -} - -inline long RandomInteger:: asLong(long high) -{ - return _asLong(pLow, high); -} - -inline long RandomInteger:: asLong(long low, long high) -{ - return _asLong(low, high); -} - -inline long RandomInteger:: operator () () -{ - return _asLong(pLow, pHigh); -} - -inline long RandomInteger:: operator () (long high) -{ - return _asLong(pLow, high); -} - -inline long RandomInteger:: operator () (long low, long high) -{ - return _asLong(low, high); -} - - - - -inline int RandomInteger:: asInt() -{ - return int(asLong()); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/SLList.cc b/gnu/lib/libg++/libg++/src/SLList.cc deleted file mode 100644 index 564e5997bde..00000000000 --- a/gnu/lib/libg++/libg++/src/SLList.cc +++ /dev/null @@ -1,247 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988, 1992 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _G_NO_TEMPLATES -#ifdef __GNUG__ -//#pragma implementation -#endif -#include <limits.h> -#include <stream.h> -#include <builtin.h> -#include "SLList.h" - -void BaseSLList::error(const char* msg) const -{ - (*lib_error_handler)("SLList", msg); -} - -int BaseSLList::length() const -{ - int l = 0; - BaseSLNode* t = last; - if (t != 0) do { ++l; t = t->tl; } while (t != last); - return l; -} - -void BaseSLList::clear() -{ - if (last == 0) - return; - - BaseSLNode* p = last->tl; - last->tl = 0; - last = 0; - - while (p != 0) - { - BaseSLNode* nxt = p->tl; - delete_node(p); - p = nxt; - } -} - - -// Note: This is an internal method. It does *not* free old contents! - -void BaseSLList::copy(const BaseSLList& a) -{ - if (a.last == 0) - last = 0; - else - { - BaseSLNode* p = a.last->tl; - BaseSLNode* h = copy_node(p->item()); - last = h; - for (;;) - { - if (p == a.last) - { - last->tl = h; - return; - } - p = p->tl; - BaseSLNode* n = copy_node(p->item()); - last->tl = n; - last = n; - } - } -} - -BaseSLList& BaseSLList::operator = (const BaseSLList& a) -{ - if (last != a.last) - { - clear(); - copy(a); - } - return *this; -} - -Pix BaseSLList::prepend(const void *datum) -{ - return prepend(copy_node(datum)); -} - - -Pix BaseSLList::prepend(BaseSLNode* t) -{ - if (t == 0) return 0; - if (last == 0) - t->tl = last = t; - else - { - t->tl = last->tl; - last->tl = t; - } - return Pix(t); -} - - -Pix BaseSLList::append(const void *datum) -{ - return append(copy_node(datum)); -} - -Pix BaseSLList::append(BaseSLNode* t) -{ - if (t == 0) return 0; - if (last == 0) - t->tl = last = t; - else - { - t->tl = last->tl; - last->tl = t; - last = t; - } - return Pix(t); -} - -void BaseSLList::join(BaseSLList& b) -{ - BaseSLNode* t = b.last; - b.last = 0; - if (last == 0) - last = t; - else if (t != 0) - { - BaseSLNode* f = last->tl; - last->tl = t->tl; - t->tl = f; - last = t; - } -} - -Pix BaseSLList::ins_after(Pix p, const void *datum) -{ - BaseSLNode* u = (BaseSLNode*)p; - BaseSLNode* t = copy_node(datum); - if (last == 0) - t->tl = last = t; - else if (u == 0) // ins_after 0 means prepend - { - t->tl = last->tl; - last->tl = t; - } - else - { - t->tl = u->tl; - u->tl = t; - if (u == last) - last = t; - } - return Pix(t); -} - -void BaseSLList::del_after(Pix p) -{ - BaseSLNode* u = (BaseSLNode*)p; - if (last == 0 || u == last) error("cannot del_after last"); - if (u == 0) u = last; // del_after 0 means delete first - BaseSLNode* t = u->tl; - if (u == t) - last = 0; - else - { - u->tl = t->tl; - if (last == t) - last = u; - } - delete_node(t); -} - -int BaseSLList::owns(Pix p) const -{ - BaseSLNode* t = last; - if (t != 0 && p != 0) - { - do - { - if (Pix(t) == p) return 1; - t = t->tl; - } while (t != last); - } - return 0; -} - -int BaseSLList::remove_front(void *dst, int signal_error) -{ - if (last) - { - BaseSLNode* t = last->tl; - copy_item(dst, t->item()); - if (t == last) - last = 0; - else - last->tl = t->tl; - delete_node(t); - return 1; - } - if (signal_error) - error("remove_front of empty list"); - return 0; -} - -void BaseSLList::del_front() -{ - if (last == 0) error("del_front of empty list"); - BaseSLNode* t = last->tl; - if (t == last) - last = 0; - else - last->tl = t->tl; - delete_node(t); -} - -int BaseSLList::OK() const -{ - int v = 1; - if (last != 0) - { - BaseSLNode* t = last; - long count = LONG_MAX; // Lots of chances to find last! - do - { - count--; - t = t->tl; - } while (count > 0 && t != last); - v &= count > 0; - } - if (!v) error("invariant failure"); - return v; -} -#endif /*!_G_NO_TEMPLATES*/ diff --git a/gnu/lib/libg++/libg++/src/SLList.h b/gnu/lib/libg++/libg++/src/SLList.h deleted file mode 100644 index 072f249fe1d..00000000000 --- a/gnu/lib/libg++/libg++/src/SLList.h +++ /dev/null @@ -1,129 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988, 1992 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _SLList_h -#ifdef __GNUG__ -//#pragma interface -#endif -#define _SLList_h 1 - -#undef OK - -#include <Pix.h> - -struct BaseSLNode -{ - union { - struct BaseSLNode *tl; - double dummy; /* To force correct alignment */ - }; - void *item() {return (void*)(this+1);} // Return ((SLNode<T>*)this)->hd -}; - -template<class T> -class SLNode : public BaseSLNode -{ - public: - T hd; // Data part of node - SLNode() { } - SLNode(const T& h, SLNode* t = 0) - : hd(h) { tl = t; } - ~SLNode() { } -}; - -extern int __SLListLength(BaseSLNode *ptr); - -class BaseSLList { - protected: - BaseSLNode *last; - virtual void delete_node(BaseSLNode*node) = 0; - virtual BaseSLNode* copy_node(const void* datum) = 0; - virtual void copy_item(void *dst, void *src) = 0; - virtual ~BaseSLList() { } - BaseSLList() { last = 0; } - void copy(const BaseSLList&); - BaseSLList& operator = (const BaseSLList& a); - Pix ins_after(Pix p, const void *datum); - Pix prepend(const void *datum); - Pix append(const void *datum); - int remove_front(void *dst, int signal_error = 0); - void join(BaseSLList&); - public: - int length() const; - int empty() const { return last == 0; } - void clear(); - Pix prepend(BaseSLNode*); - Pix append(BaseSLNode*); - int OK() const; - void error(const char* msg) const; - void del_after(Pix p); - int owns(Pix p) const; - void del_front(); -}; - -template <class T> -class SLList : public BaseSLList -{ - private: - virtual void delete_node(BaseSLNode *node) { delete (SLNode<T>*)node; } - virtual BaseSLNode* copy_node(const void *datum) - { return new SLNode<T>(*(const T*)datum); } - virtual void copy_item(void *dst, void *src) { *(T*)dst = *(T*)src; } - -public: - SLList() : BaseSLList() { } - SLList(const SLList<T>& a) : BaseSLList() { copy(a); } - SLList<T>& operator = (const SLList<T>& a) - { BaseSLList::operator=((const BaseSLList&) a); return *this; } - virtual ~SLList() { clear(); } - - Pix prepend(const T& item) {return BaseSLList::prepend(&item);} - Pix append(const T& item) {return BaseSLList::append(&item);} - Pix prepend(SLNode<T>* node) {return BaseSLList::prepend(node);} - Pix append(SLNode<T>* node) {return BaseSLList::append(node);} - - T& operator () (Pix p) { - if (p == 0) error("null Pix"); - return ((SLNode<T>*)(p))->hd; } - const T& operator () (Pix p) const { - if (p == 0) error("null Pix"); - return ((SLNode<T>*)(p))->hd; } - inline Pix first() const { return (last == 0) ? 0 : Pix(last->tl); } - void next(Pix& p) const - { p = (p == 0 || p == last) ? 0 : Pix(((SLNode<T>*)(p))->tl); } - Pix ins_after(Pix p, const T& item) - { return BaseSLList::ins_after(p, &item); } - void join(SLList<T>& a) { BaseSLList::join(a); } - - T& front() { - if (last == 0) error("front: empty list"); - return ((SLNode<T>*)last->tl)->hd; } - T& rear() { - if (last == 0) error("rear: empty list"); - return ((SLNode<T>*)last)->hd; } - const T& front() const { - if (last == 0) error("front: empty list"); - return ((SLNode<T>*)last->tl)->hd; } - const T& rear() const { - if (last == 0) error("rear: empty list"); - return ((SLNode<T>*)last)->hd; } - int remove_front(T& x) { return BaseSLList::remove_front(&x); } - T remove_front() { T dst; BaseSLList::remove_front(&dst, 1); return dst; } -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/SmplHist.cc b/gnu/lib/libg++/libg++/src/SmplHist.cc deleted file mode 100644 index 5dbe2c79327..00000000000 --- a/gnu/lib/libg++/libg++/src/SmplHist.cc +++ /dev/null @@ -1,112 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <stream.h> -#include <SmplHist.h> -#include <math.h> - -#ifndef HUGE_VAL -#ifdef HUGE -#define HUGE_VAL HUGE -#else -#include <float.h> -#define HUGE_VAL DBL_MAX -#endif -#endif - -const int SampleHistogramMinimum = -2; -const int SampleHistogramMaximum = -1; - -SampleHistogram::SampleHistogram(double low, double high, double width) -{ - if (high < low) { - double t = high; - high = low; - low = t; - } - - if (width == -1) { - width = (high - low) / 10; - } - - howManyBuckets = int((high - low) / width) + 2; - bucketCount = new int[howManyBuckets]; - bucketLimit = new double[howManyBuckets]; - double lim = low; - for (int i = 0; i < howManyBuckets; i++) { - bucketCount[i] = 0; - bucketLimit[i] = lim; - lim += width; - } - bucketLimit[howManyBuckets-1] = HUGE_VAL; /* from math.h */ -} - -SampleHistogram::~SampleHistogram() -{ - if (howManyBuckets > 0) { - delete bucketCount; - delete bucketLimit; - } -} - -void -SampleHistogram::operator+=(double value) -{ - int i; - for (i = 0; i < howManyBuckets; i++) { - if (value < bucketLimit[i]) break; - } - bucketCount[i]++; - this->SampleStatistic::operator+=(value); -} - -int -SampleHistogram::similarSamples(double d) -{ - int i; - for (i = 0; i < howManyBuckets; i++) { - if (d < bucketLimit[i]) return(bucketCount[i]); - } - return(0); -} - -void -SampleHistogram::printBuckets(ostream& s) -{ - for(int i = 0; i < howManyBuckets; i++) { - if (bucketLimit[i] >= HUGE_VAL) { - s << "< max : " << bucketCount[i] << "\n"; - } else { - s << "< " << bucketLimit[i] << " : " << bucketCount[i] << "\n"; - } - } -} - -void -SampleHistogram::reset() -{ - this->SampleStatistic::reset(); - if (howManyBuckets > 0) { - for (register int i = 0; i < howManyBuckets; i++) { - bucketCount[i] = 0; - } - } -} - diff --git a/gnu/lib/libg++/libg++/src/SmplHist.h b/gnu/lib/libg++/libg++/src/SmplHist.h deleted file mode 100644 index 959d6d4bc7a..00000000000 --- a/gnu/lib/libg++/libg++/src/SmplHist.h +++ /dev/null @@ -1,72 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef SampleHistogram_h -#ifdef __GNUG__ -#pragma interface -#endif -#define SampleHistogram_h 1 - -#include <iostream.h> -#include <SmplStat.h> - -extern const int SampleHistogramMinimum; -extern const int SampleHistogramMaximum; - -class SampleHistogram : public SampleStatistic -{ -protected: - short howManyBuckets; - int *bucketCount; - double *bucketLimit; - -public: - - SampleHistogram(double low, double hi, double bucketWidth = -1.0); - - ~SampleHistogram(); - - virtual void reset(); - virtual void operator+=(double); - - int similarSamples(double); - - int buckets(); - - double bucketThreshold(int i); - int inBucket(int i); - void printBuckets(ostream&); - -}; - - -inline int SampleHistogram:: buckets() { return(howManyBuckets); }; - -inline double SampleHistogram:: bucketThreshold(int i) { - if (i < 0 || i >= howManyBuckets) - error("invalid bucket access"); - return(bucketLimit[i]); -} - -inline int SampleHistogram:: inBucket(int i) { - if (i < 0 || i >= howManyBuckets) - error("invalid bucket access"); - return(bucketCount[i]); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/SmplStat.cc b/gnu/lib/libg++/libg++/src/SmplStat.cc deleted file mode 100644 index 9db3caa845d..00000000000 --- a/gnu/lib/libg++/libg++/src/SmplStat.cc +++ /dev/null @@ -1,160 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <stream.h> -#include <SmplStat.h> -#include <math.h> - -#ifndef HUGE_VAL -#ifdef HUGE -#define HUGE_VAL HUGE -#else -#include <float.h> -#define HUGE_VAL DBL_MAX -#endif -#endif - -// error handling - -void default_SampleStatistic_error_handler(const char* msg) -{ - cerr << "Fatal SampleStatistic error. " << msg << "\n"; - exit(1); -} - -one_arg_error_handler_t SampleStatistic_error_handler = default_SampleStatistic_error_handler; - -one_arg_error_handler_t set_SampleStatistic_error_handler(one_arg_error_handler_t f) -{ - one_arg_error_handler_t old = SampleStatistic_error_handler; - SampleStatistic_error_handler = f; - return old; -} - -void SampleStatistic::error(const char* msg) -{ - (*SampleStatistic_error_handler)(msg); -} - -// t-distribution: given p-value and degrees of freedom, return t-value -// adapted from Peizer & Pratt JASA, vol63, p1416 - -double tval(double p, int df) -{ - double t; - int positive = p >= 0.5; - p = (positive)? 1.0 - p : p; - if (p <= 0.0 || df <= 0) - t = HUGE_VAL; - else if (p == 0.5) - t = 0.0; - else if (df == 1) - t = 1.0 / tan((p + p) * 1.57079633); - else if (df == 2) - t = sqrt(1.0 / ((p + p) * (1.0 - p)) - 2.0); - else - { - double ddf = df; - double a = sqrt(log(1.0 / (p * p))); - double aa = a * a; - a = a - ((2.515517 + (0.802853 * a) + (0.010328 * aa)) / - (1.0 + (1.432788 * a) + (0.189269 * aa) + - (0.001308 * aa * a))); - t = ddf - 0.666666667 + 1.0 / (10.0 * ddf); - t = sqrt(ddf * (exp(a * a * (ddf - 0.833333333) / (t * t)) - 1.0)); - } - return (positive)? t : -t; -} - -void -SampleStatistic::reset() -{ - n = 0; x = x2 = 0.0; - maxValue = -HUGE_VAL; - minValue = HUGE_VAL; -} - -void -SampleStatistic::operator+=(double value) -{ - n += 1; - x += value; - x2 += (value * value); - if ( minValue > value) minValue = value; - if ( maxValue < value) maxValue = value; -} - -double -SampleStatistic::mean() -{ - if ( n > 0) { - return (x / n); - } - else { - return ( 0.0 ); - } -} - -double -SampleStatistic::var() -{ - if ( n > 1) { - return(( x2 - ((x * x) / n)) / ( n - 1)); - } - else { - return ( 0.0 ); - } -} - -double -SampleStatistic::stdDev() -{ - if ( n <= 0 || this -> var() <= 0) { - return(0); - } else { - return( (double) sqrt( var() ) ); - } -} - -double -SampleStatistic::confidence(int interval) -{ - int df = n - 1; - if (df <= 0) return HUGE_VAL; - double t = tval(double(100 + interval) * 0.005, df); - if (t == HUGE_VAL) - return t; - else - return (t * stdDev()) / sqrt(double(n)); -} - -double -SampleStatistic::confidence(double p_value) -{ - int df = n - 1; - if (df <= 0) return HUGE_VAL; - double t = tval((1.0 + p_value) * 0.5, df); - if (t == HUGE_VAL) - return t; - else - return (t * stdDev()) / sqrt(double(n)); -} - - diff --git a/gnu/lib/libg++/libg++/src/SmplStat.h b/gnu/lib/libg++/libg++/src/SmplStat.h deleted file mode 100644 index 441692f8c7b..00000000000 --- a/gnu/lib/libg++/libg++/src/SmplStat.h +++ /dev/null @@ -1,69 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef SampleStatistic_h -#ifdef __GNUG__ -#pragma interface -#endif -#define SampleStatistic_h 1 - -#include <builtin.h> - -#undef min -#undef max - -class SampleStatistic { -protected: - int n; - double x; - double x2; - double minValue, maxValue; - - public : - - SampleStatistic(); - inline virtual ~SampleStatistic(); - virtual void reset(); - - virtual void operator+=(double); - int samples(); - double mean(); - double stdDev(); - double var(); - double min(); - double max(); - double confidence(int p_percentage); - double confidence(double p_value); - - void error(const char* msg); -}; - -// error handlers - -extern void default_SampleStatistic_error_handler(const char*); -extern one_arg_error_handler_t SampleStatistic_error_handler; - -extern one_arg_error_handler_t - set_SampleStatistic_error_handler(one_arg_error_handler_t f); - -inline SampleStatistic:: SampleStatistic(){ reset();} -inline int SampleStatistic:: samples() {return(n);} -inline double SampleStatistic:: min() {return(minValue);} -inline double SampleStatistic:: max() {return(maxValue);} -inline SampleStatistic::~SampleStatistic() {} - -#endif diff --git a/gnu/lib/libg++/libg++/src/String.cc b/gnu/lib/libg++/libg++/src/String.cc deleted file mode 100644 index cda82731791..00000000000 --- a/gnu/lib/libg++/libg++/src/String.cc +++ /dev/null @@ -1,1307 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - String class implementation - */ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <String.h> -#include <std.h> -#include <ctype.h> -#include <limits.h> -#include <new.h> -#include <builtin.h> - -#undef OK - -void String::error(const char* msg) const -{ - (*lib_error_handler)("String", msg); -} - -String::operator const char*() const -{ - return (const char*)chars(); -} - -// globals - -StrRep _nilStrRep = { 0, 1, { 0 } }; // nil strings point here -String _nilString; // nil SubStrings point here - - - - -/* - the following inline fcts are specially designed to work - in support of String classes, and are not meant as generic replacements - for libc "str" functions. - - inline copy fcts - I like left-to-right from->to arguments. - all versions assume that `to' argument is non-null - - These are worth doing inline, rather than through calls because, - via procedural integration, adjacent copy calls can be smushed - together by the optimizer. -*/ - -// copy n bytes -inline static void ncopy(const char* from, char* to, int n) -{ - if (from != to) while (--n >= 0) *to++ = *from++; -} - -// copy n bytes, null-terminate -inline static void ncopy0(const char* from, char* to, int n) -{ - if (from != to) - { - while (--n >= 0) *to++ = *from++; - *to = 0; - } - else - to[n] = 0; -} - -// copy until null -inline static void scopy(const char* from, char* to) -{ - if (from != 0) while((*to++ = *from++) != 0); -} - -// copy right-to-left -inline static void revcopy(const char* from, char* to, short n) -{ - if (from != 0) while (--n >= 0) *to-- = *from--; -} - - -inline static int slen(const char* t) // inline strlen -{ - if (t == 0) - return 0; - else - { - const char* a = t; - while (*a++ != 0); - return a - 1 - t; - } -} - -// minimum & maximum representable rep size - -#define MAXStrRep_SIZE ((1 << (sizeof(short) * CHAR_BIT - 1)) - 1) -#define MINStrRep_SIZE 16 - -#ifndef MALLOC_MIN_OVERHEAD -#define MALLOC_MIN_OVERHEAD 4 -#endif - -// The basic allocation primitive: -// Always round request to something close to a power of two. -// This ensures a bit of padding, which often means that -// concatenations don't have to realloc. Plus it tends to -// be faster when lots of Strings are created and discarded, -// since just about any version of malloc (op new()) will -// be faster when it can reuse identically-sized chunks - -inline static StrRep* Snew(int newsiz) -{ - unsigned int siz = sizeof(StrRep) + newsiz + MALLOC_MIN_OVERHEAD; - unsigned int allocsiz = MINStrRep_SIZE; - while (allocsiz < siz) allocsiz <<= 1; - allocsiz -= MALLOC_MIN_OVERHEAD; - if (allocsiz >= MAXStrRep_SIZE) - (*lib_error_handler)("String", "Requested length out of range"); - - StrRep* rep = new (operator new (allocsiz)) StrRep; - rep->sz = allocsiz - sizeof(StrRep); - return rep; -} - -// Do-something-while-allocating routines. - -// We live with two ways to signify empty Sreps: either the -// null pointer (0) or a pointer to the nilStrRep. - -// We always signify unknown source lengths (usually when fed a char*) -// via len == -1, in which case it is computed. - -// allocate, copying src if nonull - -StrRep* Salloc(StrRep* old, const char* src, int srclen, int newlen) -{ - if (old == &_nilStrRep) old = 0; - if (srclen < 0) srclen = slen(src); - if (newlen < srclen) newlen = srclen; - StrRep* rep; - if (old == 0 || newlen > old->sz) - rep = Snew(newlen); - else - rep = old; - - rep->len = newlen; - ncopy0(src, rep->s, srclen); - - if (old != rep && old != 0) delete old; - - return rep; -} - -// reallocate: Given the initial allocation scheme, it will -// generally be faster in the long run to get new space & copy -// than to call realloc - -static StrRep* -Sresize(StrRep* old, int newlen) -{ - if (old == &_nilStrRep) old = 0; - StrRep* rep; - if (old == 0) - rep = Snew(newlen); - else if (newlen > old->sz) - { - rep = Snew(newlen); - ncopy0(old->s, rep->s, old->len); - delete old; - } - else - rep = old; - - rep->len = newlen; - - return rep; -} - -void -String::alloc (int newsize) -{ - unsigned short old_len = rep->len; - rep = Sresize(rep, newsize); - rep->len = old_len; -} - -// like allocate, but we know that src is a StrRep - -StrRep* Scopy(StrRep* old, const StrRep* s) -{ - if (old == &_nilStrRep) old = 0; - if (s == &_nilStrRep) s = 0; - if (old == s) - return (old == 0)? &_nilStrRep : old; - else if (s == 0) - { - old->s[0] = 0; - old->len = 0; - return old; - } - else - { - StrRep* rep; - int newlen = s->len; - if (old == 0 || newlen > old->sz) - { - if (old != 0) delete old; - rep = Snew(newlen); - } - else - rep = old; - rep->len = newlen; - ncopy0(s->s, rep->s, newlen); - return rep; - } -} - -// allocate & concatenate - -StrRep* Scat(StrRep* old, const char* s, int srclen, const char* t, int tlen) -{ - if (old == &_nilStrRep) old = 0; - if (srclen < 0) srclen = slen(s); - if (tlen < 0) tlen = slen(t); - int newlen = srclen + tlen; - StrRep* rep; - - if (old == 0 || newlen > old->sz || - (t >= old->s && t < &(old->s[old->len]))) // beware of aliasing - rep = Snew(newlen); - else - rep = old; - - rep->len = newlen; - - ncopy(s, rep->s, srclen); - ncopy0(t, &(rep->s[srclen]), tlen); - - if (old != rep && old != 0) delete old; - - return rep; -} - -// double-concatenate - -StrRep* Scat(StrRep* old, const char* s, int srclen, const char* t, int tlen, - const char* u, int ulen) -{ - if (old == &_nilStrRep) old = 0; - if (srclen < 0) srclen = slen(s); - if (tlen < 0) tlen = slen(t); - if (ulen < 0) ulen = slen(u); - int newlen = srclen + tlen + ulen; - StrRep* rep; - if (old == 0 || newlen > old->sz || - (t >= old->s && t < &(old->s[old->len])) || - (u >= old->s && u < &(old->s[old->len]))) - rep = Snew(newlen); - else - rep = old; - - rep->len = newlen; - - ncopy(s, rep->s, srclen); - ncopy(t, &(rep->s[srclen]), tlen); - ncopy0(u, &(rep->s[srclen+tlen]), ulen); - - if (old != rep && old != 0) delete old; - - return rep; -} - -// like cat, but we know that new stuff goes in the front of existing rep - -StrRep* Sprepend(StrRep* old, const char* t, int tlen) -{ - char* s; - int srclen; - if (old == &_nilStrRep || old == 0) - { - s = 0; old = 0; srclen = 0; - } - else - { - s = old->s; srclen = old->len; - } - if (tlen < 0) tlen = slen(t); - int newlen = srclen + tlen; - StrRep* rep; - if (old == 0 || newlen > old->sz || - (t >= old->s && t < &(old->s[old->len]))) - rep = Snew(newlen); - else - rep = old; - - rep->len = newlen; - - revcopy(&(s[srclen]), &(rep->s[newlen]), srclen+1); - ncopy(t, rep->s, tlen); - - if (old != rep && old != 0) delete old; - - return rep; -} - - -// string compare: first argument is known to be non-null - -inline static int scmp(const char* a, const char* b) -{ - if (b == 0) - return *a != 0; - else - { - int diff = 0; - while ((diff = *a - *b++) == 0 && *a++ != 0); - return diff; - } -} - - -inline static int ncmp(const char* a, int al, const char* b, int bl) -{ - int n = (al <= bl)? al : bl; - int diff; - while (n-- > 0) if ((diff = *a++ - *b++) != 0) return diff; - return al - bl; -} - -int fcompare(const String& x, const String& y) -{ - const char* a = x.chars(); - const char* b = y.chars(); - int al = x.length(); - int bl = y.length(); - int n = (al <= bl)? al : bl; - int diff = 0; - while (n-- > 0) - { - char ac = *a++; - char bc = *b++; - if ((diff = ac - bc) != 0) - { - if (ac >= 'a' && ac <= 'z') - ac = ac - 'a' + 'A'; - if (bc >= 'a' && bc <= 'z') - bc = bc - 'a' + 'A'; - if ((diff = ac - bc) != 0) - return diff; - } - } - return al - bl; -} - -// these are not inline, but pull in the above inlines, so are -// pretty fast - -int compare(const String& x, const char* b) -{ - return scmp(x.chars(), b); -} - -int compare(const String& x, const String& y) -{ - return scmp(x.chars(), y.chars()); -} - -int compare(const String& x, const SubString& y) -{ - return ncmp(x.chars(), x.length(), y.chars(), y.length()); -} - -int compare(const SubString& x, const String& y) -{ - return ncmp(x.chars(), x.length(), y.chars(), y.length()); -} - -int compare(const SubString& x, const SubString& y) -{ - return ncmp(x.chars(), x.length(), y.chars(), y.length()); -} - -int compare(const SubString& x, const char* b) -{ - if (b == 0) - return x.length(); - else - { - const char* a = x.chars(); - int n = x.length(); - int diff; - while (n-- > 0) if ((diff = *a++ - *b++) != 0) return diff; - return (*b == 0) ? 0 : -1; - } -} - -/* - index fcts -*/ - -int String::search(int start, int sl, char c) const -{ - const char* s = chars(); - if (sl > 0) - { - if (start >= 0) - { - const char* a = &(s[start]); - const char* lasta = &(s[sl]); - while (a < lasta) if (*a++ == c) return --a - s; - } - else - { - const char* a = &(s[sl + start + 1]); - while (--a >= s) if (*a == c) return a - s; - } - } - return -1; -} - -int String::search(int start, int sl, const char* t, int tl) const -{ - const char* s = chars(); - if (tl < 0) tl = slen(t); - if (sl > 0 && tl > 0) - { - if (start >= 0) - { - const char* lasts = &(s[sl - tl]); - const char* lastt = &(t[tl]); - const char* p = &(s[start]); - - while (p <= lasts) - { - const char* x = p++; - const char* y = t; - while (*x++ == *y++) if (y >= lastt) return --p - s; - } - } - else - { - const char* firsts = &(s[tl - 1]); - const char* lastt = &(t[tl - 1]); - const char* p = &(s[sl + start + 1]); - - while (--p >= firsts) - { - const char* x = p; - const char* y = lastt; - while (*x-- == *y--) if (y < t) return ++x - s; - } - } - } - return -1; -} - -int String::match(int start, int sl, int exact, const char* t, int tl) const -{ - if (tl < 0) tl = slen(t); - - if (start < 0) - { - start = sl + start - tl + 1; - if (start < 0 || (exact && start != 0)) - return -1; - } - else if (exact && sl - start != tl) - return -1; - - if (sl == 0 || tl == 0 || sl - start < tl || start >= sl) - return -1; - - int n = tl; - const char* s = &(rep->s[start]); - while (--n >= 0) if (*s++ != *t++) return -1; - return tl; -} - -void SubString::assign(const StrRep* ysrc, const char* ys, int ylen) -{ - if (&S == &_nilString) return; - - if (ylen < 0) ylen = slen(ys); - StrRep* targ = S.rep; - int sl = targ->len - len + ylen; - - if (ysrc == targ || sl >= targ->sz) - { - StrRep* oldtarg = targ; - targ = Sresize(0, sl); - ncopy(oldtarg->s, targ->s, pos); - ncopy(ys, &(targ->s[pos]), ylen); - scopy(&(oldtarg->s[pos + len]), &(targ->s[pos + ylen])); - delete oldtarg; - } - else if (len == ylen) - ncopy(ys, &(targ->s[pos]), len); - else if (ylen < len) - { - ncopy(ys, &(targ->s[pos]), ylen); - scopy(&(targ->s[pos + len]), &(targ->s[pos + ylen])); - } - else - { - revcopy(&(targ->s[targ->len]), &(targ->s[sl]), targ->len-pos-len +1); - ncopy(ys, &(targ->s[pos]), ylen); - } - targ->len = sl; - S.rep = targ; -} - - - -/* - * substitution - */ - - -int String::_gsub(const char* pat, int pl, const char* r, int rl) -{ - int nmatches = 0; - if (pl < 0) pl = slen(pat); - if (rl < 0) rl = slen(r); - int sl = length(); - if (sl <= 0 || pl <= 0 || sl < pl) - return nmatches; - - const char* s = chars(); - - // prepare to make new rep - StrRep* nrep = 0; - int nsz = 0; - char* x = 0; - - int si = 0; - int xi = 0; - int remaining = sl; - - while (remaining >= pl) - { - int pos = search(si, sl, pat, pl); - if (pos < 0) - break; - else - { - ++nmatches; - int mustfit = xi + remaining + rl - pl; - if (mustfit >= nsz) - { - if (nrep != 0) nrep->len = xi; - nrep = Sresize(nrep, mustfit); - nsz = nrep->sz; - x = nrep->s; - } - pos -= si; - ncopy(&(s[si]), &(x[xi]), pos); - ncopy(r, &(x[xi + pos]), rl); - si += pos + pl; - remaining -= pos + pl; - xi += pos + rl; - } - } - - if (nrep == 0) - { - if (nmatches == 0) - return nmatches; - else - nrep = Sresize(nrep, xi+remaining); - } - - ncopy0(&(s[si]), &(x[xi]), remaining); - nrep->len = xi + remaining; - - if (nrep->len <= rep->sz) // fit back in if possible - { - rep->len = nrep->len; - ncopy0(nrep->s, rep->s, rep->len); - delete(nrep); - } - else - { - delete(rep); - rep = nrep; - } - return nmatches; -} - -int String::_gsub(const Regex& pat, const char* r, int rl) -{ - int nmatches = 0; - int sl = length(); - if (sl <= 0) - return nmatches; - - if (rl < 0) rl = slen(r); - - const char* s = chars(); - - StrRep* nrep = 0; - int nsz = 0; - - char* x = 0; - - int si = 0; - int xi = 0; - int remaining = sl; - int pos, pl = 0; // how long is a regular expression? - - while (remaining > 0) - { - pos = pat.search(s, sl, pl, si); // unlike string search, the pos returned here is absolute - if (pos < 0 || pl <= 0) - break; - else - { - ++nmatches; - int mustfit = xi + remaining + rl - pl; - if (mustfit >= nsz) - { - if (nrep != 0) nrep->len = xi; - nrep = Sresize(nrep, mustfit); - x = nrep->s; - nsz = nrep->sz; - } - pos -= si; - ncopy(&(s[si]), &(x[xi]), pos); - ncopy(r, &(x[xi + pos]), rl); - si += pos + pl; - remaining -= pos + pl; - xi += pos + rl; - } - } - - if (nrep == 0) - { - if (nmatches == 0) - return nmatches; - else - nrep = Sresize(nrep, xi+remaining); - } - - ncopy0(&(s[si]), &(x[xi]), remaining); - nrep->len = xi + remaining; - - if (nrep->len <= rep->sz) // fit back in if possible - { - rep->len = nrep->len; - ncopy0(nrep->s, rep->s, rep->len); - delete(nrep); - } - else - { - delete(rep); - rep = nrep; - } - return nmatches; -} - - -/* - * deletion - */ - -void String::del(int pos, int len) -{ - if (pos < 0 || len <= 0 || (unsigned)(pos + len) > length()) return; - int nlen = length() - len; - int first = pos + len; - ncopy0(&(rep->s[first]), &(rep->s[pos]), length() - first); - rep->len = nlen; -} - -void String::del(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - del(first, mlen); -} - -void String::del(const char* t, int startpos) -{ - int tlen = slen(t); - int p = search(startpos, length(), t, tlen); - del(p, tlen); -} - -void String::del(const String& y, int startpos) -{ - del(search(startpos, length(), y.chars(), y.length()), y.length()); -} - -void String::del(const SubString& y, int startpos) -{ - del(search(startpos, length(), y.chars(), y.length()), y.length()); -} - -void String::del(char c, int startpos) -{ - del(search(startpos, length(), c), 1); -} - -/* - * substring extraction - */ - - -SubString String::at(int first, int len) -{ - return _substr(first, len); -} - -SubString String::operator() (int first, int len) -{ - return _substr(first, len); -} - -SubString String::before(int pos) -{ - return _substr(0, pos); -} - -SubString String::through(int pos) -{ - return _substr(0, pos+1); -} - -SubString String::after(int pos) -{ - return _substr(pos + 1, length() - (pos + 1)); -} - -SubString String::from(int pos) -{ - return _substr(pos, length() - pos); -} - -SubString String::at(const String& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - return _substr(first, y.length()); -} - -SubString String::at(const SubString& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - return _substr(first, y.length()); -} - -SubString String::at(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - return _substr(first, mlen); -} - -SubString String::at(const char* t, int startpos) -{ - int tlen = slen(t); - int first = search(startpos, length(), t, tlen); - return _substr(first, tlen); -} - -SubString String::at(char c, int startpos) -{ - int first = search(startpos, length(), c); - return _substr(first, 1); -} - -SubString String::before(const String& y, int startpos) -{ - int last = search(startpos, length(), y.chars(), y.length()); - return _substr(0, last); -} - -SubString String::before(const SubString& y, int startpos) -{ - int last = search(startpos, length(), y.chars(), y.length()); - return _substr(0, last); -} - -SubString String::before(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - return _substr(0, first); -} - -SubString String::before(char c, int startpos) -{ - int last = search(startpos, length(), c); - return _substr(0, last); -} - -SubString String::before(const char* t, int startpos) -{ - int tlen = slen(t); - int last = search(startpos, length(), t, tlen); - return _substr(0, last); -} - -SubString String::through(const String& y, int startpos) -{ - int last = search(startpos, length(), y.chars(), y.length()); - if (last >= 0) last += y.length(); - return _substr(0, last); -} - -SubString String::through(const SubString& y, int startpos) -{ - int last = search(startpos, length(), y.chars(), y.length()); - if (last >= 0) last += y.length(); - return _substr(0, last); -} - -SubString String::through(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - if (first >= 0) first += mlen; - return _substr(0, first); -} - -SubString String::through(char c, int startpos) -{ - int last = search(startpos, length(), c); - if (last >= 0) last += 1; - return _substr(0, last); -} - -SubString String::through(const char* t, int startpos) -{ - int tlen = slen(t); - int last = search(startpos, length(), t, tlen); - if (last >= 0) last += tlen; - return _substr(0, last); -} - -SubString String::after(const String& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - if (first >= 0) first += y.length(); - return _substr(first, length() - first); -} - -SubString String::after(const SubString& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - if (first >= 0) first += y.length(); - return _substr(first, length() - first); -} - -SubString String::after(char c, int startpos) -{ - int first = search(startpos, length(), c); - if (first >= 0) first += 1; - return _substr(first, length() - first); -} - -SubString String::after(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - if (first >= 0) first += mlen; - return _substr(first, length() - first); -} - -SubString String::after(const char* t, int startpos) -{ - int tlen = slen(t); - int first = search(startpos, length(), t, tlen); - if (first >= 0) first += tlen; - return _substr(first, length() - first); -} - -SubString String::from(const String& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - return _substr(first, length() - first); -} - -SubString String::from(const SubString& y, int startpos) -{ - int first = search(startpos, length(), y.chars(), y.length()); - return _substr(first, length() - first); -} - -SubString String::from(const Regex& r, int startpos) -{ - int mlen; - int first = r.search(chars(), length(), mlen, startpos); - return _substr(first, length() - first); -} - -SubString String::from(char c, int startpos) -{ - int first = search(startpos, length(), c); - return _substr(first, length() - first); -} - -SubString String::from(const char* t, int startpos) -{ - int tlen = slen(t); - int first = search(startpos, length(), t, tlen); - return _substr(first, length() - first); -} - - - -/* - * split/join - */ - - -int split(const String& src, String results[], int n, const String& sep) -{ - String x = src; - const char* s = x.chars(); - int sl = x.length(); - int i = 0; - int pos = 0; - while (i < n && pos < sl) - { - int p = x.search(pos, sl, sep.chars(), sep.length()); - if (p < 0) - p = sl; - results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos); - i++; - pos = p + sep.length(); - } - return i; -} - -int split(const String& src, String results[], int n, const Regex& r) -{ - String x = src; - const char* s = x.chars(); - int sl = x.length(); - int i = 0; - int pos = 0; - int p, matchlen; - while (i < n && pos < sl) - { - p = r.search(s, sl, matchlen, pos); - if (p < 0) - p = sl; - results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos); - i++; - pos = p + matchlen; - } - return i; -} - - -#if defined(__GNUG__) && !defined(_G_NO_NRV) -#define RETURN(r) return -#define RETURNS(r) return r; -#define RETURN_OBJECT(TYPE, NAME) /* nothing */ -#else /* _G_NO_NRV */ -#define RETURN(r) return r -#define RETURNS(r) /* nothing */ -#define RETURN_OBJECT(TYPE, NAME) TYPE NAME; -#endif - -String join(String src[], int n, const String& separator) RETURNS(x) -{ - RETURN_OBJECT(String,x) - String sep = separator; - int xlen = 0; - int i; - for (i = 0; i < n; ++i) - xlen += src[i].length(); - xlen += (n - 1) * sep.length(); - - x.rep = Sresize (x.rep, xlen); - - int j = 0; - - for (i = 0; i < n - 1; ++i) - { - ncopy(src[i].chars(), &(x.rep->s[j]), src[i].length()); - j += src[i].length(); - ncopy(sep.chars(), &(x.rep->s[j]), sep.length()); - j += sep.length(); - } - ncopy0(src[i].chars(), &(x.rep->s[j]), src[i].length()); - RETURN(x); -} - -/* - misc -*/ - - -StrRep* Sreverse(const StrRep* src, StrRep* dest) -{ - int n = src->len; - if (src != dest) - dest = Salloc(dest, src->s, n, n); - if (n > 0) - { - char* a = dest->s; - char* b = &(a[n - 1]); - while (a < b) - { - char t = *a; - *a++ = *b; - *b-- = t; - } - } - return dest; -} - - -StrRep* Supcase(const StrRep* src, StrRep* dest) -{ - int n = src->len; - if (src != dest) dest = Salloc(dest, src->s, n, n); - char* p = dest->s; - char* e = &(p[n]); - for (; p < e; ++p) if (islower(*p)) *p = toupper(*p); - return dest; -} - -StrRep* Sdowncase(const StrRep* src, StrRep* dest) -{ - int n = src->len; - if (src != dest) dest = Salloc(dest, src->s, n, n); - char* p = dest->s; - char* e = &(p[n]); - for (; p < e; ++p) if (isupper(*p)) *p = tolower(*p); - return dest; -} - -StrRep* Scapitalize(const StrRep* src, StrRep* dest) -{ - int n = src->len; - if (src != dest) dest = Salloc(dest, src->s, n, n); - - char* p = dest->s; - char* e = &(p[n]); - for (; p < e; ++p) - { - int at_word; - if (at_word = islower(*p)) - *p = toupper(*p); - else - at_word = isupper(*p) || isdigit(*p); - - if (at_word) - { - while (++p < e) - { - if (isupper(*p)) - *p = tolower(*p); - /* A '\'' does not break a word, so that "Nathan's" stays - "Nathan's" rather than turning into "Nathan'S". */ - else if (!islower(*p) && !isdigit(*p) && (*p != '\'')) - break; - } - } - } - return dest; -} - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -String replicate(char c, int n) return w; -{ - w.rep = Sresize(w.rep, n); - char* p = w.rep->s; - while (n-- > 0) *p++ = c; - *p = 0; -} - -String replicate(const String& y, int n) return w -{ - int len = y.length(); - w.rep = Sresize(w.rep, n * len); - char* p = w.rep->s; - while (n-- > 0) - { - ncopy(y.chars(), p, len); - p += len; - } - *p = 0; -} - -String common_prefix(const String& x, const String& y, int startpos) return r; -{ - const char* xchars = x.chars(); - const char* ychars = y.chars(); - const char* xs = &(xchars[startpos]); - const char* ss = xs; - const char* topx = &(xchars[x.length()]); - const char* ys = &(ychars[startpos]); - const char* topy = &(ychars[y.length()]); - int l; - for (l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l); - r.rep = Salloc(r.rep, ss, l, l); -} - -String common_suffix(const String& x, const String& y, int startpos) return r; -{ - const char* xchars = x.chars(); - const char* ychars = y.chars(); - const char* xs = &(xchars[x.length() + startpos]); - const char* botx = xchars; - const char* ys = &(ychars[y.length() + startpos]); - const char* boty = ychars; - int l; - for (l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l); - r.rep = Salloc(r.rep, ++xs, l, l); -} - -#else - -String replicate(char c, int n) -{ - String w; - w.rep = Sresize(w.rep, n); - char* p = w.rep->s; - while (n-- > 0) *p++ = c; - *p = 0; - return w; -} - -String replicate(const String& y, int n) -{ - String w; - int len = y.length(); - w.rep = Sresize(w.rep, n * len); - char* p = w.rep->s; - while (n-- > 0) - { - ncopy(y.chars(), p, len); - p += len; - } - *p = 0; - return w; -} - -String common_prefix(const String& x, const String& y, int startpos) -{ - String r; - const char* xchars = x.chars(); - const char* ychars = y.chars(); - const char* xs = &(xchars[startpos]); - const char* ss = xs; - const char* topx = &(xchars[x.length()]); - const char* ys = &(ychars[startpos]); - const char* topy = &(ychars[y.length()]); - int l; - for (l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l); - r.rep = Salloc(r.rep, ss, l, l); - return r; -} - -String common_suffix(const String& x, const String& y, int startpos) -{ - String r; - const char* xchars = x.chars(); - const char* ychars = y.chars(); - const char* xs = &(xchars[x.length() + startpos]); - const char* botx = xchars; - const char* ys = &(ychars[y.length() + startpos]); - const char* boty = ychars; - int l; - for (l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l); - r.rep = Salloc(r.rep, ++xs, l, l); - return r; -} - -#endif - -// IO - -istream& operator>>(istream& s, String& x) -{ - if (!s.ipfx(0) || (!(s.flags() & ios::skipws) && !ws(s))) - { - s.clear(ios::failbit|s.rdstate()); // Redundant if using GNU iostreams. - return s; - } - int ch; - int i = 0; - x.rep = Sresize(x.rep, 20); - register streambuf *sb = s.rdbuf(); - while ((ch = sb->sbumpc()) != EOF) - { - if (isspace(ch)) - break; - if (i >= x.rep->sz - 1) - x.rep = Sresize(x.rep, i+1); - x.rep->s[i++] = ch; - } - x.rep->s[i] = 0; - x.rep->len = i; - int new_state = s.rdstate(); - if (i == 0) new_state |= ios::failbit; - if (ch == EOF) new_state |= ios::eofbit; - s.clear(new_state); - return s; -} - -int readline(istream& s, String& x, char terminator, int discard) -{ - if (!s.ipfx(0)) - return 0; - int ch; - int i = 0; - x.rep = Sresize(x.rep, 80); - register streambuf *sb = s.rdbuf(); - while ((ch = sb->sbumpc()) != EOF) - { - if (ch != terminator || !discard) - { - if (i >= x.rep->sz - 1) - x.rep = Sresize(x.rep, i+1); - x.rep->s[i++] = ch; - } - if (ch == terminator) - break; - } - x.rep->s[i] = 0; - x.rep->len = i; - if (ch == EOF) s.clear(ios::eofbit|s.rdstate()); - return i; -} - - -ostream& operator<<(ostream& s, const SubString& x) -{ - const char* a = x.chars(); - const char* lasta = &(a[x.length()]); - while (a < lasta) - s.put(*a++); - return(s); -} - -// from John.Willis@FAS.RI.CMU.EDU - -int String::freq(const SubString& y) const -{ - int found = 0; - for (unsigned int i = 0; i < length(); i++) - if (match(i,length(),0,y.chars(), y.length())>= 0) found++; - return(found); -} - -int String::freq(const String& y) const -{ - int found = 0; - for (unsigned int i = 0; i < length(); i++) - if (match(i,length(),0,y.chars(),y.length()) >= 0) found++; - return(found); -} - -int String::freq(const char* t) const -{ - int found = 0; - for (unsigned int i = 0; i < length(); i++) - if (match(i,length(),0,t) >= 0) found++; - return(found); -} - -int String::freq(char c) const -{ - int found = 0; - for (unsigned int i = 0; i < length(); i++) - if (match(i,length(),0,&c,1) >= 0) found++; - return(found); -} - - -int String::OK() const -{ - if (rep == 0 // don't have a rep - || rep->len > rep->sz // string oustide bounds - || rep->s[rep->len] != 0) // not null-terminated - error("invariant failure"); - return 1; -} - -int SubString::OK() const -{ - int v = S != (const char*)0; // have a String; - v &= S.OK(); // that is legal - v &= pos + len >= S.rep->len;// pos and len within bounds - if (!v) S.error("SubString invariant failure"); - return v; -} - diff --git a/gnu/lib/libg++/libg++/src/String.h b/gnu/lib/libg++/libg++/src/String.h deleted file mode 100644 index b3bfd707cf3..00000000000 --- a/gnu/lib/libg++/libg++/src/String.h +++ /dev/null @@ -1,1284 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -#ifndef _String_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _String_h 1 - -#include <iostream.h> -#include <Regex.h> - -#undef OK - -struct StrRep // internal String representations -{ - unsigned short len; // string length - unsigned short sz; // allocated space - char s[1]; // the string starts here - // (at least 1 char for trailing null) - // allocated & expanded via non-public fcts -}; - -// primitive ops on StrReps -- nearly all String fns go through these. - -StrRep* Salloc(StrRep*, const char*, int, int); -StrRep* Scopy(StrRep*, const StrRep*); -StrRep* Scat(StrRep*, const char*, int, const char*, int); -StrRep* Scat(StrRep*, const char*, int,const char*,int, const char*,int); -StrRep* Sprepend(StrRep*, const char*, int); -StrRep* Sreverse(const StrRep*, StrRep*); -StrRep* Supcase(const StrRep*, StrRep*); -StrRep* Sdowncase(const StrRep*, StrRep*); -StrRep* Scapitalize(const StrRep*, StrRep*); - -// These classes need to be defined in the order given - -class String; -class SubString; - -class SubString -{ - friend class String; -protected: - - String& S; // The String I'm a substring of - unsigned short pos; // starting position in S's rep - unsigned short len; // length of substring - - void assign(const StrRep*, const char*, int = -1); - SubString(String& x, int p, int l); - SubString(const SubString& x); - -public: - -// Note there are no public constructors. SubStrings are always -// created via String operations - - ~SubString(); - - SubString& operator = (const String& y); - SubString& operator = (const SubString& y); - SubString& operator = (const char* t); - SubString& operator = (char c); - -// return 1 if target appears anywhere in SubString; else 0 - - int contains(char c) const; - int contains(const String& y) const; - int contains(const SubString& y) const; - int contains(const char* t) const; - int contains(const Regex& r) const; - -// return 1 if target matches entire SubString - - int matches(const Regex& r) const; - -// IO - - friend ostream& operator<<(ostream& s, const SubString& x); - -// status - - unsigned int length() const; - int empty() const; - const char* chars() const; - - int OK() const; - -}; - - -class String -{ - friend class SubString; - -protected: - StrRep* rep; // Strings are pointers to their representations - -// some helper functions - - int search(int, int, const char*, int = -1) const; - int search(int, int, char) const; - int match(int, int, int, const char*, int = -1) const; - int _gsub(const char*, int, const char* ,int); - int _gsub(const Regex&, const char*, int); - SubString _substr(int, int); - -public: - -// constructors & assignment - - String(); - String(const String& x); - String(const SubString& x); - String(const char* t); - String(const char* t, int len); - String(char c); - - ~String(); - - String& operator = (const String& y); - String& operator = (const char* y); - String& operator = (char c); - String& operator = (const SubString& y); - -// concatenation - - String& operator += (const String& y); - String& operator += (const SubString& y); - String& operator += (const char* t); - String& operator += (char c); - - void prepend(const String& y); - void prepend(const SubString& y); - void prepend(const char* t); - void prepend(char c); - - -// procedural versions: -// concatenate first 2 args, store result in last arg - - friend inline void cat(const String&, const String&, String&); - friend inline void cat(const String&, const SubString&, String&); - friend inline void cat(const String&, const char*, String&); - friend inline void cat(const String&, char, String&); - - friend inline void cat(const SubString&, const String&, String&); - friend inline void cat(const SubString&, const SubString&, String&); - friend inline void cat(const SubString&, const char*, String&); - friend inline void cat(const SubString&, char, String&); - - friend inline void cat(const char*, const String&, String&); - friend inline void cat(const char*, const SubString&, String&); - friend inline void cat(const char*, const char*, String&); - friend inline void cat(const char*, char, String&); - -// double concatenation, by request. (yes, there are too many versions, -// but if one is supported, then the others should be too...) -// Concatenate first 3 args, store in last arg - - friend inline void cat(const String&,const String&, const String&,String&); - friend inline void cat(const String&,const String&,const SubString&,String&); - friend inline void cat(const String&,const String&, const char*, String&); - friend inline void cat(const String&,const String&, char, String&); - friend inline void cat(const String&,const SubString&,const String&,String&); - inline friend void cat(const String&,const SubString&,const SubString&,String&); - friend inline void cat(const String&,const SubString&, const char*, String&); - friend inline void cat(const String&,const SubString&, char, String&); - friend inline void cat(const String&,const char*, const String&, String&); - friend inline void cat(const String&,const char*, const SubString&, String&); - friend inline void cat(const String&,const char*, const char*, String&); - friend inline void cat(const String&,const char*, char, String&); - - friend inline void cat(const char*, const String&, const String&,String&); - friend inline void cat(const char*,const String&,const SubString&,String&); - friend inline void cat(const char*,const String&, const char*, String&); - friend inline void cat(const char*,const String&, char, String&); - friend inline void cat(const char*,const SubString&,const String&,String&); - friend inline void cat(const char*,const SubString&,const SubString&,String&); - friend inline void cat(const char*,const SubString&, const char*, String&); - friend inline void cat(const char*,const SubString&, char, String&); - friend inline void cat(const char*,const char*, const String&, String&); - friend inline void cat(const char*,const char*, const SubString&, String&); - friend inline void cat(const char*,const char*, const char*, String&); - friend inline void cat(const char*,const char*, char, String&); - - -// searching & matching - -// return position of target in string or -1 for failure - - int index(char c, int startpos = 0) const; - int index(const String& y, int startpos = 0) const; - int index(const SubString& y, int startpos = 0) const; - int index(const char* t, int startpos = 0) const; - int index(const Regex& r, int startpos = 0) const; - -// return 1 if target appears anyhere in String; else 0 - - int contains(char c) const; - int contains(const String& y) const; - int contains(const SubString& y) const; - int contains(const char* t) const; - int contains(const Regex& r) const; - -// return 1 if target appears anywhere after position pos -// (or before, if pos is negative) in String; else 0 - - int contains(char c, int pos) const; - int contains(const String& y, int pos) const; - int contains(const SubString& y, int pos) const; - int contains(const char* t, int pos) const; - int contains(const Regex& r, int pos) const; - -// return 1 if target appears at position pos in String; else 0 - - int matches(char c, int pos = 0) const; - int matches(const String& y, int pos = 0) const; - int matches(const SubString& y, int pos = 0) const; - int matches(const char* t, int pos = 0) const; - int matches(const Regex& r, int pos = 0) const; - -// return number of occurences of target in String - - int freq(char c) const; - int freq(const String& y) const; - int freq(const SubString& y) const; - int freq(const char* t) const; - -// SubString extraction - -// Note that you can't take a substring of a const String, since -// this leaves open the possiblility of indirectly modifying the -// String through the SubString - - SubString at(int pos, int len); - SubString operator () (int pos, int len); // synonym for at - - SubString at(const String& x, int startpos = 0); - SubString at(const SubString& x, int startpos = 0); - SubString at(const char* t, int startpos = 0); - SubString at(char c, int startpos = 0); - SubString at(const Regex& r, int startpos = 0); - - SubString before(int pos); - SubString before(const String& x, int startpos = 0); - SubString before(const SubString& x, int startpos = 0); - SubString before(const char* t, int startpos = 0); - SubString before(char c, int startpos = 0); - SubString before(const Regex& r, int startpos = 0); - - SubString through(int pos); - SubString through(const String& x, int startpos = 0); - SubString through(const SubString& x, int startpos = 0); - SubString through(const char* t, int startpos = 0); - SubString through(char c, int startpos = 0); - SubString through(const Regex& r, int startpos = 0); - - SubString from(int pos); - SubString from(const String& x, int startpos = 0); - SubString from(const SubString& x, int startpos = 0); - SubString from(const char* t, int startpos = 0); - SubString from(char c, int startpos = 0); - SubString from(const Regex& r, int startpos = 0); - - SubString after(int pos); - SubString after(const String& x, int startpos = 0); - SubString after(const SubString& x, int startpos = 0); - SubString after(const char* t, int startpos = 0); - SubString after(char c, int startpos = 0); - SubString after(const Regex& r, int startpos = 0); - - -// deletion - -// delete len chars starting at pos - void del(int pos, int len); - -// delete the first occurrence of target after startpos - - void del(const String& y, int startpos = 0); - void del(const SubString& y, int startpos = 0); - void del(const char* t, int startpos = 0); - void del(char c, int startpos = 0); - void del(const Regex& r, int startpos = 0); - -// global substitution: substitute all occurrences of pat with repl - - int gsub(const String& pat, const String& repl); - int gsub(const SubString& pat, const String& repl); - int gsub(const char* pat, const String& repl); - int gsub(const char* pat, const char* repl); - int gsub(const Regex& pat, const String& repl); - -// friends & utilities - -// split string into array res at separators; return number of elements - - friend int split(const String& x, String res[], int maxn, - const String& sep); - friend int split(const String& x, String res[], int maxn, - const Regex& sep); - - friend String common_prefix(const String& x, const String& y, - int startpos = 0); - friend String common_suffix(const String& x, const String& y, - int startpos = -1); - friend String replicate(char c, int n); - friend String replicate(const String& y, int n); - friend String join(String src[], int n, const String& sep); - -// simple builtin transformations - - friend inline String reverse(const String& x); - friend inline String upcase(const String& x); - friend inline String downcase(const String& x); - friend inline String capitalize(const String& x); - -// in-place versions of above - - void reverse(); - void upcase(); - void downcase(); - void capitalize(); - -// element extraction - - char& operator [] (int i); - const char& operator [] (int i) const; - char elem(int i) const; - char firstchar() const; - char lastchar() const; - -// conversion - - operator const char*() const; - const char* chars() const; - - -// IO - - friend inline ostream& operator<<(ostream& s, const String& x); - friend ostream& operator<<(ostream& s, const SubString& x); - friend istream& operator>>(istream& s, String& x); - - friend int readline(istream& s, String& x, - char terminator = '\n', - int discard_terminator = 1); - -// status - - unsigned int length() const; - int empty() const; - -// preallocate some space for String - void alloc(int newsize); - -// report current allocation (not length!) - - int allocation() const; - - - void error(const char* msg) const; - - int OK() const; -}; - -typedef String StrTmp; // for backward compatibility - -// other externs - -int compare(const String& x, const String& y); -int compare(const String& x, const SubString& y); -int compare(const String& x, const char* y); -int compare(const SubString& x, const String& y); -int compare(const SubString& x, const SubString& y); -int compare(const SubString& x, const char* y); -int fcompare(const String& x, const String& y); // ignore case - -extern StrRep _nilStrRep; -extern String _nilString; - -// status reports, needed before defining other things - -inline unsigned int String::length() const { return rep->len; } -inline int String::empty() const { return rep->len == 0; } -inline const char* String::chars() const { return &(rep->s[0]); } -inline int String::allocation() const { return rep->sz; } - -inline unsigned int SubString::length() const { return len; } -inline int SubString::empty() const { return len == 0; } -inline const char* SubString::chars() const { return &(S.rep->s[pos]); } - - -// constructors - -inline String::String() - : rep(&_nilStrRep) {} -inline String::String(const String& x) - : rep(Scopy(0, x.rep)) {} -inline String::String(const char* t) - : rep(Salloc(0, t, -1, -1)) {} -inline String::String(const char* t, int tlen) - : rep(Salloc(0, t, tlen, tlen)) {} -inline String::String(const SubString& y) - : rep(Salloc(0, y.chars(), y.length(), y.length())) {} -inline String::String(char c) - : rep(Salloc(0, &c, 1, 1)) {} - -inline String::~String() { if (rep != &_nilStrRep) delete rep; } - -inline SubString::SubString(const SubString& x) - :S(x.S), pos(x.pos), len(x.len) {} -inline SubString::SubString(String& x, int first, int l) - :S(x), pos(first), len(l) {} - -inline SubString::~SubString() {} - -// assignment - -inline String& String::operator = (const String& y) -{ - rep = Scopy(rep, y.rep); - return *this; -} - -inline String& String::operator=(const char* t) -{ - rep = Salloc(rep, t, -1, -1); - return *this; -} - -inline String& String::operator=(const SubString& y) -{ - rep = Salloc(rep, y.chars(), y.length(), y.length()); - return *this; -} - -inline String& String::operator=(char c) -{ - rep = Salloc(rep, &c, 1, 1); - return *this; -} - - -inline SubString& SubString::operator = (const char* ys) -{ - assign(0, ys); - return *this; -} - -inline SubString& SubString::operator = (char ch) -{ - assign(0, &ch, 1); - return *this; -} - -inline SubString& SubString::operator = (const String& y) -{ - assign(y.rep, y.chars(), y.length()); - return *this; -} - -inline SubString& SubString::operator = (const SubString& y) -{ - assign(y.S.rep, y.chars(), y.length()); - return *this; -} - -// Zillions of cats... - -inline void cat(const String& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y, -1); -} - -inline void cat(const String& x, char y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), &y, 1); -} - -inline void cat(const SubString& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const SubString& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const SubString& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), y, -1); -} - -inline void cat(const SubString& x, char y, String& r) -{ - r.rep = Scat(r.rep, x.chars(), x.length(), &y, 1); -} - -inline void cat(const char* x, const String& y, String& r) -{ - r.rep = Scat(r.rep, x, -1, y.chars(), y.length()); -} - -inline void cat(const char* x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, x, -1, y.chars(), y.length()); -} - -inline void cat(const char* x, const char* y, String& r) -{ - r.rep = Scat(r.rep, x, -1, y, -1); -} - -inline void cat(const char* x, char y, String& r) -{ - r.rep = Scat(r.rep, x, -1, &y, 1); -} - -inline void cat(const String& a, const String& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& a, const String& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& a, const String& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y, -1); -} - -inline void cat(const String& a, const String& x, char y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), &y, 1); -} - -inline void cat(const String& a, const SubString& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& a, const SubString& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const String& a, const SubString& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y, -1); -} - -inline void cat(const String& a, const SubString& x, char y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), &y, 1); -} - -inline void cat(const String& a, const char* x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y.chars(), y.length()); -} - -inline void cat(const String& a, const char* x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y.chars(), y.length()); -} - -inline void cat(const String& a, const char* x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y, -1); -} - -inline void cat(const String& a, const char* x, char y, String& r) -{ - r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, &y, 1); -} - - -inline void cat(const char* a, const String& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const char* a, const String& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const char* a, const String& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y, -1); -} - -inline void cat(const char* a, const String& x, char y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), &y, 1); -} - -inline void cat(const char* a, const SubString& x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const char* a, const SubString& x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length()); -} - -inline void cat(const char* a, const SubString& x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y, -1); -} - -inline void cat(const char* a, const SubString& x, char y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), &y, 1); -} - -inline void cat(const char* a, const char* x, const String& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x, -1, y.chars(), y.length()); -} - -inline void cat(const char* a, const char* x, const SubString& y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x, -1, y.chars(), y.length()); -} - -inline void cat(const char* a, const char* x, const char* y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x, -1, y, -1); -} - -inline void cat(const char* a, const char* x, char y, String& r) -{ - r.rep = Scat(r.rep, a, -1, x, -1, &y, 1); -} - - -// operator versions - -inline String& String::operator +=(const String& y) -{ - cat(*this, y, *this); - return *this; -} - -inline String& String::operator +=(const SubString& y) -{ - cat(*this, y, *this); - return *this; -} - -inline String& String::operator += (const char* y) -{ - cat(*this, y, *this); - return *this; -} - -inline String& String:: operator +=(char y) -{ - cat(*this, y, *this); - return *this; -} - -// constructive concatenation - -#if defined(__GNUG__) && !defined(_G_NO_NRV) - -inline String operator + (const String& x, const String& y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const String& x, const SubString& y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const String& x, const char* y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const String& x, char y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const SubString& x, const String& y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const SubString& x, const SubString& y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const SubString& x, const char* y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const SubString& x, char y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const char* x, const String& y) return r; -{ - cat(x, y, r); -} - -inline String operator + (const char* x, const SubString& y) return r; -{ - cat(x, y, r); -} - -inline String reverse(const String& x) return r; -{ - r.rep = Sreverse(x.rep, r.rep); -} - -inline String upcase(const String& x) return r; -{ - r.rep = Supcase(x.rep, r.rep); -} - -inline String downcase(const String& x) return r; -{ - r.rep = Sdowncase(x.rep, r.rep); -} - -inline String capitalize(const String& x) return r; -{ - r.rep = Scapitalize(x.rep, r.rep); -} - -#else /* NO_NRV */ - -inline String operator + (const String& x, const String& y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const String& x, const SubString& y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const String& x, const char* y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const String& x, char y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const SubString& x, const String& y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const SubString& x, const SubString& y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const SubString& x, const char* y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const SubString& x, char y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const char* x, const String& y) -{ - String r; cat(x, y, r); return r; -} - -inline String operator + (const char* x, const SubString& y) -{ - String r; cat(x, y, r); return r; -} - -inline String reverse(const String& x) -{ - String r; r.rep = Sreverse(x.rep, r.rep); return r; -} - -inline String upcase(const String& x) -{ - String r; r.rep = Supcase(x.rep, r.rep); return r; -} - -inline String downcase(const String& x) -{ - String r; r.rep = Sdowncase(x.rep, r.rep); return r; -} - -inline String capitalize(const String& x) -{ - String r; r.rep = Scapitalize(x.rep, r.rep); return r; -} - -#endif - -// prepend - -inline void String::prepend(const String& y) -{ - rep = Sprepend(rep, y.chars(), y.length()); -} - -inline void String::prepend(const char* y) -{ - rep = Sprepend(rep, y, -1); -} - -inline void String::prepend(char y) -{ - rep = Sprepend(rep, &y, 1); -} - -inline void String::prepend(const SubString& y) -{ - rep = Sprepend(rep, y.chars(), y.length()); -} - -// misc transformations - - -inline void String::reverse() -{ - rep = Sreverse(rep, rep); -} - - -inline void String::upcase() -{ - rep = Supcase(rep, rep); -} - - -inline void String::downcase() -{ - rep = Sdowncase(rep, rep); -} - - -inline void String::capitalize() -{ - rep = Scapitalize(rep, rep); -} - -// element extraction - -inline char& String::operator [] (int i) -{ - if (((unsigned)i) >= length()) error("invalid index"); - return rep->s[i]; -} - -inline const char& String::operator [] (int i) const -{ - if (((unsigned)i) >= length()) error("invalid index"); - return rep->s[i]; -} - -inline char String::elem (int i) const -{ - if (((unsigned)i) >= length()) error("invalid index"); - return rep->s[i]; -} - -inline char String::firstchar() const -{ - return elem(0); -} - -inline char String::lastchar() const -{ - return elem(length() - 1); -} - -// searching - -inline int String::index(char c, int startpos) const -{ - return search(startpos, length(), c); -} - -inline int String::index(const char* t, int startpos) const -{ - return search(startpos, length(), t); -} - -inline int String::index(const String& y, int startpos) const -{ - return search(startpos, length(), y.chars(), y.length()); -} - -inline int String::index(const SubString& y, int startpos) const -{ - return search(startpos, length(), y.chars(), y.length()); -} - -inline int String::index(const Regex& r, int startpos) const -{ - int unused; return r.search(chars(), length(), unused, startpos); -} - -inline int String::contains(char c) const -{ - return search(0, length(), c) >= 0; -} - -inline int String::contains(const char* t) const -{ - return search(0, length(), t) >= 0; -} - -inline int String::contains(const String& y) const -{ - return search(0, length(), y.chars(), y.length()) >= 0; -} - -inline int String::contains(const SubString& y) const -{ - return search(0, length(), y.chars(), y.length()) >= 0; -} - -inline int String::contains(char c, int p) const -{ - return match(p, length(), 0, &c, 1) >= 0; -} - -inline int String::contains(const char* t, int p) const -{ - return match(p, length(), 0, t) >= 0; -} - -inline int String::contains(const String& y, int p) const -{ - return match(p, length(), 0, y.chars(), y.length()) >= 0; -} - -inline int String::contains(const SubString& y, int p) const -{ - return match(p, length(), 0, y.chars(), y.length()) >= 0; -} - -inline int String::contains(const Regex& r) const -{ - int unused; return r.search(chars(), length(), unused, 0) >= 0; -} - -inline int String::contains(const Regex& r, int p) const -{ - return r.match(chars(), length(), p) >= 0; -} - - -inline int String::matches(const SubString& y, int p) const -{ - return match(p, length(), 1, y.chars(), y.length()) >= 0; -} - -inline int String::matches(const String& y, int p) const -{ - return match(p, length(), 1, y.chars(), y.length()) >= 0; -} - -inline int String::matches(const char* t, int p) const -{ - return match(p, length(), 1, t) >= 0; -} - -inline int String::matches(char c, int p) const -{ - return match(p, length(), 1, &c, 1) >= 0; -} - -inline int String::matches(const Regex& r, int p) const -{ - int l = (p < 0)? -p : length() - p; - return r.match(chars(), length(), p) == l; -} - - -inline int SubString::contains(const char* t) const -{ - return S.search(pos, pos+len, t) >= 0; -} - -inline int SubString::contains(const String& y) const -{ - return S.search(pos, pos+len, y.chars(), y.length()) >= 0; -} - -inline int SubString::contains(const SubString& y) const -{ - return S.search(pos, pos+len, y.chars(), y.length()) >= 0; -} - -inline int SubString::contains(char c) const -{ - return S.search(pos, pos+len, c) >= 0; -} - -inline int SubString::contains(const Regex& r) const -{ - int unused; return r.search(chars(), len, unused, 0) >= 0; -} - -inline int SubString::matches(const Regex& r) const -{ - return r.match(chars(), len, 0) == len; -} - - -inline int String::gsub(const String& pat, const String& r) -{ - return _gsub(pat.chars(), pat.length(), r.chars(), r.length()); -} - -inline int String::gsub(const SubString& pat, const String& r) -{ - return _gsub(pat.chars(), pat.length(), r.chars(), r.length()); -} - -inline int String::gsub(const Regex& pat, const String& r) -{ - return _gsub(pat, r.chars(), r.length()); -} - -inline int String::gsub(const char* pat, const String& r) -{ - return _gsub(pat, -1, r.chars(), r.length()); -} - -inline int String::gsub(const char* pat, const char* r) -{ - return _gsub(pat, -1, r, -1); -} - - - -inline ostream& operator<<(ostream& s, const String& x) -{ - s << x.chars(); return s; -} - -// a zillion comparison operators - -inline int operator==(const String& x, const String& y) -{ - return compare(x, y) == 0; -} - -inline int operator!=(const String& x, const String& y) -{ - return compare(x, y) != 0; -} - -inline int operator>(const String& x, const String& y) -{ - return compare(x, y) > 0; -} - -inline int operator>=(const String& x, const String& y) -{ - return compare(x, y) >= 0; -} - -inline int operator<(const String& x, const String& y) -{ - return compare(x, y) < 0; -} - -inline int operator<=(const String& x, const String& y) -{ - return compare(x, y) <= 0; -} - -inline int operator==(const String& x, const SubString& y) -{ - return compare(x, y) == 0; -} - -inline int operator!=(const String& x, const SubString& y) -{ - return compare(x, y) != 0; -} - -inline int operator>(const String& x, const SubString& y) -{ - return compare(x, y) > 0; -} - -inline int operator>=(const String& x, const SubString& y) -{ - return compare(x, y) >= 0; -} - -inline int operator<(const String& x, const SubString& y) -{ - return compare(x, y) < 0; -} - -inline int operator<=(const String& x, const SubString& y) -{ - return compare(x, y) <= 0; -} - -inline int operator==(const String& x, const char* t) -{ - return compare(x, t) == 0; -} - -inline int operator!=(const String& x, const char* t) -{ - return compare(x, t) != 0; -} - -inline int operator>(const String& x, const char* t) -{ - return compare(x, t) > 0; -} - -inline int operator>=(const String& x, const char* t) -{ - return compare(x, t) >= 0; -} - -inline int operator<(const String& x, const char* t) -{ - return compare(x, t) < 0; -} - -inline int operator<=(const String& x, const char* t) -{ - return compare(x, t) <= 0; -} - -inline int operator==(const SubString& x, const String& y) -{ - return compare(y, x) == 0; -} - -inline int operator!=(const SubString& x, const String& y) -{ - return compare(y, x) != 0; -} - -inline int operator>(const SubString& x, const String& y) -{ - return compare(y, x) < 0; -} - -inline int operator>=(const SubString& x, const String& y) -{ - return compare(y, x) <= 0; -} - -inline int operator<(const SubString& x, const String& y) -{ - return compare(y, x) > 0; -} - -inline int operator<=(const SubString& x, const String& y) -{ - return compare(y, x) >= 0; -} - -inline int operator==(const SubString& x, const SubString& y) -{ - return compare(x, y) == 0; -} - -inline int operator!=(const SubString& x, const SubString& y) -{ - return compare(x, y) != 0; -} - -inline int operator>(const SubString& x, const SubString& y) -{ - return compare(x, y) > 0; -} - -inline int operator>=(const SubString& x, const SubString& y) -{ - return compare(x, y) >= 0; -} - -inline int operator<(const SubString& x, const SubString& y) -{ - return compare(x, y) < 0; -} - -inline int operator<=(const SubString& x, const SubString& y) -{ - return compare(x, y) <= 0; -} - -inline int operator==(const SubString& x, const char* t) -{ - return compare(x, t) == 0; -} - -inline int operator!=(const SubString& x, const char* t) -{ - return compare(x, t) != 0; -} - -inline int operator>(const SubString& x, const char* t) -{ - return compare(x, t) > 0; -} - -inline int operator>=(const SubString& x, const char* t) -{ - return compare(x, t) >= 0; -} - -inline int operator<(const SubString& x, const char* t) -{ - return compare(x, t) < 0; -} - -inline int operator<=(const SubString& x, const char* t) -{ - return compare(x, t) <= 0; -} - - -// a helper needed by at, before, etc. - -inline SubString String::_substr(int first, int l) -{ - if (first < 0 || (unsigned)(first + l) > length() ) - return SubString(_nilString, 0, 0) ; - else - return SubString(*this, first, l); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Uniform.cc b/gnu/lib/libg++/libg++/src/Uniform.cc deleted file mode 100644 index 0592b6d9781..00000000000 --- a/gnu/lib/libg++/libg++/src/Uniform.cc +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Uniform.h> - -double Uniform::operator()() -{ - return( pLow + delta * pGenerator -> asDouble() ); -} diff --git a/gnu/lib/libg++/libg++/src/Uniform.h b/gnu/lib/libg++/libg++/src/Uniform.h deleted file mode 100644 index 1a365b9a774..00000000000 --- a/gnu/lib/libg++/libg++/src/Uniform.h +++ /dev/null @@ -1,71 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Uniform_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Uniform_h 1 - -#include <Random.h> - -// -// The interval [lo..hi] -// - -class Uniform: public Random { - double pLow; - double pHigh; - double delta; -public: - Uniform(double low, double high, RNG *gen); - - double low(); - double low(double x); - double high(); - double high(double x); - - virtual double operator()(); -}; - - -inline Uniform::Uniform(double low, double high, RNG *gen) : Random(gen) -{ - pLow = (low < high) ? low : high; - pHigh = (low < high) ? high : low; - delta = pHigh - pLow; -} - -inline double Uniform::low() { return pLow; } - -inline double Uniform::low(double x) { - double tmp = pLow; - pLow = x; - delta = pHigh - pLow; - return tmp; -} - -inline double Uniform::high() { return pHigh; } - -inline double Uniform::high(double x) { - double tmp = pHigh; - pHigh = x; - delta = pHigh - pLow; - return tmp; -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/Weibull.cc b/gnu/lib/libg++/libg++/src/Weibull.cc deleted file mode 100644 index d7987f5ece0..00000000000 --- a/gnu/lib/libg++/libg++/src/Weibull.cc +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <Random.h> -#include <Weibull.h> - -// -// See Simulation, Modelling & Analysis by Law & Kelton, pp259 -// -// This is the ``polar'' method. -// - -double Weibull::operator()() -{ - return( pow(pBeta * ( - log(1 - pGenerator -> asDouble()) ), pInvAlpha) ); -} diff --git a/gnu/lib/libg++/libg++/src/Weibull.h b/gnu/lib/libg++/libg++/src/Weibull.h deleted file mode 100644 index fd064d5e619..00000000000 --- a/gnu/lib/libg++/libg++/src/Weibull.h +++ /dev/null @@ -1,74 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Dirk Grunwald (grunwald@cs.uiuc.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Weibull_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _Weibull_h - -#include <Random.h> - -class Weibull: public Random { -protected: - double pAlpha; - double pInvAlpha; - double pBeta; - - void setState(); - -public: - Weibull(double alpha, double beta, RNG *gen); - - double alpha(); - double alpha(double x); - - double beta(); - double beta(double x); - - virtual double operator()(); -}; - - -inline void Weibull::setState() { - pInvAlpha = 1.0 / pAlpha; -} - -inline Weibull::Weibull(double alpha, double beta, RNG *gen) : Random(gen) -{ - pAlpha = alpha; - pBeta = beta; - setState(); -} - -inline double Weibull::alpha() { return pAlpha; } - -inline double Weibull::alpha(double x) { - double tmp = pAlpha; - pAlpha = x; - setState(); - return tmp; -} - -inline double Weibull::beta() { return pBeta; }; -inline double Weibull::beta(double x) { - double tmp = pBeta; - pBeta = x; - return tmp; -}; - -#endif diff --git a/gnu/lib/libg++/libg++/src/bitand.c b/gnu/lib/libg++/libg++/src/bitand.c deleted file mode 100644 index 149a8ab7386..00000000000 --- a/gnu/lib/libg++/libg++/src/bitand.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com). */ - -#include "bitprims.h" - -/* Copy LENGTH bits from (starting at SRCBIT) into pdst starting at DSTBIT. - This will work even if psrc & pdst overlap. */ - -void -_BS_and (pdst, dstbit, psrc, srcbit, length) - register _BS_word* pdst; - int dstbit; - register const _BS_word* psrc; - int srcbit; - _BS_size_t length; -{ -#define COMBINE(dst, src) (dst) & (src) -#include "bitdo2.h" -} diff --git a/gnu/lib/libg++/libg++/src/bitany.c b/gnu/lib/libg++/libg++/src/bitany.c deleted file mode 100644 index 5a978d030d9..00000000000 --- a/gnu/lib/libg++/libg++/src/bitany.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" - -int -_BS_any (ptr, offset, length) - register const _BS_word *ptr; - int offset; - _BS_size_t length; -{ -#undef DOIT -#define DOIT(WORD, MASK) if ((WORD) & (MASK)) return 1; -#include "bitdo1.h" - return 0; -} diff --git a/gnu/lib/libg++/libg++/src/bitblt.c b/gnu/lib/libg++/libg++/src/bitblt.c deleted file mode 100644 index b38fd3d9eb1..00000000000 --- a/gnu/lib/libg++/libg++/src/bitblt.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com). - Based on ideas in the X11 MFB server. */ - -#include "bitprims.h" -#define ONES ((_BS_word)(~0)) - -/* Copy LENGTH bits from (starting at SRCBIT) into pdst starting at DSTBIT. - This will work even if psrc & pdst overlap. */ - -void -_BS_blt (op, pdst, dstbit, psrc, srcbit, length) - enum _BS_alu op; - register _BS_word* pdst; - int dstbit; - register const _BS_word* psrc; - int srcbit; - _BS_size_t length; -{ - _BS_word ca1, cx1, ca2, cx2; - switch (op) - { - case _BS_alu_clear: - _BS_clear (pdst, dstbit, length); - return; - case _BS_alu_and: - _BS_and (pdst, dstbit, psrc, srcbit, length); - return; - case _BS_alu_andReverse: - ca1 = ONES; cx1 = 0; ca2 = ONES; cx2 = 0; - break; - case _BS_alu_copy: - _BS_copy (pdst, dstbit, psrc, srcbit, length); - return; - case _BS_alu_andInverted: - ca1 = ONES; cx1 = ONES; ca2 = 0; cx2 = 0; - break; - case _BS_alu_noop: - return; - case _BS_alu_xor: - _BS_xor (pdst, dstbit, psrc, srcbit, length); - return; - case _BS_alu_or: - ca1 = ONES; cx1 = ONES; ca2 = ONES; cx2 = 0; - break; - case _BS_alu_nor: - ca1 = ONES; cx1 = ONES; ca2 = ONES; cx2 = ONES; - break; - case_BS_alu_equiv: - ca1 = 0; cx1 = ONES; ca2 = ONES; cx2 = ONES; - break; - case _BS_alu_invert: - _BS_invert (pdst, dstbit, length); - return; - case _BS_alu_orReverse: - ca1 = ONES; cx1 = ONES; ca2 = 0; cx2 = ONES; - break; - case _BS_alu_copyInverted: - ca1 = 0; cx1 = 0; ca2 = ONES; cx2 = ONES; - break; - case _BS_alu_orInverted: - ca1 = ONES; cx1 = 0; ca2 = ONES; cx2 = ONES; - break; - case _BS_alu_nand: - ca1 = ONES; cx1 = 0; ca2 = 0; cx2 = ONES; - break; - case _BS_alu_set: - _BS_set (pdst, dstbit, length); - return; - } - { -#define COMBINE(dst, src) ((dst) & ((src) & ca1 ^ cx1) ^ ((src) & ca2 ^ cx2)) -#include "bitdo2.h" - } -} diff --git a/gnu/lib/libg++/libg++/src/bitclear.c b/gnu/lib/libg++/libg++/src/bitclear.c deleted file mode 100644 index 6dd94059ad6..00000000000 --- a/gnu/lib/libg++/libg++/src/bitclear.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" - -void -_BS_clear (ptr, offset, length) - register _BS_word *ptr; - int offset; - _BS_size_t length; -{ -#undef DOIT -#define DOIT(WORD, MASK) ((WORD) &= ~(MASK)) -#include "bitdo1.h" -} diff --git a/gnu/lib/libg++/libg++/src/bitcopy.c b/gnu/lib/libg++/libg++/src/bitcopy.c deleted file mode 100644 index aa48730e8d6..00000000000 --- a/gnu/lib/libg++/libg++/src/bitcopy.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com). */ - -#include "bitprims.h" - -/* Copy LENGTH bits from (starting at SRCBIT) into pdst starting at DSTBIT. - This will work even if psrc & pdst overlap. */ - -void -_BS_copy (pdst, dstbit, psrc, srcbit, length) - register _BS_word* pdst; - int dstbit; - register const _BS_word* psrc; - int srcbit; - _BS_size_t length; -{ -#define COMBINE(dst, src) (src) -#include "bitdo2.h" -} diff --git a/gnu/lib/libg++/libg++/src/bitcount.c b/gnu/lib/libg++/libg++/src/bitcount.c deleted file mode 100644 index 9583a827e4a..00000000000 --- a/gnu/lib/libg++/libg++/src/bitcount.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" - -/* bit_count[I] is number of '1' bits in I. */ -static const unsigned char -four_bit_count[16] = { - 0, 1, 1, 2, - 1, 2, 2, 3, - 1, 2, 2, 3, - 2, 3, 3, 4}; - -#if !defined(inline) && !defined(__GNUC__) && !defined(__cplusplus) -#define inline -#endif - -static inline int -_BS_count_word (word) - register _BS_word word; -{ - register int count = 0; - while (word > 0) - { - count += four_bit_count[word & 15]; - word >>= 4; - } - return count; -} - -int -_BS_count (ptr, offset, length) - register const _BS_word *ptr; - int offset; - _BS_size_t length; -{ - register int count = 0; -#undef DOIT -#define DOIT(WORD, MASK) count += _BS_count_word ((WORD) & (MASK)); -#include "bitdo1.h" - return count; -} diff --git a/gnu/lib/libg++/libg++/src/bitdo1.h b/gnu/lib/libg++/libg++/src/bitdo1.h deleted file mode 100644 index c234d41d406..00000000000 --- a/gnu/lib/libg++/libg++/src/bitdo1.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef ONES -#define ONES ((_BS_word)(~0L)) -#endif - register int nwords; - register _BS_word mask; - if (offset == 0) - ; - else if (offset + length >= _BS_BITS_PER_WORD) - { - mask = ONES _BS_RIGHT offset; - DOIT(*ptr++, mask); - length -= _BS_BITS_PER_WORD - offset; - } - else - { - mask = (ONES _BS_RIGHT (_BS_BITS_PER_WORD - length)) - _BS_LEFT (_BS_BITS_PER_WORD - length - offset); - DOIT(*ptr, mask); - goto done; - } - nwords = _BS_INDEX(length); - while (--nwords >= 0) - { - DOIT(*ptr++, ONES); - } - length = _BS_POS (length); - if (length) - { - mask = ONES _BS_LEFT (_BS_BITS_PER_WORD - length); - DOIT(*ptr, mask); - } - done: ; diff --git a/gnu/lib/libg++/libg++/src/bitdo2.h b/gnu/lib/libg++/libg++/src/bitdo2.h deleted file mode 100644 index 6e995235372..00000000000 --- a/gnu/lib/libg++/libg++/src/bitdo2.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef ONES -#define ONES ((_BS_word)(~0L)) -#endif - -#ifndef DOIT_SOLID -#ifdef DOIT -#define DOIT_SOLID(dst, src) DOIT(dst, src, (_BS_word)(~0)) -#else -#define DOIT_SOLID(dst, src) (dst) = (COMBINE(dst, src)) -#endif -#endif - -#ifndef DOIT -#define DOIT(dst, src, mask) \ - (dst) = ((COMBINE(dst, src)) & (mask)) | ((dst) & ~(mask)) -#endif - - _BS_word word0, mask; - int shift0, shift1; - - if (length == 0) - goto done; - - shift0 = srcbit - dstbit; - - /* First handle the case that only one destination word is touched. */ - if (length + dstbit <= _BS_BITS_PER_WORD) - { - _BS_word mask - = (ONES _BS_LEFT (_BS_BITS_PER_WORD - length)) _BS_RIGHT dstbit; - _BS_word word0 = *psrc++; - if (shift0 <= 0) /* dstbit >= srcbit */ - { - word0 = word0 _BS_RIGHT (-shift0); - } - else - { - word0 = word0 _BS_LEFT shift0; - if (length + srcbit > _BS_BITS_PER_WORD) - word0 = word0 | (*psrc _BS_RIGHT (_BS_BITS_PER_WORD - shift0)); - } - DOIT(*pdst, word0, mask); - goto done; - } - - /* Next optimize the case that the source and destination are aligned. */ - if (shift0 == 0) - { - _BS_word mask; - if (psrc > pdst) - { - if (srcbit) - { - mask = ONES _BS_RIGHT srcbit; - DOIT(*pdst, *psrc, mask); - pdst++; psrc++; - length -= _BS_BITS_PER_WORD - srcbit; - } - for (; length >= _BS_BITS_PER_WORD; length -= _BS_BITS_PER_WORD) - { - DOIT_SOLID(*pdst, *psrc); - pdst++; psrc++; - } - if (length) - { - mask = ONES _BS_LEFT (_BS_BITS_PER_WORD - length); - DOIT(*pdst, *psrc, mask); - } - } - else if (psrc < pdst) - { - _BS_size_t span = srcbit + length; - pdst += span / (_BS_size_t)_BS_BITS_PER_WORD; - psrc += span / (_BS_size_t)_BS_BITS_PER_WORD; - span %= (_BS_size_t)_BS_BITS_PER_WORD; - if (span) - { - mask = ONES _BS_LEFT (_BS_BITS_PER_WORD - span); - DOIT(*pdst, *psrc, mask); - length -= span; - } - pdst--; psrc--; - for (; length >= _BS_BITS_PER_WORD; length -= _BS_BITS_PER_WORD) - { - DOIT_SOLID(*pdst, *psrc); - pdst--; psrc--; - } - if (srcbit) - { - mask = ONES _BS_RIGHT srcbit; - DOIT(*pdst, *psrc, mask); - } - } - /* else if (psrc == pdst) --nothing to do--; */ - goto done; - } - - /* Now we assume shift!=0, and more than on destination word is changed. */ - if (psrc >= pdst) /* Do the updates in forward direction. */ - { - _BS_word word0 = *psrc++; - _BS_word mask = ONES _BS_RIGHT dstbit; - if (shift0 > 0) - { - _BS_word word1 = *psrc++; - shift1 = _BS_BITS_PER_WORD - shift0; - DOIT(*pdst, (word0 _BS_LEFT shift0) | (word1 _BS_RIGHT shift1), mask); - word0 = word1; - } - else /* dstbit > srcbit */ - { - shift1 = -shift0; - shift0 += _BS_BITS_PER_WORD; - DOIT(*pdst, word0 _BS_RIGHT shift1, mask); - } - pdst++; - length -= _BS_BITS_PER_WORD - dstbit; - - for ( ; length >= _BS_BITS_PER_WORD; length -= _BS_BITS_PER_WORD) - { - register _BS_word word1 = *psrc++; - DOIT_SOLID(*pdst, - (word0 _BS_LEFT shift0) | (word1 _BS_RIGHT shift1)); - pdst++; - word0 = word1; - } - if (length > 0) - { - _BS_size_t mask = ONES _BS_LEFT (_BS_BITS_PER_WORD - length); - word0 = word0 _BS_LEFT shift0; - if (length > shift1) - word0 = word0 | (*psrc _BS_RIGHT shift1) ; - DOIT (*pdst, word0, mask); - } - } - else /* Do the updates in backward direction. */ - { - _BS_word word0; - - /* Make (psrc, srcbit) and (pdst, dstbit) point to *last* bit. */ - psrc += (srcbit + length - 1) / _BS_BITS_PER_WORD; - srcbit = (srcbit + length - 1) % _BS_BITS_PER_WORD; - pdst += (dstbit + length - 1) / _BS_BITS_PER_WORD; - dstbit = (dstbit + length - 1) % _BS_BITS_PER_WORD; - - shift0 = srcbit - dstbit; - - word0 = *psrc--; - mask = ONES _BS_LEFT (_BS_BITS_PER_WORD - 1 - dstbit); - if (shift0 < 0) - { - _BS_word word1 = *psrc--; - shift1 = -shift0; - shift0 += _BS_BITS_PER_WORD; - DOIT (*pdst, (word0 _BS_RIGHT shift1) | (word1 _BS_LEFT shift0), - mask); - word0 = word1; - } - else - { - shift1 = _BS_BITS_PER_WORD - shift0; - DOIT(*pdst, word0 _BS_LEFT shift0, mask); - } - pdst--; - length -= dstbit + 1; - - for ( ; length >= _BS_BITS_PER_WORD; length -= _BS_BITS_PER_WORD) - { - register _BS_word word1 = *psrc--; - DOIT_SOLID(*pdst, - (word0 _BS_RIGHT shift1) | (word1 _BS_LEFT shift0)); - pdst--; - word0 = word1; - } - if (length > 0) - { - _BS_size_t mask = ONES _BS_RIGHT (_BS_BITS_PER_WORD - length); - word0 = word0 _BS_RIGHT shift1; - if (length > shift0) - word0 = word0 | (*psrc _BS_LEFT shift0) ; - DOIT (*pdst, word0, mask); - } - } - done: ; diff --git a/gnu/lib/libg++/libg++/src/bitinvert.c b/gnu/lib/libg++/libg++/src/bitinvert.c deleted file mode 100644 index 558c397838c..00000000000 --- a/gnu/lib/libg++/libg++/src/bitinvert.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" - -void -_BS_invert (ptr, offset, length) - register _BS_word *ptr; - int offset; - _BS_size_t length; -{ -#undef DOIT -#define DOIT(WORD, MASK) ((WORD) ^= (MASK)) -#include "bitdo1.h" -} diff --git a/gnu/lib/libg++/libg++/src/bitlcomp.c b/gnu/lib/libg++/libg++/src/bitlcomp.c deleted file mode 100644 index 3fbfdb72c83..00000000000 --- a/gnu/lib/libg++/libg++/src/bitlcomp.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" -#include <stdlib.h> - -/* Return -1, 0, 1 depending on whether (ptr0, len0) is - lexicographically less than, equal, or greater than (ptr1, len1). - Both bitstrings must be left-aligned. */ - -int -_BS_lcompare_0 (ptr0, len0, ptr1, len1) - register const _BS_word *ptr0; - _BS_size_t len0; - register const _BS_word *ptr1; - _BS_size_t len1; -{ - _BS_size_t nwords0 = len0 / _BS_BITS_PER_WORD; - _BS_size_t nwords1 = len1 / _BS_BITS_PER_WORD; - register _BS_word word0, word1; - _BS_size_t nwords = nwords0 > nwords1 ? nwords1 : nwords0; - for (; nwords != 0; nwords--) - { - word0 = *ptr0++; - word1 = *ptr1++; - if (word0 != word1) - { -#if _BS_BIGENDIAN - return (word0 < word1) ? -1 : 1; -#else - { - _BS_word diff=(word0^word1); /* one's where different */ - _BS_word mask=diff&~(diff-1); /* first bit different */ - return (word0&mask)?1:-1; - } -#endif - } - } - len0 -= nwords0 * _BS_BITS_PER_WORD; - len1 -= nwords1 * _BS_BITS_PER_WORD; - if (len0 == 0 || len1 == 0) - return (len1 == 0) - (len0 == 0); - len0 &= _BS_BITS_PER_WORD - 1; - len1 &= _BS_BITS_PER_WORD - 1; - word0 = *ptr0++ & ~((_BS_word)(~0) _BS_RIGHT len0); - word1 = *ptr1++ & ~((_BS_word)(~0) _BS_RIGHT len1); - if (word0 == word1) - return len0 == len1 ? 0 : len0 < len1 ? -1 : 1; -#if _BS_BIGENDIAN - return (word0 < word1) ? -1 : 1; -#else - { - _BS_word diff=(word0^word1); /* one's where different */ - _BS_word mask=diff&~(diff-1); /* first bit different */ - return (word0&mask)?1:-1; - } -#endif -} - diff --git a/gnu/lib/libg++/libg++/src/bitprims.h b/gnu/lib/libg++/libg++/src/bitprims.h deleted file mode 100644 index 25b809b6895..00000000000 --- a/gnu/lib/libg++/libg++/src/bitprims.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef _BS_PRIMS -#define _BS_PRIMS - -/* A bitstring is an array of _BS_word. */ -typedef unsigned long _BS_word; - -#define _BS_CHAR_BIT 8 -#define _BS_BITS_PER_WORD (_BS_CHAR_BIT*sizeof(_BS_word)) -#define _BS_WORDS_NEEDED(NBITS) ((NBITS+_BS_BITS_PER_WORD-1)/_BS_BITS_PER_WORD) - -/* For now, we number the bits in a _BS_word in little-endian order. - Later, might use machine order. */ -#ifdef CHILL_LIB -#ifndef BITS_BIG_ENDIAN -#include "config.h" -#endif -#define _BS_BIGENDIAN BITS_BIG_ENDIAN -#else -#define _BS_BIGENDIAN 0 -#endif - -/* By "left" we mean where bit number 0 is. - Hence, so left shift is << if we're numbering the bits in big-endian oder, - and >> if we're numbering the bits in little-endian order. - Currently, we always use little-endian order. - Later, we might use machine-endian order. */ -#if _BS_BIGENDIAN -#define _BS_LEFT << -#define _BS_RIGHT >> -#else -#define _BS_LEFT >> -#define _BS_RIGHT << -#endif - -#if _BS_BIGENDIAN -#define _BS_BITMASK(BITNO) ((_BS_word)1 << (_BS_BITS_PER_WORD - 1 - (BITNO))) -#else -#define _BS_BITMASK(BITNO) ((_BS_word)1 << (BITNO)) -#endif - -/* Given a PTR which may not be aligned on a _BS_word boundary, - set NEW_PTR to point to (the beginning of) the corresponding _BS_word. - Adjust the bit-offset OFFSET to compensate for the difference. */ -#define _BS_ADJUST_ALIGNED(NEW_PTR, PTR, OFFSET) \ - ( (NEW_PTR) = (_BS_word*)(((char*)(PTR)-(char*)0) & ~(sizeof(_BS_word)-1)), \ - (OFFSET) += (char*)(PTR) - (char*)(NEW_PTR) ) - -/* Given a bit pointer (PTR, OFFSET) normalize it so that - OFFSET < _BS_BITS_PER_WORD. */ -#define _BS_NORMALIZE(PTR, OFFSET) \ -{ _BS_size_t __tmp_ind = _BS_INDEX (OFFSET); \ - (PTR) += __tmp_ind; \ - (OFFSET) -= __tmp_ind * _BS_BITS_PER_WORD; } - -#define _BS_INDEX(I) ((unsigned)(I) / _BS_BITS_PER_WORD) -#define _BS_POS(I) ((I) & (_BS_BITS_PER_WORD -1 )) - -#ifndef _BS_size_t -#if __GNUC__ > 1 -#define _BS_size_t __SIZE_TYPE__ -#else -#define _BS_size_t unsigned long -#endif -#endif - -#ifndef __P -#ifdef __STDC__ -#define __P(protos) protos -#else -#define __P(protos) () -#endif -#endif /*!__P*/ -#if !defined(__STDC__) && !defined(const) -#define const -#endif -#if !defined(__STDC__) && !defined(void) -#define void int -#endif - -/* The 16 2-operand raster-ops: - These match the correspodning GX codes in X11. */ -enum _BS_alu { - _BS_alu_clear = 0 /* 0 */, - _BS_alu_and = 1 /* src & dst */, - _BS_alu_andReverse = 2 /* src & ~dst */, - _BS_alu_copy = 3 /* src */, - _BS_alu_andInverted = 4 /* ~src & dst */, - _BS_alu_noop = 5 /* dst */, - _BS_alu_xor = 6 /* src ^ dst */, - _BS_alu_or = 7 /* src | dst */, - _BS_alu_nor = 8 /* ~src & ~dst */, - _BS_alu_equiv = 9 /* ~(src ^ dst) */, - _BS_alu_invert = 10 /* ~dst */, - _BS_alu_orReverse = 11 /* src | ~dst */, - _BS_alu_copyInverted = 12 /* ~src */, - _BS_alu_orInverted = 13 /* ~src | dst */, - _BS_alu_nand = 14 /* ~src | d~st */, - _BS_alu_set = 15 /* ~src | dst */ -}; -#define _BS -#define _BS - -#ifdef __cplusplus -extern "C" { -#endif - -extern void _BS_and __P((_BS_word*,int, const _BS_word*, int, _BS_size_t)); -extern void _BS_blt __P((enum _BS_alu, - _BS_word*,int, const _BS_word*,int, _BS_size_t)); -extern void _BS_copy __P((_BS_word*,int, const _BS_word*,int, _BS_size_t)); -#define _BS_copy_0(DS, SS, LENGTH) _BS_copy(DS, 0, SS, 0, LENGTH) -extern int _BS_count __P((const _BS_word*, int, _BS_size_t)); -extern int _BS_any __P((const _BS_word*, int, _BS_size_t)); -extern void _BS_clear __P((_BS_word*, int, _BS_size_t)); -extern void _BS_set __P((_BS_word*, int, _BS_size_t)); -extern void _BS_invert __P((_BS_word*, int, _BS_size_t)); -int _BS_lcompare_0 __P((const _BS_word*, _BS_size_t, - const _BS_word*, _BS_size_t)); -extern void _BS_xor __P((_BS_word*,int, const _BS_word*,int, _BS_size_t)); - -#ifdef __cplusplus -} -#endif - -#endif /* !_BS_PRIMS */ diff --git a/gnu/lib/libg++/libg++/src/bitset1.c b/gnu/lib/libg++/libg++/src/bitset1.c deleted file mode 100644 index bf0dd8de1e1..00000000000 --- a/gnu/lib/libg++/libg++/src/bitset1.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com) */ - -#include "bitprims.h" - -void -_BS_set (ptr, offset, length) - register _BS_word *ptr; - int offset; - _BS_size_t length; -{ -#undef DOIT -#define DOIT(WORD, MASK) ((WORD) |= (MASK)) -#include "bitdo1.h" -} diff --git a/gnu/lib/libg++/libg++/src/bitxor.c b/gnu/lib/libg++/libg++/src/bitxor.c deleted file mode 100644 index 7690419036e..00000000000 --- a/gnu/lib/libg++/libg++/src/bitxor.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1994 Free Software Foundation - -This file is part of the GNU BitString Library. This library is free -software; you can redistribute it and/or modify it under the -terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) -any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* Written by Per Bothner (bothner@cygnus.com). */ - -#include "bitprims.h" - -/* Copy LENGTH bits from (starting at SRCBIT) into pdst starting at DSTBIT. - This will work even if psrc & pdst overlap. */ - -void -_BS_xor (pdst, dstbit, psrc, srcbit, length) - register _BS_word* pdst; - int dstbit; - register const _BS_word* psrc; - int srcbit; - _BS_size_t length; -{ -#define COMBINE(dst, src) (dst) ^ (src) -#include "bitdo2.h" -} diff --git a/gnu/lib/libg++/libg++/src/bool.h b/gnu/lib/libg++/libg++/src/bool.h deleted file mode 100644 index 40a2956e6e5..00000000000 --- a/gnu/lib/libg++/libg++/src/bool.h +++ /dev/null @@ -1,24 +0,0 @@ -// Defining TRUE and FALSE is usually a Bad Idea, -// because you will probably be inconsistent with anyone -// else who had the same clever idea. -// Therefore: DON'T USE THIS FILE. - -#ifndef _bool_h -#define _bool_h 1 - -#include <_G_config.h> - -#if _G_HAVE_BOOL -#undef TRUE -#undef FALSE -#define TRUE true -#define FALSE false -#else -#undef FALSE -#undef TRUE -#undef true -#undef false -enum bool { FALSE = 0, false = 0, TRUE = 1, true = 1 }; -#endif - -#endif diff --git a/gnu/lib/libg++/libg++/src/builtin.cc b/gnu/lib/libg++/libg++/src/builtin.cc deleted file mode 100644 index 6b9abe5380c..00000000000 --- a/gnu/lib/libg++/libg++/src/builtin.cc +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> diff --git a/gnu/lib/libg++/libg++/src/builtin.h b/gnu/lib/libg++/libg++/src/builtin.h deleted file mode 100644 index 8d380828d77..00000000000 --- a/gnu/lib/libg++/libg++/src/builtin.h +++ /dev/null @@ -1,125 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -/* -Copyright (C) 1988, 1992 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - arithmetic, etc. functions on built in types -*/ - - -#ifndef _builtin_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _builtin_h 1 - -#include <stddef.h> -#include <std.h> -#include <cmath> - -#ifndef __GNUC__ -#define __attribute__(x) -#endif - -typedef void (*one_arg_error_handler_t)(const char*); -typedef void (*two_arg_error_handler_t)(const char*, const char*); - -long gcd(long, long); -long lg(unsigned long); -double pow(double, long); -long pow(long, long); - -extern "C" double start_timer(); -extern "C" double return_elapsed_time(double last_time = 0.0); - -char* dtoa(double x, char cvt = 'g', int width = 0, int prec = 6); - -unsigned int hashpjw(const char*); -unsigned int multiplicativehash(int); -unsigned int foldhash(double); - -extern void default_one_arg_error_handler(const char*) __attribute__ ((noreturn)); -extern void default_two_arg_error_handler(const char*, const char*) __attribute__ ((noreturn)); - -extern two_arg_error_handler_t lib_error_handler; - -extern two_arg_error_handler_t - set_lib_error_handler(two_arg_error_handler_t f); - - -#if !defined(IV) - -inline short abs(short arg) -{ - return (arg < 0)? -arg : arg; -} - -inline int sign(long arg) -{ - return (arg == 0) ? 0 : ( (arg > 0) ? 1 : -1 ); -} - -inline int sign(double arg) -{ - return (arg == 0.0) ? 0 : ( (arg > 0.0) ? 1 : -1 ); -} - -inline long sqr(long arg) -{ - return arg * arg; -} - -#if ! _G_MATH_H_INLINES /* hpux and SCO define this in math.h */ -inline double sqr(double arg) -{ - return arg * arg; -} -#endif - -inline int even(long arg) -{ - return !(arg & 1); -} - -inline int odd(long arg) -{ - return (arg & 1); -} - -inline long lcm(long x, long y) -{ - return x / gcd(x, y) * y; -} - -inline void (setbit)(long& x, long b) -{ - x |= (1 << b); -} - -inline void clearbit(long& x, long b) -{ - x &= ~(1 << b); -} - -inline int testbit(long x, long b) -{ - return ((x & (1 << b)) != 0); -} - -#endif -#endif diff --git a/gnu/lib/libg++/libg++/src/compare.cc b/gnu/lib/libg++/libg++/src/compare.cc deleted file mode 100644 index aae8409a2aa..00000000000 --- a/gnu/lib/libg++/libg++/src/compare.cc +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __GNUG__ -#pragma implementation -#endif -#include <compare.h> diff --git a/gnu/lib/libg++/libg++/src/compare.h b/gnu/lib/libg++/libg++/src/compare.h deleted file mode 100644 index fb720749873..00000000000 --- a/gnu/lib/libg++/libg++/src/compare.h +++ /dev/null @@ -1,91 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- - -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _compare_h -#ifdef __GNUG__ -#pragma interface -#endif -#define _compare_h 1 - -#include <builtin.h> - -int compare(int a, int b); -int compare(short a, short b); -int compare(unsigned long a, unsigned long b); -int compare(unsigned int a, unsigned int b); -int compare(unsigned short a, unsigned short b); -int compare(unsigned char a, unsigned char b); -int compare(signed char a, signed char b); -int compare(float a, float b); -int compare(double a, double b); -int compare(const char* a, const char* b); - - -inline int compare(int a, int b) -{ - return a - b; -} - -inline int compare(short a, short b) -{ - return a - b; -} - - -inline int compare(signed char a, signed char b) -{ - return a - b; -} - -inline int compare(unsigned long a, unsigned long b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(unsigned int a, unsigned int b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(unsigned short a, unsigned short b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(unsigned char a, unsigned char b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(float a, float b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(double a, double b) -{ - return (a < b)? -1 : (a > b)? 1 : 0; -} - -inline int compare(const char* a, const char* b) -{ - return strcmp(a,b); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/error.cc b/gnu/lib/libg++/libg++/src/error.cc deleted file mode 100644 index 7d163d67631..00000000000 --- a/gnu/lib/libg++/libg++/src/error.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> - -void default_one_arg_error_handler(const char* msg) -{ - fputs("Error: ", stderr); - fputs(msg, stderr); - fputs("\n", stderr); - abort(); -} - - -void default_two_arg_error_handler(const char* kind, const char* msg) -{ - fputs(kind, stderr); - fputs(" Error: ", stderr); - fputs(msg, stderr); - fputs("\n", stderr); - abort(); -} - -two_arg_error_handler_t lib_error_handler = default_two_arg_error_handler; - -two_arg_error_handler_t set_lib_error_handler(two_arg_error_handler_t f) -{ - two_arg_error_handler_t old = lib_error_handler; - lib_error_handler = f; - return old; -} - diff --git a/gnu/lib/libg++/libg++/src/fmtq.cc b/gnu/lib/libg++/libg++/src/fmtq.cc deleted file mode 100644 index 2a01073699b..00000000000 --- a/gnu/lib/libg++/libg++/src/fmtq.cc +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <AllocRing.h> - -// AllocRings are used for output operations -// We guaranteee that the last _libgxx_maxfmt formats -// will be intact - -static const int _libgxx_maxfmt = 20; -AllocRing _libgxx_fmtq(_libgxx_maxfmt); diff --git a/gnu/lib/libg++/libg++/src/gcd.cc b/gnu/lib/libg++/libg++/src/gcd.cc deleted file mode 100644 index 602b55f8796..00000000000 --- a/gnu/lib/libg++/libg++/src/gcd.cc +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> - - -/* - common functions on built-in types -*/ - -long gcd(long x, long y) // euclid's algorithm -{ - long a = abs(x); - long b = abs(y); - - long tmp; - - if (b > a) - { - tmp = a; a = b; b = tmp; - } - for(;;) - { - if (b == 0) - return a; - else if (b == 1) - return b; - else - { - tmp = b; - b = a % b; - a = tmp; - } - } -} diff --git a/gnu/lib/libg++/libg++/src/generic.h b/gnu/lib/libg++/libg++/src/generic.h deleted file mode 100644 index d49a924afd1..00000000000 --- a/gnu/lib/libg++/libg++/src/generic.h +++ /dev/null @@ -1,54 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef generic_h -#define generic_h 1 - -/* - * See the CPP manual, argument prescan section for explanation - */ - -#define name2(a,b) gEnErIc2(a,b) -#define gEnErIc2(a,b) a ## b - -#define name3(a,b,c) gEnErIc3(a,b,c) -#define gEnErIc3(a,b,c) a ## b ## c - -#define name4(a,b,c,d) gEnErIc4(a,b,c,d) -#define gEnErIc4(a,b,c,d) a ## b ## c ## d - -#define GENERIC_STRING(a) gEnErIcStRiNg(a) -#define gEnErIcStRiNg(a) #a - -#define declare(clas,t) name2(clas,declare)(t) -#define declare2(clas,t1,t2) name2(clas,declare2)(t1,t2) - -#define implement(clas,t) name2(clas,implement)(t) -#define implement2(clas,t1,t2) name2(clas,implement2)(t1,t2) - -//extern genericerror(int,char*); -typedef int (*GPT)(int,char*); - -#define set_handler(gen,type,x) name4(set_,type,gen,_handler)(x) - -#define errorhandler(gen,type) name3(type,gen,handler) - -#define callerror(gen,type,a,b) (*errorhandler(gen,type))(a,b) - - -#endif /* generic_h */ diff --git a/gnu/lib/libg++/libg++/src/hash.cc b/gnu/lib/libg++/libg++/src/hash.cc deleted file mode 100644 index 670e53f2bda..00000000000 --- a/gnu/lib/libg++/libg++/src/hash.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> - -/* - some useful hash functions -*/ - -unsigned int hashpjw(const char* x) // From Dragon book, p436 -{ - unsigned int h = 0; - unsigned int g; - - while (*x != 0) - { - h = (h << 4) + *x++; - if ((g = h & 0xf0000000) != 0) - h = (h ^ (g >> 24)) ^ g; - } - return h; -} - -unsigned int multiplicativehash(int x) -{ - // uses a const close to golden ratio * pow(2,32) - return ((unsigned)x) * 2654435767; -} - - -unsigned int foldhash(double x) -{ - union { unsigned int i[2]; double d; } u; - u.d = x; - unsigned int u0 = u.i[0]; - unsigned int u1 = u.i[1]; - return u0 ^ u1; -} - diff --git a/gnu/lib/libg++/libg++/src/ioob.cc b/gnu/lib/libg++/libg++/src/ioob.cc deleted file mode 100644 index 08409a5d292..00000000000 --- a/gnu/lib/libg++/libg++/src/ioob.cc +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of GNU CC. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU CC General Public -License for full details. - -Everyone is granted permission to copy, modify and redistribute -GNU CC, but only under the conditions described in the -GNU CC General Public License. A copy of this license is -supposed to have been given to you along with GNU CC so you -can know your rights and responsibilities. It should be in a -file named COPYING. Among other things, the copyright notice -and this notice must be preserved on all copies. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <Obstack.h> - -// Obstacks are used as an easy way to allocate enough space -// for various builtin input operations - - -Obstack _libgxx_io_ob; diff --git a/gnu/lib/libg++/libg++/src/lg.cc b/gnu/lib/libg++/libg++/src/lg.cc deleted file mode 100644 index 0397dd43f01..00000000000 --- a/gnu/lib/libg++/libg++/src/lg.cc +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> - -long lg(unsigned long x) -{ - long l = 0; - while (x > 1) - { - x = x >> 1; - ++l; - } - return l; -} diff --git a/gnu/lib/libg++/libg++/src/libc.h b/gnu/lib/libg++/libg++/src/libc.h deleted file mode 100644 index c8b49f26d17..00000000000 --- a/gnu/lib/libg++/libg++/src/libc.h +++ /dev/null @@ -1 +0,0 @@ -#include <stdlib.h> diff --git a/gnu/lib/libg++/libg++/src/minmax.h b/gnu/lib/libg++/libg++/src/minmax.h deleted file mode 100644 index ec2bfa335a7..00000000000 --- a/gnu/lib/libg++/libg++/src/minmax.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright (C) 1992 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _minmax_h -#ifdef _GNUG_ -#pragma interface -#endif -#define _minmax_h 1 - -#include <_G_config.h> - -inline char min(char a, char b) { return (a < b)?a:b;} -#ifndef _G_BROKEN_SIGNED_CHAR -inline signed char min(signed char a, signed char b) { return (a < b)?a:b;} -#endif -inline unsigned char min(unsigned char a, unsigned char b) {return (a<b)?a:b;} - -inline short min(short a, short b) {return (a < b) ?a:b;} -inline unsigned short min(unsigned short a, unsigned short b) {return (a < b)?a:b;} - -inline int min(int a, int b) {return (a < b)?a:b;} -inline unsigned int min(unsigned int a, unsigned int b) {return (a < b)?a:b;} - -inline long min(long a, long b) {return (a < b)?a:b;} -inline unsigned long min(unsigned long a, unsigned long b) {return (a<b)?a:b;} - -inline float min(float a, float b) {return (a < b)?a:b;} - -inline double min(double a, double b) {return (a < b)?a:b;} - -inline char max(char a, char b) { return (a > b)?a:b;} -#ifndef _G_BROKEN_SIGNED_CHAR -inline signed char max(signed char a, signed char b) {return (a > b)?a:b;} -#endif -inline unsigned char max(unsigned char a, unsigned char b) {return (a>b)?a:b;} - -inline short max(short a, short b) {return (a > b) ?a:b;} -inline unsigned short max(unsigned short a, unsigned short b) {return (a > b)?a:b;} - -inline int max(int a, int b) {return (a > b)?a:b;} -inline unsigned int max(unsigned int a, unsigned int b) {return (a > b)?a:b;} - -inline long max(long a, long b) {return (a > b)?a:b;} -inline unsigned long max(unsigned long a, unsigned long b) {return (a>b)?a:b;} - -inline float max(float a, float b) {return (a > b)?a:b;} - -inline double max(double a, double b) {return (a > b)?a:b;} - -#endif - diff --git a/gnu/lib/libg++/libg++/src/osfcn.h b/gnu/lib/libg++/libg++/src/osfcn.h deleted file mode 100644 index 023b5c5b65d..00000000000 --- a/gnu/lib/libg++/libg++/src/osfcn.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef OSFCN_H -#define OSFCN_H 1 - -#include <std.h> -#include <time.h> -#include <sys/types.h> -#if _G_HAVE_SYS_SOCKET -#include <sys/socket.h> -#endif -#if _G_HAVE_SYS_RESOURCE -#include <sys/time.h> -#include <sys/resource.h> -#endif - - -#endif diff --git a/gnu/lib/libg++/libg++/src/pow.cc b/gnu/lib/libg++/libg++/src/pow.cc deleted file mode 100644 index 497cb5b8b70..00000000000 --- a/gnu/lib/libg++/libg++/src/pow.cc +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <math.h> - -double pow(double x, long p) -{ - if (p == 0) - return 1.0; - else if (x == 0.0) - return 0.0; - else - { - if (p < 0) - { - p = -p; - x = 1.0 / x; - } - - double r = 1.0; - for(;;) - { - if (p & 1) - r *= x; - if ((p >>= 1) == 0) - return r; - else - x *= x; - } - } -} - -long pow(long x, long p) -{ - if (p == 0) - return 1; - else if (p < 0 || x == 0) - return 0; - else - { - long r = 1; - for(;;) - { - if (p & 1) - r *= x; - if ((p >>= 1) == 0) - return r; - else - x *= x; - } - } -} diff --git a/gnu/lib/libg++/libg++/src/rx.h b/gnu/lib/libg++/libg++/src/rx.h deleted file mode 100644 index 60f99e199e2..00000000000 --- a/gnu/lib/libg++/libg++/src/rx.h +++ /dev/null @@ -1,3732 +0,0 @@ -#if !defined(RXH) || defined(RX_WANT_SE_DEFS) -#define RXH - -/* Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -This file is part of the librx library. - -Librx is free software; you can redistribute it and/or modify it under -the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -Librx is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU Library General Public -License along with this software; see the file COPYING.LIB. If not, -write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA -02139, USA. */ -/* t. lord Wed Sep 23 18:20:57 1992 */ - - - - - - - - -#ifndef RX_WANT_SE_DEFS - -/* This page: Bitsets */ - -#ifndef RX_subset -typedef unsigned int RX_subset; -#define RX_subset_bits (32) -#define RX_subset_mask (RX_subset_bits - 1) -#endif - -typedef RX_subset * rx_Bitset; - -#ifdef __STDC__ -typedef void (*rx_bitset_iterator) (void *, int member_index); -#else -typedef void (*rx_bitset_iterator) (); -#endif - -#define rx_bitset_subset(N) ((N) / RX_subset_bits) -#define rx_bitset_subset_val(B,N) ((B)[rx_bitset_subset(N)]) -#define RX_bitset_access(B,N,OP) \ - ((B)[rx_bitset_subset(N)] OP rx_subset_singletons[(N) & RX_subset_mask]) -#define RX_bitset_member(B,N) RX_bitset_access(B, N, &) -#define RX_bitset_enjoin(B,N) RX_bitset_access(B, N, |=) -#define RX_bitset_remove(B,N) RX_bitset_access(B, N, &= ~) -#define RX_bitset_toggle(B,N) RX_bitset_access(B, N, ^= ) -#define rx_bitset_numb_subsets(N) (((N) + RX_subset_bits - 1) / RX_subset_bits) -#define rx_sizeof_bitset(N) (rx_bitset_numb_subsets(N) * sizeof(RX_subset)) - - - -/* This page: Splay trees. */ - -#ifdef __STDC__ -typedef int (*rx_sp_comparer) (void * a, void * b); -#else -typedef int (*rx_sp_comparer) (); -#endif - -struct rx_sp_node -{ - void * key; - void * data; - struct rx_sp_node * kids[2]; -}; - -#ifdef __STDC__ -typedef void (*rx_sp_key_data_freer) (struct rx_sp_node *); -#else -typedef void (*rx_sp_key_data_freer) (); -#endif - - -/* giant inflatable hash trees */ - -struct rx_hash_item -{ - struct rx_hash_item * next_same_hash; - struct rx_hash * table; - unsigned long hash; - void * data; - void * binding; -}; - -struct rx_hash -{ - struct rx_hash * parent; - int refs; - struct rx_hash * children[13]; - struct rx_hash_item * buckets [13]; - int bucket_size [13]; -}; - -struct rx_hash_rules; - -#ifdef __STDC__ -/* should return like == */ -typedef int (*rx_hash_eq)(void *, void *); -typedef struct rx_hash * (*rx_alloc_hash)(struct rx_hash_rules *); -typedef void (*rx_free_hash)(struct rx_hash *, - struct rx_hash_rules *); -typedef struct rx_hash_item * (*rx_alloc_hash_item)(struct rx_hash_rules *, - void *); -typedef void (*rx_free_hash_item)(struct rx_hash_item *, - struct rx_hash_rules *); -#else -typedef int (*rx_hash_eq)(); -typedef struct rx_hash * (*rx_alloc_hash)(); -typedef void (*rx_free_hash)(); -typedef struct rx_hash_item * (*rx_alloc_hash_item)(); -typedef void (*rx_free_hash_item)(); -#endif - -struct rx_hash_rules -{ - rx_hash_eq eq; - rx_alloc_hash hash_alloc; - rx_free_hash free_hash; - rx_alloc_hash_item hash_item_alloc; - rx_free_hash_item free_hash_item; -}; - - -/* Forward declarations */ - -struct rx_cache; -struct rx_superset; -struct rx; -struct rx_se_list; - - - -/* - * GLOSSARY - * - * regexp - * regular expression - * expression - * pattern - a `regular' expression. The expression - * need not be formally regular -- it can contain - * constructs that don't correspond to purely regular - * expressions. - * - * buffer - * string - the string (or strings) being searched or matched. - * - * pattern buffer - a structure of type `struct re_pattern_buffer' - * This in turn contains a `struct rx', which holds the - * NFA compiled from a pattern, as well as some of the state - * of a matcher using the pattern. - * - * NFA - nondeterministic finite automata. Some people - * use this term to a member of the class of - * regular automata (those corresponding to a regular - * language). However, in this code, the meaning is - * more general. The automata used by Rx are comperable - * in power to what are usually called `push down automata'. - * - * Two NFA are built by rx for every pattern. One is built - * by the compiler. The other is built from the first, on - * the fly, by the matcher. The latter is called the `superstate - * NFA' because its states correspond to sets of states from - * the first NFA. (Joe Keane gets credit for the name - * `superstate NFA'). - * - * NFA edges - * epsilon edges - * side-effect edges - The NFA compiled from a pattern can have three - * kinds of edges. Epsilon edges can be taken freely anytime - * their source state is reached. Character set edges can be - * taken when their source state is reached and when the next - * character in the buffer is a member of the set. Side effect - * edges imply a transition that can only be taken after the - * indicated side effect has been successfully accomplished. - * Some examples of side effects are: - * - * Storing the current match position to record the - * location of a parentesized subexpression. - * - * Advancing the matcher over N characters if they - * match the N characters previously matched by a - * parentesized subexpression. - * - * Both of those kinds of edges occur in the NFA generated - * by the pattern: \(.\)\1 - * - * Epsilon and side effect edges are similar. Unfortunately, - * some of the code uses the name `epsilon edge' to mean - * both epsilon and side effect edges. For example, the - * function has_non_idempotent_epsilon_path computes the existance - * of a non-trivial path containing only a mix of epsilon and - * side effect edges. In that case `nonidempotent epsilon' is being - * used to mean `side effect'. - */ - - - - - -/* LOW LEVEL PATTERN BUFFERS */ - -/* Suppose that from some NFA state, more than one path through - * side-effect edges is possible. In what order should the paths - * be tried? A function of type rx_se_list_order answers that - * question. It compares two lists of side effects, and says - * which list comes first. - */ - -#ifdef __STDC__ -typedef int (*rx_se_list_order) (struct rx *, - struct rx_se_list *, - struct rx_se_list *); -#else -typedef int (*rx_se_list_order) (); -#endif - - - -/* Struct RX holds a compiled regular expression - that is, an nfa - * ready to be converted on demand to a more efficient superstate nfa. - * This is for the low level interface. The high-level interfaces enclose - * this in a `struct re_pattern_buffer'. - */ -struct rx -{ - /* The compiler assigns a unique id to every pattern. - * Like sequence numbers in X, there is a subtle bug here - * if you use Rx in a system that runs for a long time. - * But, because of the way the caches work out, it is almost - * impossible to trigger the Rx version of this bug. - * - * The id is used to validate superstates found in a cache - * of superstates. It isn't sufficient to let a superstate - * point back to the rx for which it was compiled -- the caller - * may be re-using a `struct rx' in which case the superstate - * is not really valid. So instead, superstates are validated - * by checking the sequence number of the pattern for which - * they were built. - */ - int rx_id; - - /* This is memory mgt. state for superstates. This may be - * shared by more than one struct rx. - */ - struct rx_cache * cache; - - /* Every regex defines the size of its own character set. - * A superstate has an array of this size, with each element - * a `struct rx_inx'. So, don't make this number too large. - * In particular, don't make it 2^16. - */ - int local_cset_size; - - /* After the NFA is built, it is copied into a contiguous region - * of memory (mostly for compatability with GNU regex). - * Here is that region, and it's size: - */ - void * buffer; - unsigned long allocated; - - /* Clients of RX can ask for some extra storage in the space pointed - * to by BUFFER. The field RESERVED is an input parameter to the - * compiler. After compilation, this much space will be available - * at (buffer + allocated - reserved) - */ - unsigned long reserved; - - /* --------- The remaining fields are for internal use only. --------- */ - /* --------- But! they must be initialized to 0. --------- */ - - /* NODEC is the number of nodes in the NFA with non-epsilon - * transitions. - */ - int nodec; - - /* EPSNODEC is the number of nodes with only epsilon transitions. */ - int epsnodec; - - /* The sum (NODEC + EPSNODEC) is the total number of states in the - * compiled NFA. - */ - - /* Lists of side effects as stored in the NFA are `hash consed'..meaning - * that lists with the same elements are ==. During compilation, - * this table facilitates hash-consing. - */ - struct rx_hash se_list_memo; - - /* Lists of NFA states are also hashed. - */ - struct rx_hash set_list_memo; - - - - - /* The compiler and matcher must build a number of instruction frames. - * The format of these frames is fixed (c.f. struct rx_inx). The values - * of the instructions is not fixed. - * - * An enumerated type (enum rx_opcode) defines the set of instructions - * that the compiler or matcher might generate. When filling an instruction - * frame, the INX field is found by indexing this instruction table - * with an opcode: - */ - void ** instruction_table; - - /* The list of all states in an NFA. - * During compilation, the NEXT field of NFA states links this list. - * After compilation, all the states are compacted into an array, - * ordered by state id numbers. At that time, this points to the base - * of that array. - */ - struct rx_nfa_state *nfa_states; - - /* Every nfa begins with one distinguished starting state: - */ - struct rx_nfa_state *start; - - /* This orders the search through super-nfa paths. - * See the comment near the typedef of rx_se_list_order. - */ - rx_se_list_order se_list_cmp; - - struct rx_superset * start_set; -}; - - - - -/* SYNTAX TREES */ - -/* Compilation is in stages. - * - * In the first stage, a pattern specified by a string is - * translated into a syntax tree. Later stages will convert - * the syntax tree into an NFA optimized for conversion to a - * superstate-NFA. - * - * This page is about syntax trees. - */ - -enum rexp_node_type -{ - r_cset, /* Match from a character set. `a' or `[a-z]'*/ - r_concat, /* Concat two subexpressions. `ab' */ - r_alternate, /* Choose one of two subexpressions. `a\|b' */ - r_opt, /* Optional subexpression. `a?' */ - r_star, /* Repeated subexpression. `a*' */ - - - /* A 2phase-star is a variation on a repeated subexpression. - * In this case, there are two subexpressions. The first, if matched, - * begins a repitition (otherwise, the whole expression is matches the - * empth string). - * - * After matching the first subexpression, a 2phase star either finishes, - * or matches the second subexpression. If the second subexpression is - * matched, then the whole construct repeats. - * - * 2phase stars are used in two circumstances. First, they - * are used as part of the implementation of POSIX intervals (counted - * repititions). Second, they are used to implement proper star - * semantics when the repeated subexpression contains paths of - * only side effects. See rx_compile for more information. - */ - r_2phase_star, - - - /* c.f. "typedef void * rx_side_effect" */ - r_side_effect, - - /* This is an extension type: It is for transient use in source->source - * transformations (implemented over syntax trees). - */ - r_data -}; - -/* A side effect is a matcher-specific action associated with - * transitions in the NFA. The details of side effects are up - * to the matcher. To the compiler and superstate constructors - * side effects are opaque: - */ - -typedef void * rx_side_effect; - -/* Nodes in a syntax tree are of this type: - */ -struct rexp_node -{ - enum rexp_node_type type; - union - { - rx_Bitset cset; - rx_side_effect side_effect; - struct - { - struct rexp_node *left; - struct rexp_node *right; - } pair; - void * data; - } params; -}; - - - -/* NFA - * - * A syntax tree is compiled into an NFA. This page defines the structure - * of that NFA. - */ - -struct rx_nfa_state -{ - /* These are kept in a list as the NFA is being built. */ - struct rx_nfa_state *next; - - /* After the NFA is built, states are given integer id's. - * States whose outgoing transitions are all either epsilon or - * side effect edges are given ids less than 0. Other states - * are given successive non-negative ids starting from 0. - */ - int id; - - /* The list of NFA edges that go from this state to some other. */ - struct rx_nfa_edge *edges; - - /* If you land in this state, then you implicitly land - * in all other states reachable by only epsilon translations. - * Call the set of maximal paths to such states the epsilon closure - * of this state. - * - * There may be other states that are reachable by a mixture of - * epsilon and side effect edges. Consider the set of maximal paths - * of that sort from this state. Call it the epsilon-side-effect - * closure of the state. - * - * The epsilon closure of the state is a subset of the epsilon-side- - * effect closure. It consists of all the paths that contain - * no side effects -- only epsilon edges. - * - * The paths in the epsilon-side-effect closure can be partitioned - * into equivalance sets. Two paths are equivalant if they have the - * same set of side effects, in the same order. The epsilon-closure - * is one of these equivalance sets. Let's call these equivalance - * sets: observably equivalant path sets. That name is chosen - * because equivalance of two paths means they cause the same side - * effects -- so they lead to the same subsequent observations other - * than that they may wind up in different target states. - * - * The superstate nfa, which is derived from this nfa, is based on - * the observation that all of the paths in an observably equivalant - * path set can be explored at the same time, provided that the - * matcher keeps track not of a single nfa state, but of a set of - * states. In particular, after following all the paths in an - * observably equivalant set, you wind up at a set of target states. - * That set of target states corresponds to one state in the - * superstate NFA. - * - * Staticly, before matching begins, it is convenient to analyze the - * nfa. Each state is labeled with a list of the observably - * equivalant path sets who's union covers all the - * epsilon-side-effect paths beginning in this state. This list is - * called the possible futures of the state. - * - * A trivial example is this NFA: - * s1 - * A ---> B - * - * s2 - * ---> C - * - * epsilon s1 - * ---------> D ------> E - * - * - * In this example, A has two possible futures. - * One invokes the side effect `s1' and contains two paths, - * one ending in state B, the other in state E. - * The other invokes the side effect `s2' and contains only - * one path, landing in state C. - */ - struct rx_possible_future *futures; - - - /* There are exactly two distinguished states in every NFA: */ - unsigned int is_final:1; - unsigned int is_start:1; - - /* These are used during NFA construction... */ - unsigned int eclosure_needed:1; - unsigned int mark:1; -}; - - -/* An edge in an NFA is typed: */ -enum rx_nfa_etype -{ - /* A cset edge is labled with a set of characters one of which - * must be matched for the edge to be taken. - */ - ne_cset, - - /* An epsilon edge is taken whenever its starting state is - * reached. - */ - ne_epsilon, - - /* A side effect edge is taken whenever its starting state is - * reached. Side effects may cause the match to fail or the - * position of the matcher to advance. - */ - ne_side_effect /* A special kind of epsilon. */ -}; - -struct rx_nfa_edge -{ - struct rx_nfa_edge *next; - enum rx_nfa_etype type; - struct rx_nfa_state *dest; - union - { - rx_Bitset cset; - rx_side_effect side_effect; - } params; -}; - - - -/* A possible future consists of a list of side effects - * and a set of destination states. Below are their - * representations. These structures are hash-consed which - * means that lists with the same elements share a representation - * (their addresses are ==). - */ - -struct rx_nfa_state_set -{ - struct rx_nfa_state * car; - struct rx_nfa_state_set * cdr; -}; - -struct rx_se_list -{ - rx_side_effect car; - struct rx_se_list * cdr; -}; - -struct rx_possible_future -{ - struct rx_possible_future *next; - struct rx_se_list * effects; - struct rx_nfa_state_set * destset; -}; - - - -/* This begins the description of the superstate NFA. - * - * The superstate NFA corresponds to the NFA in these ways: - * - * Every superstate NFA states SUPER correspond to sets of NFA states, - * nfa_states(SUPER). - * - * Superstate edges correspond to NFA paths. - * - * The superstate has no epsilon transitions; - * every edge has a character label, and a (possibly empty) side - * effect label. The side effect label corresponds to a list of - * side effects that occur in the NFA. These parts are referred - * to as: superedge_character(EDGE) and superedge_sides(EDGE). - * - * For a superstate edge EDGE starting in some superstate SUPER, - * the following is true (in pseudo-notation :-): - * - * exists DEST in nfa_states s.t. - * exists nfaEDGE in nfa_edges s.t. - * origin (nfaEDGE) == DEST - * && origin (nfaEDGE) is a member of nfa_states(SUPER) - * && exists PF in possible_futures(dest(nfaEDGE)) s.t. - * sides_of_possible_future (PF) == superedge_sides (EDGE) - * - * also: - * - * let SUPER2 := superedge_destination(EDGE) - * nfa_states(SUPER2) - * == union of all nfa state sets S s.t. - * exists PF in possible_futures(dest(nfaEDGE)) s.t. - * sides_of_possible_future (PF) == superedge_sides (EDGE) - * && S == dests_of_possible_future (PF) } - * - * Or in english, every superstate is a set of nfa states. A given - * character and a superstate implies many transitions in the NFA -- - * those that begin with an edge labeled with that character from a - * state in the set corresponding to the superstate. - * - * The destinations of those transitions each have a set of possible - * futures. A possible future is a list of side effects and a set of - * destination NFA states. Two sets of possible futures can be - * `merged' by combining all pairs of possible futures that have the - * same side effects. A pair is combined by creating a new future - * with the same side effect but the union of the two destination sets. - * In this way, all the possible futures suggested by a superstate - * and a character can be merged into a set of possible futures where - * no two elements of the set have the same set of side effects. - * - * The destination of a possible future, being a set of NFA states, - * corresponds to a supernfa state. So, the merged set of possible - * futures we just created can serve as a set of edges in the - * supernfa. - * - * The representation of the superstate nfa and the nfa is critical. - * The nfa has to be compact, but has to facilitate the rapid - * computation of missing superstates. The superstate nfa has to - * be fast to interpret, lazilly constructed, and bounded in space. - * - * To facilitate interpretation, the superstate data structures are - * peppered with `instruction frames'. There is an instruction set - * defined below which matchers using the supernfa must be able to - * interpret. - * - * We'd like to make it possible but not mandatory to use code - * addresses to represent instructions (c.f. gcc's computed goto). - * Therefore, we define an enumerated type of opcodes, and when - * writing one of these instructions into a data structure, use - * the opcode as an index into a table of instruction values. - * - * Here are the opcodes that occur in the superstate nfa: - */ - - -/* Every superstate contains a table of instruction frames indexed - * by characters. A normal `move' in a matcher is to fetch the next - * character and use it as an index into a superstates transition - * table. - * - * In the fasted case, only one edge follows from that character. - * In other cases there is more work to do. - * - * The descriptions of the opcodes refer to data structures that are - * described further below. - */ - -enum rx_opcode -{ - /* - * BACKTRACK_POINT is invoked when a character transition in - * a superstate leads to more than one edge. In that case, - * the edges have to be explored independently using a backtracking - * strategy. - * - * A BACKTRACK_POINT instruction is stored in a superstate's - * transition table for some character when it is known that that - * character crosses more than one edge. On encountering this - * instruction, the matcher saves enough state to backtrack to this - * point in the match later. - */ - rx_backtrack_point = 0, /* data is (struct transition_class *) */ - - /* - * RX_DO_SIDE_EFFECTS evaluates the side effects of an epsilon path. - * There is one occurence of this instruction per rx_distinct_future. - * This instruction is skipped if a rx_distinct_future has no side effects. - */ - rx_do_side_effects = rx_backtrack_point + 1, - - /* data is (struct rx_distinct_future *) */ - - /* - * RX_CACHE_MISS instructions are stored in rx_distinct_futures whose - * destination superstate has been reclaimed (or was never built). - * It recomputes the destination superstate. - * RX_CACHE_MISS is also stored in a superstate transition table before - * any of its edges have been built. - */ - rx_cache_miss = rx_do_side_effects + 1, - /* data is (struct rx_distinct_future *) */ - - /* - * RX_NEXT_CHAR is called to consume the next character and take the - * corresponding transition. This is the only instruction that uses - * the DATA field of the instruction frame instead of DATA_2. - * (see EXPLORE_FUTURE in regex.c). - */ - rx_next_char = rx_cache_miss + 1, /* data is (struct superstate *) */ - - /* RX_BACKTRACK indicates that a transition fails. - */ - rx_backtrack = rx_next_char + 1, /* no data */ - - /* - * RX_ERROR_INX is stored only in places that should never be executed. - */ - rx_error_inx = rx_backtrack + 1, /* Not supposed to occur. */ - - rx_num_instructions = rx_error_inx + 1 -}; - -/* An id_instruction_table holds the values stored in instruction - * frames. The table is indexed by the enums declared above. - */ -extern void * rx_id_instruction_table[rx_num_instructions]; - -/* The heart of the matcher is a `word-code-interpreter' - * (like a byte-code interpreter, except that instructions - * are a full word wide). - * - * Instructions are not stored in a vector of code, instead, - * they are scattered throughout the data structures built - * by the regexp compiler and the matcher. One word-code instruction, - * together with the arguments to that instruction, constitute - * an instruction frame (struct rx_inx). - * - * This structure type is padded by hand to a power of 2 because - * in one of the dominant cases, we dispatch by indexing a table - * of instruction frames. If that indexing can be accomplished - * by just a shift of the index, we're happy. - * - * Instructions take at most one argument, but there are two - * slots in an instruction frame that might hold that argument. - * These are called data and data_2. The data slot is only - * used for one instruction (RX_NEXT_CHAR). For all other - * instructions, data should be set to 0. - * - * RX_NEXT_CHAR is the most important instruction by far. - * By reserving the data field for its exclusive use, - * instruction dispatch is sped up in that case. There is - * no need to fetch both the instruction and the data, - * only the data is needed. In other words, a `cycle' begins - * by fetching the field data. If that is non-0, then it must - * be the destination state of a next_char transition, so - * make that value the current state, advance the match position - * by one character, and start a new cycle. On the other hand, - * if data is 0, fetch the instruction and do a more complicated - * dispatch on that. - */ - -struct rx_inx -{ - void * data; - void * data_2; - void * inx; - void * fnord; -}; - -#ifndef RX_TAIL_ARRAY -#define RX_TAIL_ARRAY 1 -#endif - -/* A superstate corresponds to a set of nfa states. Those sets are - * represented by STRUCT RX_SUPERSET. The constructors - * guarantee that only one (shared) structure is created for a given set. - */ -struct rx_superset -{ - int refs; /* This is a reference counted structure. */ - - /* We keep these sets in a cache because (in an unpredictable way), - * the same set is often created again and again. But that is also - * problematic -- compatibility with POSIX and GNU regex requires - * that we not be able to tell when a program discards a particular - * NFA (thus invalidating the supersets created from it). - * - * But when a cache hit appears to occur, we will have in hand the - * nfa for which it may have happened. That is why every nfa is given - * its own sequence number. On a cache hit, the cache is validated - * by comparing the nfa sequence number to this field: - */ - int id; - - struct rx_nfa_state * car; /* May or may not be a valid addr. */ - struct rx_superset * cdr; - - /* If the corresponding superstate exists: */ - struct rx_superstate * superstate; - - - /* There is another bookkeeping problem. It is expensive to - * compute the starting nfa state set for an nfa. So, once computed, - * it is cached in the `struct rx'. - * - * But, the state set can be flushed from the superstate cache. - * When that happens, we can't know if the corresponding `struct rx' - * is still alive or if it has been freed or re-used by the program. - * So, the cached pointer to this set in a struct rx might be invalid - * and we need a way to validate it. - * - * Fortunately, even if this set is flushed from the cache, it is - * not freed. It just goes on the free-list of supersets. - * So we can still examine it. - * - * So to validate a starting set memo, check to see if the - * starts_for field still points back to the struct rx in question, - * and if the ID matches the rx sequence number. - */ - struct rx * starts_for; - - /* This is used to link into a hash bucket so these objects can - * be `hash-consed'. - */ - struct rx_hash_item hash_item; -}; - -#define rx_protect_superset(RX,CON) (++(CON)->refs) - -/* The terminology may be confusing (rename this structure?). - * Every character occurs in at most one rx_super_edge per super-state. - * But, that structure might have more than one option, indicating a point - * of non-determinism. - * - * In other words, this structure holds a list of superstate edges - * sharing a common starting state and character label. The edges - * are in the field OPTIONS. All superstate edges sharing the same - * starting state and character are in this list. - */ -struct rx_super_edge -{ - struct rx_super_edge *next; - struct rx_inx rx_backtrack_frame; - int cset_size; - rx_Bitset cset; - struct rx_distinct_future *options; -}; - -/* A superstate is a set of nfa states (RX_SUPERSET) along - * with a transition table. Superstates are built on demand and reclaimed - * without warning. To protect a superstate from this ghastly fate, - * use LOCK_SUPERSTATE. - */ -struct rx_superstate -{ - int rx_id; /* c.f. the id field of rx_superset */ - int locks; /* protection from reclamation */ - - /* Within a superstate cache, all the superstates are kept in a big - * queue. The tail of the queue is the state most likely to be - * reclaimed. The *recyclable fields hold the queue position of - * this state. - */ - struct rx_superstate * next_recyclable; - struct rx_superstate * prev_recyclable; - - /* The supernfa edges that exist in the cache and that have - * this state as their destination are kept in this list: - */ - struct rx_distinct_future * transition_refs; - - /* The list of nfa states corresponding to this superstate: */ - struct rx_superset * contents; - - /* The list of edges in the cache beginning from this state. */ - struct rx_super_edge * edges; - - /* A tail of the recyclable queue is marked as semifree. A semifree - * state has no incoming next_char transitions -- any transition - * into a semifree state causes a complex dispatch with the side - * effect of rescuing the state from its semifree state. - * - * An alternative to this might be to make next_char more expensive, - * and to move a state to the head of the recyclable queue whenever - * it is entered. That way, popular states would never be recycled. - * - * But unilaterally making next_char more expensive actually loses. - * So, incoming transitions are only made expensive for states near - * the tail of the recyclable queue. The more cache contention - * there is, the more frequently a state will have to prove itself - * and be moved back to the front of the queue. If there is less - * contention, then popular states just aggregate in the front of - * the queue and stay there. - */ - int is_semifree; - - - /* This keeps track of the size of the transition table for this - * state. There is a half-hearted attempt to support variable sized - * superstates. - */ - int trans_size; - - /* Indexed by characters... */ - struct rx_inx transitions[RX_TAIL_ARRAY]; -}; - - -/* A list of distinct futures define the edges that leave from a - * given superstate on a given character. c.f. rx_super_edge. - */ - -struct rx_distinct_future -{ - struct rx_distinct_future * next_same_super_edge[2]; - struct rx_distinct_future * next_same_dest; - struct rx_distinct_future * prev_same_dest; - struct rx_superstate * present; /* source state */ - struct rx_superstate * future; /* destination state */ - struct rx_super_edge * edge; - - - /* The future_frame holds the instruction that should be executed - * after all the side effects are done, when it is time to complete - * the transition to the next state. - * - * Normally this is a next_char instruction, but it may be a - * cache_miss instruction as well, depending on whether or not - * the superstate is in the cache and semifree. - * - * If this is the only future for a given superstate/char, and - * if there are no side effects to be performed, this frame is - * not used (directly) at all. Instead, its contents are copied - * into the transition table of the starting state of this dist. future. - */ - struct rx_inx future_frame; - - struct rx_inx side_effects_frame; - struct rx_se_list * effects; -}; - -#define rx_lock_superstate(R,S) ((S)->locks++) -#define rx_unlock_superstate(R,S) (--(S)->locks) - - -/* This page destined for rx.h */ - -struct rx_blocklist -{ - struct rx_blocklist * next; - int bytes; -}; - -struct rx_freelist -{ - struct rx_freelist * next; -}; - -struct rx_cache; - -#ifdef __STDC__ -typedef void (*rx_morecore_fn)(struct rx_cache *); -#else -typedef void (*rx_morecore_fn)(); -#endif - -/* You use this to control the allocation of superstate data - * during matching. Most of it should be initialized to 0. - * - * A MORECORE function is necessary. It should allocate - * a new block of memory or return 0. - * A default that uses malloc is called `rx_morecore'. - * - * The number of SUPERSTATES_ALLOWED indirectly limits how much memory - * the system will try to allocate. The default is 128. Batch style - * applications that are very regexp intensive should use as high a number - * as possible without thrashing. - * - * The LOCAL_CSET_SIZE is the number of characters in a character set. - * It is therefore the number of entries in a superstate transition table. - * Generally, it should be 256. If your character set has 16 bits, - * it is better to translate your regexps into equivalent 8 bit patterns. - */ - -struct rx_cache -{ - struct rx_hash_rules superset_hash_rules; - - /* Objects are allocated by incrementing a pointer that - * scans across rx_blocklists. - */ - struct rx_blocklist * memory; - struct rx_blocklist * memory_pos; - int bytes_left; - char * memory_addr; - rx_morecore_fn morecore; - - /* Freelists. */ - struct rx_freelist * free_superstates; - struct rx_freelist * free_transition_classes; - struct rx_freelist * free_discernable_futures; - struct rx_freelist * free_supersets; - struct rx_freelist * free_hash; - - /* Two sets of superstates -- those that are semifreed, and those - * that are being used. - */ - struct rx_superstate * lru_superstate; - struct rx_superstate * semifree_superstate; - - struct rx_superset * empty_superset; - - int superstates; - int semifree_superstates; - int hits; - int misses; - int superstates_allowed; - - int local_cset_size; - void ** instruction_table; - - struct rx_hash superset_table; -}; - - - -/* The lowest-level search function supports arbitrarily fragmented - * strings and (optionally) suspendable/resumable searches. - * - * Callers have to provide a few hooks. - */ - -#ifndef __GNUC__ -#ifdef __STDC__ -#define __const__ const -#else -#define __const__ -#endif -#endif - -/* This holds a matcher position */ -struct rx_string_position -{ - __const__ unsigned char * pos; /* The current pos. */ - __const__ unsigned char * string; /* The current string burst. */ - __const__ unsigned char * end; /* First invalid position >= POS. */ - int offset; /* Integer address of the current burst. */ - int size; /* Current string's size. */ - int search_direction; /* 1 or -1 */ - int search_end; /* First position to not try. */ -}; - - -enum rx_get_burst_return -{ - rx_get_burst_continuation, - rx_get_burst_error, - rx_get_burst_ok, - rx_get_burst_no_more -}; - - -/* A call to get burst should make POS valid. It might be invalid - * if the STRING field doesn't point to a burst that actually - * contains POS. - * - * GET_BURST should take a clue from SEARCH_DIRECTION (1 or -1) as to - * whether or not to pad to the left. Padding to the right is always - * appropriate, but need not go past the point indicated by STOP. - * - * If a continuation is returned, then the reentering call to - * a search function will retry the get_burst. - */ - -#ifdef __STDC__ -typedef enum rx_get_burst_return - (*rx_get_burst_fn) (struct rx_string_position * pos, - void * app_closure, - int stop); - -#else -typedef enum rx_get_burst_return (*rx_get_burst_fn) (); -#endif - - -enum rx_back_check_return -{ - rx_back_check_continuation, - rx_back_check_error, - rx_back_check_pass, - rx_back_check_fail -}; - -/* Back_check should advance the position it is passed - * over rparen - lparen characters and return pass iff - * the characters starting at POS match those indexed - * by [LPAREN..RPAREN]. - * - * If a continuation is returned, then the reentering call to - * a search function will retry the back_check. - */ - -#ifdef __STDC__ -typedef enum rx_back_check_return - (*rx_back_check_fn) (struct rx_string_position * pos, - int lparen, - int rparen, - unsigned char * translate, - void * app_closure, - int stop); - -#else -typedef enum rx_back_check_return (*rx_back_check_fn) (); -#endif - - - - -/* A call to fetch_char should return the character at POS or POS + 1. - * Returning continuations here isn't supported. OFFSET is either 0 or 1 - * and indicates which characters is desired. - */ - -#ifdef __STDC__ -typedef int (*rx_fetch_char_fn) (struct rx_string_position * pos, - int offset, - void * app_closure, - int stop); -#else -typedef int (*rx_fetch_char_fn) (); -#endif - - -enum rx_search_return -{ - rx_search_continuation = -4, - rx_search_error = -3, - rx_search_soft_fail = -2, /* failed by running out of string */ - rx_search_fail = -1 /* failed only by reaching failure states */ - /* return values >= 0 indicate the position of a successful match */ -}; - - - - - - -/* regex.h - * - * The remaining declarations replace regex.h. - */ - -/* This is an array of error messages corresponding to the error codes. - */ -extern __const__ char *re_error_msg[]; - -/* If any error codes are removed, changed, or added, update the - `re_error_msg' table in regex.c. */ -typedef enum -{ - REG_NOERROR = 0, /* Success. */ - REG_NOMATCH, /* Didn't find a match (for regexec). */ - - /* POSIX regcomp return error codes. (In the order listed in the - standard.) */ - REG_BADPAT, /* Invalid pattern. */ - REG_ECOLLATE, /* Not implemented. */ - REG_ECTYPE, /* Invalid character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ - REG_EBRACE, /* Unmatched \{. */ - REG_BADBR, /* Invalid contents of \{\}. */ - REG_ERANGE, /* Invalid range end. */ - REG_ESPACE, /* Ran out of memory. */ - REG_BADRPT, /* No preceding re for repetition op. */ - - /* Error codes we've added. */ - REG_EEND, /* Premature end. */ - REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ - REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ -} reg_errcode_t; - -/* The regex.c support, as a client of rx, defines a set of possible - * side effects that can be added to the edge lables of nfa edges. - * Here is the list of sidef effects in use. - */ - -enum re_side_effects -{ -#define RX_WANT_SE_DEFS 1 -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#define RX_DEF_SE(IDEM, NAME, VALUE) NAME VALUE, -#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE) NAME VALUE, -#include "rx.h" -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#undef RX_WANT_SE_DEFS - re_floogle_flap = 65533 -}; - -/* These hold paramaters for the kinds of side effects that are possible - * in the supported pattern languages. These include things like the - * numeric bounds of {} operators and the index of paren registers for - * subexpression measurement or backreferencing. - */ -struct re_se_params -{ - enum re_side_effects se; - int op1; - int op2; -}; - -typedef unsigned reg_syntax_t; - -struct re_pattern_buffer -{ - struct rx rx; - reg_syntax_t syntax; /* See below for syntax bit definitions. */ - - unsigned int no_sub:1; /* If set, don't return register offsets. */ - unsigned int not_bol:1; /* If set, the anchors ('^' and '$') don't */ - unsigned int not_eol:1; /* match at the ends of the string. */ - unsigned int newline_anchor:1;/* If true, an anchor at a newline matches.*/ - unsigned int least_subs:1; /* If set, and returning registers, return - * as few values as possible. Only - * backreferenced groups and group 0 (the whole - * match) will be returned. - */ - - /* If true, this says that the matcher should keep registers on its - * backtracking stack. For many patterns, we can easily determine that - * this isn't necessary. - */ - unsigned int match_regs_on_stack:1; - unsigned int search_regs_on_stack:1; - - /* is_anchored and begbuf_only are filled in by rx_compile. */ - unsigned int is_anchored:1; /* Anchorded by ^? */ - unsigned int begbuf_only:1; /* Anchored to char position 0? */ - - - /* If REGS_UNALLOCATED, allocate space in the `regs' structure - * for `max (RE_NREGS, re_nsub + 1)' groups. - * If REGS_REALLOCATE, reallocate space if necessary. - * If REGS_FIXED, use what's there. - */ -#define REGS_UNALLOCATED 0 -#define REGS_REALLOCATE 1 -#define REGS_FIXED 2 - unsigned int regs_allocated:2; - - - /* Either a translate table to apply to all characters before - * comparing them, or zero for no translation. The translation - * is applied to a pattern when it is compiled and to a string - * when it is matched. - */ - unsigned char * translate; - - /* If this is a valid pointer, it tells rx not to store the extents of - * certain subexpressions (those corresponding to non-zero entries). - * Passing 0x1 is the same as passing an array of all ones. Passing 0x0 - * is the same as passing an array of all zeros. - * The array should contain as many entries as their are subexps in the - * regexp. - * - * For POSIX compatability, when using regcomp and regexec this field - * is zeroed and ignored. - */ - char * syntax_parens; - - /* Number of subexpressions found by the compiler. */ - size_t re_nsub; - - void * buffer; /* Malloced memory for the nfa. */ - unsigned long allocated; /* Size of that memory. */ - - /* Pointer to a fastmap, if any, otherwise zero. re_search uses - * the fastmap, if there is one, to skip over impossible - * starting points for matches. */ - char *fastmap; - - unsigned int fastmap_accurate:1; /* These three are internal. */ - unsigned int can_match_empty:1; - struct rx_nfa_state * start; /* The nfa starting state. */ - - /* This is the list of iterator bounds for {lo,hi} constructs. - * The memory pointed to is part of the rx->buffer. - */ - struct re_se_params *se_params; - - /* This is a bitset representation of the fastmap. - * This is a true fastmap that already takes the translate - * table into account. - */ - rx_Bitset fastset; -}; - -/* Type for byte offsets within the string. POSIX mandates this. */ -typedef int regoff_t; - -/* This is the structure we store register match data in. See - regex.texinfo for a full description of what registers match. */ -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - -typedef struct re_pattern_buffer regex_t; - -/* POSIX specification for registers. Aside from the different names than - `re_registers', POSIX uses an array of structures, instead of a - structure of arrays. */ -typedef struct -{ - regoff_t rm_so; /* Byte offset from string's start to substring's start. */ - regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ -} regmatch_t; - - -/* The following bits are used to determine the regexp syntax we - recognize. The set/not-set meanings are chosen so that Emacs syntax - remains the value 0. The bits are given in alphabetical order, and - the definitions shifted by one from the previous bit; thus, when we - add or remove a bit, only one other definition need change. */ - -/* If this bit is not set, then \ inside a bracket expression is literal. - If set, then such a \ quotes the following character. */ -#define RE_BACKSLASH_ESCAPE_IN_LISTS (1) - -/* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. - If set, then \+ and \? are operators and + and ? are literals. */ -#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) - -/* If this bit is set, then character classes are supported. They are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) - -/* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions, of course). - If this bit is not set, then it depends: - ^ is an anchor if it is at the beginning of a regular - expression or after an open-group or an alternation operator; - $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. - - This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX draft 11.2 says that * etc. in leading positions is undefined. - We already implemented a previous draft which made those constructs - invalid, though, so we haven't changed the code back. */ -#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) - -/* If this bit is set, then special characters are always special - regardless of where they are in the pattern. - If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, - * + ? and intervals are only special when not after the beginning, - open-group, or alternation operator. */ -#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) - -/* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. */ -#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) - -/* If this bit is set, then . matches newline. - If not set, then it doesn't. */ -#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) - -/* If this bit is set, then . doesn't match NUL. - If not set, then it does. */ -#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) - -/* If this bit is set, nonmatching lists [^...] do not match newline. - If not set, they do. */ -#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) - -/* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. - If not set, \{, \}, {, and } are literals. */ -#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) - -/* If this bit is set, +, ? and | aren't recognized as operators. - If not set, they are. */ -#define RE_LIMITED_OPS (RE_INTERVALS << 1) - -/* If this bit is set, newline is an alternation operator. - If not set, newline is literal. */ -#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) - -/* If this bit is set, then `{...}' defines an interval, and \{ and \} - are literals. - If not set, then `\{...\}' defines an interval. */ -#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) - -/* If this bit is set, (...) defines a group, and \( and \) are literals. - If not set, \(...\) defines a group, and ( and ) are literals. */ -#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) - -/* If this bit is set, then \<digit> matches <digit>. - If not set, then \<digit> is a back-reference. */ -#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) - -/* If this bit is set, then | is an alternation operator, and \| is literal. - If not set, then \| is an alternation operator, and | is literal. */ -#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) - -/* If this bit is set, then an ending range point collating higher - than the starting range point, as in [z-a], is invalid. - If not set, then when ending range point collates higher than the - starting range point, the range is ignored. */ -#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then an unmatched ) is ordinary. - If not set, then an unmatched ) is invalid. */ -#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) - -/* This global variable defines the particular regexp syntax to use (for - some interfaces). When a regexp is compiled, the syntax used is - stored in the pattern buffer, so changing this does not affect - already-compiled regexps. */ -extern reg_syntax_t re_syntax_options; - -/* Define combinations of the above bits for the standard possibilities. - (The [[[ comments delimit what gets put into the Texinfo file, so - don't delete them!) */ -/* [[[begin syntaxes]]] */ -#define RE_SYNTAX_EMACS 0 - -#define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -#define RE_SYNTAX_POSIX_AWK \ - (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) - -#define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ - | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ - | RE_NEWLINE_ALT) - -#define RE_SYNTAX_EGREP \ - (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - -#define RE_SYNTAX_POSIX_EGREP \ - (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) - -#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC - -/* Syntax bits common to both basic and extended POSIX regex syntax. */ -#define _RE_SYNTAX_POSIX_COMMON \ - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -#define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) - -/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this - isn't minimal, since other operators, such as \`, aren't disabled. */ -#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) - -#define RE_SYNTAX_POSIX_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS - replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ -#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) -/* [[[end syntaxes]]] */ - -/* Maximum number of duplicates an interval can allow. Some systems - (erroneously) define this in other header files, but we want our - value, so remove any previous define. */ -#ifdef RE_DUP_MAX -#undef RE_DUP_MAX -#endif -#define RE_DUP_MAX ((1 << 15) - 1) - - - -/* POSIX `cflags' bits (i.e., information for `regcomp'). */ - -/* If this bit is set, then use extended regular expression syntax. - If not set, then use basic regular expression syntax. */ -#define REG_EXTENDED 1 - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -#define REG_ICASE (REG_EXTENDED << 1) - -/* If this bit is set, then anchors do not match at newline - characters in the string. - If not set, then anchors do match at newlines. */ -#define REG_NEWLINE (REG_ICASE << 1) - -/* If this bit is set, then report only success or fail in regexec. - If not set, then returns differ between not matching and errors. */ -#define REG_NOSUB (REG_NEWLINE << 1) - - -/* POSIX `eflags' bits (i.e., information for regexec). */ - -/* If this bit is set, then the beginning-of-line operator doesn't match - the beginning of the string (presumably because it's not the - beginning of a line). - If not set, then the beginning-of-line operator does match the - beginning of the string. */ -#define REG_NOTBOL 1 - -/* Like REG_NOTBOL, except for the end-of-line. */ -#define REG_NOTEOL (1 << 1) - -/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, - * `re_match_2' returns information about at least this many registers - * the first time a `regs' structure is passed. - * - * Also, this is the greatest number of backreferenced subexpressions - * allowed in a pattern being matched without caller-supplied registers. - */ -#ifndef RE_NREGS -#define RE_NREGS 30 -#endif - -extern int rx_cache_bound; -extern char rx_version_string[]; - - - -#ifdef RX_WANT_RX_DEFS - -/* This is decls to the interesting subsystems and lower layers - * of rx. Everything which doesn't have a public counterpart in - * regex.c is declared here. - */ - - -#ifdef __STDC__ -typedef void (*rx_hash_freefn) (struct rx_hash_item * it); -#else /* ndef __STDC__ */ -typedef void (*rx_hash_freefn) (); -#endif /* ndef __STDC__ */ - - - - -#ifdef __STDC__ -RX_DECL int rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b); -RX_DECL int rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b); -RX_DECL int rx_bitset_empty (int size, rx_Bitset set); -RX_DECL void rx_bitset_null (int size, rx_Bitset b); -RX_DECL void rx_bitset_universe (int size, rx_Bitset b); -RX_DECL void rx_bitset_complement (int size, rx_Bitset b); -RX_DECL void rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_union (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_intersection (int size, - rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_revdifference (int size, - rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b); -RX_DECL unsigned long rx_bitset_hash (int size, rx_Bitset b); -RX_DECL struct rx_hash_item * rx_hash_find (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules); -RX_DECL struct rx_hash_item * rx_hash_store (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules); -RX_DECL void rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules); -RX_DECL void rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn, - struct rx_hash_rules * rules); -RX_DECL rx_Bitset rx_cset (struct rx *rx); -RX_DECL rx_Bitset rx_copy_cset (struct rx *rx, rx_Bitset a); -RX_DECL void rx_free_cset (struct rx * rx, rx_Bitset c); -RX_DECL struct rexp_node * rexp_node (struct rx *rx, - enum rexp_node_type type); -RX_DECL struct rexp_node * rx_mk_r_cset (struct rx * rx, - rx_Bitset b); -RX_DECL struct rexp_node * rx_mk_r_concat (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_alternate (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_opt (struct rx * rx, - struct rexp_node * a); -RX_DECL struct rexp_node * rx_mk_r_star (struct rx * rx, - struct rexp_node * a); -RX_DECL struct rexp_node * rx_mk_r_2phase_star (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_side_effect (struct rx * rx, - rx_side_effect a); -RX_DECL struct rexp_node * rx_mk_r_data (struct rx * rx, - void * a); -RX_DECL void rx_free_rexp (struct rx * rx, struct rexp_node * node); -RX_DECL struct rexp_node * rx_copy_rexp (struct rx *rx, - struct rexp_node *node); -RX_DECL struct rx_nfa_state * rx_nfa_state (struct rx *rx); -RX_DECL void rx_free_nfa_state (struct rx_nfa_state * n); -RX_DECL struct rx_nfa_state * rx_id_to_nfa_state (struct rx * rx, - int id); -RX_DECL struct rx_nfa_edge * rx_nfa_edge (struct rx *rx, - enum rx_nfa_etype type, - struct rx_nfa_state *start, - struct rx_nfa_state *dest); -RX_DECL void rx_free_nfa_edge (struct rx_nfa_edge * e); -RX_DECL void rx_free_nfa (struct rx *rx); -RX_DECL int rx_build_nfa (struct rx *rx, - struct rexp_node *rexp, - struct rx_nfa_state **start, - struct rx_nfa_state **end); -RX_DECL void rx_name_nfa_states (struct rx *rx); -RX_DECL int rx_eclose_nfa (struct rx *rx); -RX_DECL void rx_delete_epsilon_transitions (struct rx *rx); -RX_DECL int rx_compactify_nfa (struct rx *rx, - void **mem, unsigned long *size); -RX_DECL void rx_release_superset (struct rx *rx, - struct rx_superset *set); -RX_DECL struct rx_superset * rx_superset_cons (struct rx * rx, - struct rx_nfa_state *car, struct rx_superset *cdr); -RX_DECL struct rx_superset * rx_superstate_eclosure_union - (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl); -RX_DECL struct rx_superstate * rx_superstate (struct rx *rx, - struct rx_superset *set); -RX_DECL struct rx_inx * rx_handle_cache_miss - (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data); -RX_DECL reg_errcode_t rx_compile (__const__ char *pattern, int size, - reg_syntax_t syntax, - struct re_pattern_buffer * rxb); -RX_DECL void rx_blow_up_fastmap (struct re_pattern_buffer * rxb); -#else /* STDC */ -RX_DECL int rx_bitset_is_equal (); -RX_DECL int rx_bitset_is_subset (); -RX_DECL int rx_bitset_empty (); -RX_DECL void rx_bitset_null (); -RX_DECL void rx_bitset_universe (); -RX_DECL void rx_bitset_complement (); -RX_DECL void rx_bitset_assign (); -RX_DECL void rx_bitset_union (); -RX_DECL void rx_bitset_intersection (); -RX_DECL void rx_bitset_difference (); -RX_DECL void rx_bitset_revdifference (); -RX_DECL void rx_bitset_xor (); -RX_DECL unsigned long rx_bitset_hash (); -RX_DECL struct rx_hash_item * rx_hash_find (); -RX_DECL struct rx_hash_item * rx_hash_store (); -RX_DECL void rx_hash_free (); -RX_DECL void rx_free_hash_table (); -RX_DECL rx_Bitset rx_cset (); -RX_DECL rx_Bitset rx_copy_cset (); -RX_DECL void rx_free_cset (); -RX_DECL struct rexp_node * rexp_node (); -RX_DECL struct rexp_node * rx_mk_r_cset (); -RX_DECL struct rexp_node * rx_mk_r_concat (); -RX_DECL struct rexp_node * rx_mk_r_alternate (); -RX_DECL struct rexp_node * rx_mk_r_opt (); -RX_DECL struct rexp_node * rx_mk_r_star (); -RX_DECL struct rexp_node * rx_mk_r_2phase_star (); -RX_DECL struct rexp_node * rx_mk_r_side_effect (); -RX_DECL struct rexp_node * rx_mk_r_data (); -RX_DECL void rx_free_rexp (); -RX_DECL struct rexp_node * rx_copy_rexp (); -RX_DECL struct rx_nfa_state * rx_nfa_state (); -RX_DECL void rx_free_nfa_state (); -RX_DECL struct rx_nfa_state * rx_id_to_nfa_state (); -RX_DECL struct rx_nfa_edge * rx_nfa_edge (); -RX_DECL void rx_free_nfa_edge (); -RX_DECL void rx_free_nfa (); -RX_DECL int rx_build_nfa (); -RX_DECL void rx_name_nfa_states (); -RX_DECL int rx_eclose_nfa (); -RX_DECL void rx_delete_epsilon_transitions (); -RX_DECL int rx_compactify_nfa (); -RX_DECL void rx_release_superset (); -RX_DECL struct rx_superset * rx_superset_cons (); -RX_DECL struct rx_superset * rx_superstate_eclosure_union (); -RX_DECL struct rx_superstate * rx_superstate (); -RX_DECL struct rx_inx * rx_handle_cache_miss (); -RX_DECL reg_errcode_t rx_compile (); -RX_DECL void rx_blow_up_fastmap (); -#endif /* STDC */ - - -#endif /* RX_WANT_RX_DEFS */ - - - -#ifdef __STDC__ -extern int re_search_2 (struct re_pattern_buffer *rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int startpos, int range, - struct re_registers *regs, - int stop); -extern int re_search (struct re_pattern_buffer * rxb, __const__ char *string, - int size, int startpos, int range, - struct re_registers *regs); -extern int re_match_2 (struct re_pattern_buffer * rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int pos, struct re_registers *regs, int stop); -extern int re_match (struct re_pattern_buffer * rxb, - __const__ char * string, - int size, int pos, - struct re_registers *regs); -extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); -extern void re_set_registers (struct re_pattern_buffer *bufp, - struct re_registers *regs, - unsigned num_regs, - regoff_t * starts, regoff_t * ends); -extern __const__ char * re_compile_pattern (__const__ char *pattern, - int length, - struct re_pattern_buffer * rxb); -extern int re_compile_fastmap (struct re_pattern_buffer * rxb); -extern char * re_comp (__const__ char *s); -extern int re_exec (__const__ char *s); -extern int regcomp (regex_t * preg, __const__ char * pattern, int cflags); -extern int regexec (__const__ regex_t *preg, __const__ char *string, - size_t nmatch, regmatch_t pmatch[], - int eflags); -extern size_t regerror (int errcode, __const__ regex_t *preg, - char *errbuf, size_t errbuf_size); -extern void regfree (regex_t *preg); - -#else /* STDC */ -extern int re_search_2 (); -extern int re_search (); -extern int re_match_2 (); -extern int re_match (); -extern reg_syntax_t re_set_syntax (); -extern void re_set_registers (); -extern __const__ char * re_compile_pattern (); -extern int re_compile_fastmap (); -extern char * re_comp (); -extern int re_exec (); -extern int regcomp (); -extern int regexec (); -extern size_t regerror (); -extern void regfree (); - -#endif /* STDC */ - - - -#ifdef RX_WANT_RX_DEFS - -struct rx_counter_frame -{ - int tag; - int val; - struct rx_counter_frame * inherited_from; /* If this is a copy. */ - struct rx_counter_frame * cdr; -}; - -struct rx_backtrack_frame -{ - char * counter_stack_sp; - - /* A frame is used to save the matchers state when it crosses a - * backtracking point. The `stk_' fields correspond to variables - * in re_search_2 (just strip off thes `stk_'). They are documented - * tere. - */ - struct rx_superstate * stk_super; - unsigned int stk_c; - struct rx_string_position stk_test_pos; - int stk_last_l; - int stk_last_r; - int stk_test_ret; - - /* This is the list of options left to explore at the backtrack - * point for which this frame was created. - */ - struct rx_distinct_future * df; - struct rx_distinct_future * first_df; - -#ifdef RX_DEBUG - int stk_line_no; -#endif -}; - -struct rx_stack_chunk -{ - struct rx_stack_chunk * next_chunk; - int bytes_left; - char * sp; -}; - -enum rx_outer_entry -{ - rx_outer_start, - rx_outer_fastmap, - rx_outer_test, - rx_outer_restore_pos -}; - -enum rx_fastmap_return -{ - rx_fastmap_continuation, - rx_fastmap_error, - rx_fastmap_ok, - rx_fastmap_fail -}; - -enum rx_fastmap_entry -{ - rx_fastmap_start, - rx_fastmap_string_break -}; - -enum rx_test_return -{ - rx_test_continuation, - rx_test_error, - rx_test_fail, - rx_test_ok -}; - -enum rx_test_internal_return -{ - rx_test_internal_error, - rx_test_found_first, - rx_test_line_finished -}; - -enum rx_test_match_entry -{ - rx_test_start, - rx_test_cache_hit_loop, - rx_test_backreference_check, - rx_test_backtrack_return -}; - -struct rx_search_state -{ - /* Two groups of registers are kept. The group with the register state - * of the current test match, and the group that holds the state at the end - * of the best known match, if any. - * - * For some patterns, there may also be registers saved on the stack. - */ - unsigned num_regs; /* Includes an element for register zero. */ - regoff_t * lparen; /* scratch space for register returns */ - regoff_t * rparen; - regoff_t * best_lpspace; /* in case the user doesn't want these */ - regoff_t * best_rpspace; /* values, we still need space to store - * them. Normally, this memoryis unused - * and the space pointed to by REGS is - * used instead. - */ - - int last_l; /* Highest index of a valid lparen. */ - int last_r; /* It's dual. */ - - int * best_lparen; /* This contains the best known register */ - int * best_rparen; /* assignments. - * This may point to the same mem as - * best_lpspace, or it might point to memory - * passed by the caller. - */ - int best_last_l; /* best_last_l:best_lparen::last_l:lparen */ - int best_last_r; - - - unsigned char * translate; - - struct rx_string_position outer_pos; - - struct rx_superstate * start_super; - int nfa_choice; - int first_found; /* If true, return after finding any match. */ - int ret_val; - - /* For continuations... */ - enum rx_outer_entry outer_search_resume_pt; - struct re_pattern_buffer * saved_rxb; - int saved_startpos; - int saved_range; - int saved_stop; - int saved_total_size; - rx_get_burst_fn saved_get_burst; - rx_back_check_fn saved_back_check; - struct re_registers * saved_regs; - - /** - ** state for fastmap - **/ - char * fastmap; - int fastmap_chr; - int fastmap_val; - - /* for continuations in the fastmap procedure: */ - enum rx_fastmap_entry fastmap_resume_pt; - - /** - ** state for test_match - **/ - - /* The current superNFA position of the matcher. */ - struct rx_superstate * super; - - /* The matcher interprets a series of instruction frames. - * This is the `instruction counter' for the interpretation. - */ - struct rx_inx * ifr; - - /* We insert a ghost character in the string to prime - * the nfa. test_pos.pos, test_pos.str_half, and test_pos.end_half - * keep track of the test-match position and string-half. - */ - unsigned char c; - - /* Position within the string. */ - struct rx_string_position test_pos; - - struct rx_stack_chunk * counter_stack; - struct rx_stack_chunk * backtrack_stack; - int backtrack_frame_bytes; - int chunk_bytes; - struct rx_stack_chunk * free_chunks; - - /* To return from this function, set test_ret and - * `goto test_do_return'. - * - * Possible return values are: - * 1 --- end of string while the superNFA is still going - * 0 --- internal error (out of memory) - * -1 --- search completed by reaching the superNFA fail state - * -2 --- a match was found, maybe not the longest. - * - * When the search is complete (-1), best_last_r indicates whether - * a match was found. - * - * -2 is return only if search_state.first_found is non-zero. - * - * if search_state.first_found is non-zero, a return of -1 indicates no match, - * otherwise, best_last_r has to be checked. - */ - int test_ret; - - int could_have_continued; - -#ifdef RX_DEBUG - int backtrack_depth; - /* There is a search tree with every node as set of deterministic - * transitions in the super nfa. For every branch of a - * backtrack point is an edge in the tree. - * This counts up a pre-order of nodes in that tree. - * It's saved on the search stack and printed when debugging. - */ - int line_no; - int lines_found; -#endif - - - /* For continuations within the match tester */ - enum rx_test_match_entry test_match_resume_pt; - struct rx_inx * saved_next_tr_table; - struct rx_inx * saved_this_tr_table; - int saved_reg; - struct rx_backtrack_frame * saved_bf; - -}; - - -extern char rx_slowmap[]; -extern unsigned char rx_id_translation[]; - -static __inline__ void -init_fastmap (rxb, search_state) - struct re_pattern_buffer * rxb; - struct rx_search_state * search_state; -{ - search_state->fastmap = (rxb->fastmap - ? (char *)rxb->fastmap - : (char *)rx_slowmap); - /* Update the fastmap now if not correct already. - * When the regexp was compiled, the fastmap was computed - * and stored in a bitset. This expands the bitset into a - * character array containing 1s and 0s. - */ - if ((search_state->fastmap == rxb->fastmap) && !rxb->fastmap_accurate) - rx_blow_up_fastmap (rxb); - search_state->fastmap_chr = -1; - search_state->fastmap_val = 0; - search_state->fastmap_resume_pt = rx_fastmap_start; -} - -static __inline__ void -uninit_fastmap (rxb, search_state) - struct re_pattern_buffer * rxb; - struct rx_search_state * search_state; -{ - /* Unset the fastmap sentinel */ - if (search_state->fastmap_chr >= 0) - search_state->fastmap[search_state->fastmap_chr] - = search_state->fastmap_val; -} - -static __inline__ int -fastmap_search (rxb, stop, get_burst, app_closure, search_state) - struct re_pattern_buffer * rxb; - int stop; - rx_get_burst_fn get_burst; - void * app_closure; - struct rx_search_state * search_state; -{ - enum rx_fastmap_entry pc; - - if (0) - { - return_continuation: - search_state->fastmap_resume_pt = pc; - return rx_fastmap_continuation; - } - - pc = search_state->fastmap_resume_pt; - - switch (pc) - { - default: - return rx_fastmap_error; - case rx_fastmap_start: - init_fastmap_sentinal: - /* For the sake of fast fastmapping, set a sentinal in the fastmap. - * This sentinal will trap the fastmap loop when it reaches the last - * valid character in a string half. - * - * This must be reset when the fastmap/search loop crosses a string - * boundry, and before returning to the caller. So sometimes, - * the fastmap loop is restarted with `continue', othertimes by - * `goto init_fastmap_sentinal'. - */ - if (search_state->outer_pos.size) - { - search_state->fastmap_chr = ((search_state->outer_pos.search_direction == 1) - ? *(search_state->outer_pos.end - 1) - : *search_state->outer_pos.string); - search_state->fastmap_val - = search_state->fastmap[search_state->fastmap_chr]; - search_state->fastmap[search_state->fastmap_chr] = 1; - } - else - { - search_state->fastmap_chr = -1; - search_state->fastmap_val = 0; - } - - if (search_state->outer_pos.pos >= search_state->outer_pos.end) - goto fastmap_hit_bound; - else - { - if (search_state->outer_pos.search_direction == 1) - { - if (search_state->fastmap_val) - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - ++search_state->outer_pos.pos; - return rx_fastmap_ok; - } - } - else - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - ++search_state->outer_pos.pos; - if (*search_state->outer_pos.pos != search_state->fastmap_chr) - return rx_fastmap_ok; - else - { - ++search_state->outer_pos.pos; - if (search_state->outer_pos.pos == search_state->outer_pos.end) - goto fastmap_hit_bound; - } - } - } - } - else - { - __const__ unsigned char * bound; - bound = search_state->outer_pos.string - 1; - if (search_state->fastmap_val) - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - --search_state->outer_pos.pos; - return rx_fastmap_ok; - } - } - else - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - --search_state->outer_pos.pos; - if ((*search_state->outer_pos.pos != search_state->fastmap_chr) || search_state->fastmap_val) - return rx_fastmap_ok; - else - { - --search_state->outer_pos.pos; - if (search_state->outer_pos.pos == bound) - goto fastmap_hit_bound; - } - } - } - } - } - - case rx_fastmap_string_break: - fastmap_hit_bound: - { - /* If we hit a bound, it may be time to fetch another burst - * of string, or it may be time to return a continuation to - * the caller, or it might be time to fail. - */ - - int burst_state; - burst_state = get_burst (&search_state->outer_pos, app_closure, stop); - switch (burst_state) - { - default: - case rx_get_burst_error: - return rx_fastmap_error; - case rx_get_burst_continuation: - { - pc = rx_fastmap_string_break; - goto return_continuation; - } - case rx_get_burst_ok: - goto init_fastmap_sentinal; - case rx_get_burst_no_more: - /* ...not a string split, simply no more string. - * - * When searching backward, running out of string - * is reason to quit. - * - * When searching forward, we allow the possibility - * of an (empty) match after the last character in the - * virtual string. So, fall through to the matcher - */ - return ( (search_state->outer_pos.search_direction == 1) - ? rx_fastmap_ok - : rx_fastmap_fail); - } - } - } - -} - - - -#ifdef emacs -/* The `emacs' switch turns on certain matching commands - * that make sense only in Emacs. - */ -#include "config.h" -#include "lisp.h" -#include "buffer.h" -#include "syntax.h" -#endif /* emacs */ - -/* Setting RX_MEMDBUG is useful if you have dbmalloc. Maybe with similar - * packages too. - */ -#ifdef RX_MEMDBUG -#include <malloc.h> -#endif /* RX_RX_MEMDBUG */ - -/* We used to test for `BSTRING' here, but only GCC and Emacs define - * `BSTRING', as far as I know, and neither of them use this code. - */ -#if HAVE_STRING_H || STDC_HEADERS -#include <string.h> - -#ifndef bcmp -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#endif - -#ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif - -#ifndef bzero -#define bzero(s, n) memset ((s), 0, (n)) -#endif - -#else /* HAVE_STRING_H || STDC_HEADERS */ -#include <strings.h> -#endif /* not (HAVE_STRING_H || STDC_HEADERS) */ - -#ifdef STDC_HEADERS -#include <stdlib.h> -#else /* not STDC_HEADERS */ -char *malloc (); -char *realloc (); -#endif /* not STDC_HEADERS */ - - - - -/* How many characters in the character set. */ -#define CHAR_SET_SIZE (1 << CHARBITS) - -#ifndef emacs -/* Define the syntax basics for \<, \>, etc. - * This must be nonzero for the wordchar and notwordchar pattern - * commands in re_match_2. - */ -#ifndef Sword -#define Sword 1 -#endif -#define SYNTAX(c) re_syntax_table[c] -RX_DECL char re_syntax_table[CHAR_SET_SIZE]; -#endif /* not emacs */ - - -/* Test if at very beginning or at very end of the virtual concatenation - * of `string1' and `string2'. If only one string, it's `string2'. - */ - -#define AT_STRINGS_BEG() \ - ( -1 \ - == ((search_state.test_pos.pos - search_state.test_pos.string) \ - + search_state.test_pos.offset)) - -#define AT_STRINGS_END() \ - ( (total_size - 1) \ - == ((search_state.test_pos.pos - search_state.test_pos.string) \ - + search_state.test_pos.offset)) - - -/* Test if POS + 1 points to a character which is word-constituent. We have - * two special cases to check for: if past the end of string1, look at - * the first character in string2; and if before the beginning of - * string2, look at the last character in string1. - * - * Assumes `string1' exists, so use in conjunction with AT_STRINGS_BEG (). - */ -#define LETTER_P(POS,OFF) \ - ( SYNTAX (fetch_char(POS, OFF, app_closure, stop)) \ - == Sword) - -/* Test if the character at D and the one after D differ with respect - * to being word-constituent. - */ -#define AT_WORD_BOUNDARY(d) \ - (AT_STRINGS_BEG () || AT_STRINGS_END () || LETTER_P (d,0) != LETTER_P (d, 1)) - - -#ifdef RX_SUPPORT_CONTINUATIONS -#define RX_STACK_ALLOC(BYTES) malloc(BYTES) -#define RX_STACK_FREE(MEM) free(MEM) -#else -#define RX_STACK_ALLOC(BYTES) alloca(BYTES) -#define RX_STACK_FREE(MEM) \ - ((struct rx_stack_chunk *)MEM)->next_chunk = search_state.free_chunks; \ - search_state.free_chunks = ((struct rx_stack_chunk *)MEM); - -#endif - -#define PUSH(CHUNK_VAR,BYTES) \ - if (!CHUNK_VAR || (CHUNK_VAR->bytes_left < (BYTES))) \ - { \ - struct rx_stack_chunk * new_chunk; \ - if (search_state.free_chunks) \ - { \ - new_chunk = search_state.free_chunks; \ - search_state.free_chunks = search_state.free_chunks->next_chunk; \ - } \ - else \ - { \ - new_chunk = (struct rx_stack_chunk *)RX_STACK_ALLOC(search_state.chunk_bytes); \ - if (!new_chunk) \ - { \ - search_state.ret_val = 0; \ - goto test_do_return; \ - } \ - } \ - new_chunk->sp = (char *)new_chunk + sizeof (struct rx_stack_chunk); \ - new_chunk->bytes_left = (search_state.chunk_bytes \ - - (BYTES) \ - - sizeof (struct rx_stack_chunk)); \ - new_chunk->next_chunk = CHUNK_VAR; \ - CHUNK_VAR = new_chunk; \ - } \ - else \ - (CHUNK_VAR->sp += (BYTES)), (CHUNK_VAR->bytes_left -= (BYTES)) - -#define POP(CHUNK_VAR,BYTES) \ - if (CHUNK_VAR->sp == ((char *)CHUNK_VAR + sizeof(*CHUNK_VAR))) \ - { \ - struct rx_stack_chunk * new_chunk = CHUNK_VAR->next_chunk; \ - RX_STACK_FREE(CHUNK_VAR); \ - CHUNK_VAR = new_chunk; \ - } \ - else \ - (CHUNK_VAR->sp -= BYTES), (CHUNK_VAR->bytes_left += BYTES) - - - -#define SRCH_TRANSLATE(C) search_state.translate[(unsigned char) (C)] - - - - -#ifdef __STDC__ -RX_DECL __inline__ int -rx_search (struct re_pattern_buffer * rxb, - int startpos, - int range, - int stop, - int total_size, - rx_get_burst_fn get_burst, - rx_back_check_fn back_check, - rx_fetch_char_fn fetch_char, - void * app_closure, - struct re_registers * regs, - struct rx_search_state * resume_state, - struct rx_search_state * save_state) -#else -RX_DECL __inline__ int -rx_search (rxb, startpos, range, stop, total_size, - get_burst, back_check, fetch_char, - app_closure, regs, resume_state, save_state) - struct re_pattern_buffer * rxb; - int startpos; - int range; - int stop; - int total_size; - rx_get_burst_fn get_burst; - rx_back_check_fn back_check; - rx_fetch_char_fn fetch_char; - void * app_closure; - struct re_registers * regs; - struct rx_search_state * resume_state; - struct rx_search_state * save_state; -#endif -{ - int pc; - int test_state; - struct rx_search_state search_state; - - search_state.free_chunks = 0; - if (!resume_state) - pc = rx_outer_start; - else - { - search_state = *resume_state; - regs = search_state.saved_regs; - rxb = search_state.saved_rxb; - startpos = search_state.saved_startpos; - range = search_state.saved_range; - stop = search_state.saved_stop; - total_size = search_state.saved_total_size; - get_burst = search_state.saved_get_burst; - back_check = search_state.saved_back_check; - pc = search_state.outer_search_resume_pt; - if (0) - { - return_continuation: - if (save_state) - { - *save_state = search_state; - save_state->saved_regs = regs; - save_state->saved_rxb = rxb; - save_state->saved_startpos = startpos; - save_state->saved_range = range; - save_state->saved_stop = stop; - save_state->saved_total_size = total_size; - save_state->saved_get_burst = get_burst; - save_state->saved_back_check = back_check; - save_state->outer_search_resume_pt = pc; - } - return rx_search_continuation; - } - } - - switch (pc) - { - case rx_outer_start: - search_state.ret_val = rx_search_fail; - ( search_state.lparen - = search_state.rparen - = search_state.best_lpspace - = search_state.best_rpspace - = 0); - - /* figure the number of registers we may need for use in backreferences. - * the number here includes an element for register zero. - */ - search_state.num_regs = rxb->re_nsub + 1; - - - /* check for out-of-range startpos. */ - if ((startpos < 0) || (startpos > total_size)) - return rx_search_fail; - - /* fix up range if it might eventually take us outside the string. */ - { - int endpos; - endpos = startpos + range; - if (endpos < -1) - range = (-1 - startpos); - else if (endpos > (total_size + 1)) - range = total_size - startpos; - } - - /* if the search isn't to be a backwards one, don't waste time in a - * long search for a pattern that says it is anchored. - */ - if (rxb->begbuf_only && (range > 0)) - { - if (startpos > 0) - return rx_search_fail; - else - range = 1; - } - - /* decide whether to use internal or user-provided reg buffers. */ - if (!regs || rxb->no_sub) - { - search_state.best_lpspace = - (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.best_rpspace = - (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.best_lparen = search_state.best_lpspace; - search_state.best_rparen = search_state.best_rpspace; - } - else - { - /* have the register data arrays been allocated? */ - if (rxb->regs_allocated == REGS_UNALLOCATED) - { /* no. so allocate them with malloc. we need one - extra element beyond `search_state.num_regs' for the `-1' marker - gnu code uses. */ - regs->num_regs = MAX (RE_NREGS, rxb->re_nsub + 1); - regs->start = ((regoff_t *) - malloc (regs->num_regs * sizeof ( regoff_t))); - regs->end = ((regoff_t *) - malloc (regs->num_regs * sizeof ( regoff_t))); - if (regs->start == 0 || regs->end == 0) - return rx_search_error; - rxb->regs_allocated = REGS_REALLOCATE; - } - else if (rxb->regs_allocated == REGS_REALLOCATE) - { /* yes. if we need more elements than were already - allocated, reallocate them. if we need fewer, just - leave it alone. */ - if (regs->num_regs < search_state.num_regs + 1) - { - regs->num_regs = search_state.num_regs + 1; - regs->start = ((regoff_t *) - realloc (regs->start, - regs->num_regs * sizeof (regoff_t))); - regs->end = ((regoff_t *) - realloc (regs->end, - regs->num_regs * sizeof ( regoff_t))); - if (regs->start == 0 || regs->end == 0) - return rx_search_error; - } - } - else if (rxb->regs_allocated != REGS_FIXED) - return rx_search_error; - - if (regs->num_regs < search_state.num_regs + 1) - { - search_state.best_lpspace = - ((regoff_t *) - REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t))); - search_state.best_rpspace = - ((regoff_t *) - REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t))); - search_state.best_lparen = search_state.best_lpspace; - search_state.best_rparen = search_state.best_rpspace; - } - else - { - search_state.best_lparen = regs->start; - search_state.best_rparen = regs->end; - } - } - - search_state.lparen = - (regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.rparen = - (regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - - if (! ( search_state.best_rparen - && search_state.best_lparen - && search_state.lparen && search_state.rparen)) - return rx_search_error; - - search_state.best_last_l = search_state.best_last_r = -1; - - search_state.translate = (rxb->translate - ? rxb->translate - : rx_id_translation); - - - - /* - * two nfa's were compiled. - * `0' is complete. - * `1' faster but gets registers wrong and ends too soon. - */ - search_state.nfa_choice = (regs && !rxb->least_subs) ? '\0' : '\1'; - - /* we have the option to look for the best match or the first - * one we can find. if the user isn't asking for register information, - * we don't need to find the best match. - */ - search_state.first_found = !regs; - - if (range >= 0) - { - search_state.outer_pos.search_end = startpos + range; - search_state.outer_pos.search_direction = 1; - } - else - { - search_state.outer_pos.search_end = startpos + range; - search_state.outer_pos.search_direction = -1; - } - - /* the vacuous search always turns up nothing. */ - if ((search_state.outer_pos.search_direction == 1) - ? (startpos > search_state.outer_pos.search_end) - : (startpos < search_state.outer_pos.search_end)) - return rx_search_fail; - - /* now we build the starting state of the supernfa. */ - { - struct rx_superset * start_contents; - struct rx_nfa_state_set * start_nfa_set; - - /* we presume here that the nfa start state has only one - * possible future with no side effects. - */ - start_nfa_set = rxb->start->futures->destset; - if ( rxb->rx.start_set - && (rxb->rx.start_set->starts_for == &rxb->rx)) - start_contents = rxb->rx.start_set; - else - { - start_contents = - rx_superstate_eclosure_union (&rxb->rx, - rx_superset_cons (&rxb->rx, 0, 0), - start_nfa_set); - - if (!start_contents) - return rx_search_fail; - - start_contents->starts_for = &rxb->rx; - rxb->rx.start_set = start_contents; - } - if ( start_contents->superstate - && (start_contents->superstate->rx_id == rxb->rx.rx_id)) - { - search_state.start_super = start_contents->superstate; - rx_lock_superstate (&rxb->rx, search_state.start_super); - } - else - { - rx_protect_superset (&rxb->rx, start_contents); - - search_state.start_super = rx_superstate (&rxb->rx, start_contents); - if (!search_state.start_super) - return rx_search_fail; - rx_lock_superstate (&rxb->rx, search_state.start_super); - rx_release_superset (&rxb->rx, start_contents); - } - } - - - /* The outer_pos tracks the position within the strings - * as seen by loop that calls fastmap_search. - * - * The caller supplied get_burst function actually - * gives us pointers to chars. - * - * Communication with the get_burst function is through an - * rx_string_position structure. Here, the structure for - * outer_pos is initialized. It is set to point to the - * NULL string, at an offset of STARTPOS. STARTPOS is out - * of range of the NULL string, so the first call to - * getburst will patch up the rx_string_position to point - * to valid characters. - */ - - ( search_state.outer_pos.string - = search_state.outer_pos.end - = 0); - - search_state.outer_pos.offset = 0; - search_state.outer_pos.size = 0; - search_state.outer_pos.pos = (unsigned char *)startpos; - init_fastmap (rxb, &search_state); - - search_state.fastmap_resume_pt = rx_fastmap_start; - case rx_outer_fastmap: - /* do { */ - pseudo_do: - { - { - int fastmap_state; - fastmap_state = fastmap_search (rxb, stop, get_burst, app_closure, - &search_state); - switch (fastmap_state) - { - case rx_fastmap_continuation: - pc = rx_outer_fastmap; - goto return_continuation; - case rx_fastmap_fail: - goto finish; - case rx_fastmap_ok: - break; - } - } - - /* now the fastmap loop has brought us to a plausible - * starting point for a match. so, it's time to run the - * nfa and see if a match occured. - */ - startpos = ( search_state.outer_pos.pos - - search_state.outer_pos.string - + search_state.outer_pos.offset); -#if 0 -/*|*/ if ((range > 0) && (startpos == search_state.outer_pos.search_end)) -/*|*/ goto finish; -#endif - } - - search_state.test_match_resume_pt = rx_test_start; - /* do interrupted for entry point... */ - case rx_outer_test: - /* ...do continued */ - { - goto test_match; - test_returns_to_search: - switch (test_state) - { - case rx_test_continuation: - pc = rx_outer_test; - goto return_continuation; - case rx_test_error: - search_state.ret_val = rx_search_error; - goto finish; - case rx_test_fail: - break; - case rx_test_ok: - goto finish; - } - search_state.outer_pos.pos += search_state.outer_pos.search_direction; - startpos += search_state.outer_pos.search_direction; -#if 0 -/*|*/ if (search_state.test_pos.pos < search_state.test_pos.end) -/*|*/ break; -#endif - } - /* do interrupted for entry point... */ - case rx_outer_restore_pos: - { - int x; - x = get_burst (&search_state.outer_pos, app_closure, stop); - switch (x) - { - case rx_get_burst_continuation: - pc = rx_outer_restore_pos; - goto return_continuation; - case rx_get_burst_error: - search_state.ret_val = rx_search_error; - goto finish; - case rx_get_burst_no_more: - if (rxb->can_match_empty) - break; - goto finish; - case rx_get_burst_ok: - break; - } - } /* } while (...see below...) */ - - if ((search_state.outer_pos.search_direction == 1) - ? (startpos <= search_state.outer_pos.search_end) - : (startpos > search_state.outer_pos.search_end)) - goto pseudo_do; - - - finish: - uninit_fastmap (rxb, &search_state); - if (search_state.start_super) - rx_unlock_superstate (&rxb->rx, search_state.start_super); - -#ifdef regex_malloc - if (search_state.lparen) free (search_state.lparen); - if (search_state.rparen) free (search_state.rparen); - if (search_state.best_lpspace) free (search_state.best_lpspace); - if (search_state.best_rpspace) free (search_state.best_rpspace); -#endif - return search_state.ret_val; - } - - - test_match: - { - enum rx_test_match_entry test_pc; - int inx; - test_pc = search_state.test_match_resume_pt; - if (test_pc == rx_test_start) - { -#ifdef RX_DEBUG - search_state.backtrack_depth = 0; -#endif - search_state.last_l = search_state.last_r = 0; - search_state.lparen[0] = startpos; - search_state.super = search_state.start_super; - search_state.c = search_state.nfa_choice; - search_state.test_pos.pos = search_state.outer_pos.pos - 1; - search_state.test_pos.string = search_state.outer_pos.string; - search_state.test_pos.end = search_state.outer_pos.end; - search_state.test_pos.offset = search_state.outer_pos.offset; - search_state.test_pos.size = search_state.outer_pos.size; - search_state.test_pos.search_direction = 1; - search_state.counter_stack = 0; - search_state.backtrack_stack = 0; - search_state.backtrack_frame_bytes = - (sizeof (struct rx_backtrack_frame) - + (rxb->match_regs_on_stack - ? sizeof (regoff_t) * (search_state.num_regs + 1) * 2 - : 0)); - search_state.chunk_bytes = search_state.backtrack_frame_bytes * 64; - search_state.test_ret = rx_test_line_finished; - search_state.could_have_continued = 0; - } - /* This is while (1)...except that the body of the loop is interrupted - * by some alternative entry points. - */ - pseudo_while_1: - switch (test_pc) - { - case rx_test_cache_hit_loop: - goto resume_continuation_1; - case rx_test_backreference_check: - goto resume_continuation_2; - case rx_test_backtrack_return: - goto resume_continuation_3; - case rx_test_start: -#ifdef RX_DEBUG - /* There is a search tree with every node as set of deterministic - * transitions in the super nfa. For every branch of a - * backtrack point is an edge in the tree. - * This counts up a pre-order of nodes in that tree. - * It's saved on the search stack and printed when debugging. - */ - search_state.line_no = 0; - search_state.lines_found = 0; -#endif - - top_of_cycle: - /* A superstate is basicly a transition table, indexed by - * characters from the string being tested, and containing - * RX_INX (`instruction frame') structures. - */ - search_state.ifr = &search_state.super->transitions [search_state.c]; - - recurse_test_match: - /* This is the point to which control is sent when the - * test matcher `recurses'. Before jumping here, some variables - * need to be saved on the stack and the next instruction frame - * has to be computed. - */ - - restart: - /* Some instructions don't advance the matcher, but just - * carry out some side effects and fetch a new instruction. - * To dispatch that new instruction, `goto restart'. - */ - - { - struct rx_inx * next_tr_table; - struct rx_inx * this_tr_table; - /* The fastest route through the loop is when the instruction - * is RX_NEXT_CHAR. This case is detected when SEARCH_STATE.IFR->DATA - * is non-zero. In that case, it points to the next - * superstate. - * - * This allows us to not bother fetching the bytecode. - */ - next_tr_table = (struct rx_inx *)search_state.ifr->data; - this_tr_table = search_state.super->transitions; - while (next_tr_table) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp; - - fprintf (stderr, "%d %d>> re_next_char @ %d (%d)", - search_state.line_no, - search_state.backtrack_depth, - (search_state.test_pos.pos - search_state.test_pos.string - + search_state.test_pos.offset), search_state.c); - - search_state.super = - ((struct rx_superstate *) - ((char *)this_tr_table - - ((unsigned long) - ((struct rx_superstate *)0)->transitions))); - - setp = search_state.super->contents; - fprintf (stderr, " superstet (rx=%d, &=%x: ", - rxb->rx.rx_id, setp); - while (setp) - { - fprintf (stderr, "%d ", setp->id); - setp = setp->cdr; - } - fprintf (stderr, "\n"); - } -#endif - this_tr_table = next_tr_table; - ++search_state.test_pos.pos; - if (search_state.test_pos.pos == search_state.test_pos.end) - { - int burst_state; - try_burst_1: - burst_state = get_burst (&search_state.test_pos, - app_closure, stop); - switch (burst_state) - { - case rx_get_burst_continuation: - search_state.saved_this_tr_table = this_tr_table; - search_state.saved_next_tr_table = next_tr_table; - test_pc = rx_test_cache_hit_loop; - goto test_return_continuation; - - resume_continuation_1: - /* Continuation one jumps here to do its work: */ - search_state.saved_this_tr_table = this_tr_table; - search_state.saved_next_tr_table = next_tr_table; - goto try_burst_1; - - case rx_get_burst_ok: - /* get_burst succeeded...keep going */ - break; - - case rx_get_burst_no_more: - search_state.test_ret = rx_test_line_finished; - search_state.could_have_continued = 1; - goto test_do_return; - - case rx_get_burst_error: - /* An error... */ - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - } - search_state.c = *search_state.test_pos.pos; - search_state.ifr = this_tr_table + search_state.c; - next_tr_table = (struct rx_inx *)search_state.ifr->data; - } /* Fast loop through cached transition tables */ - - /* Here when we ran out of cached next-char transitions. - * So, it will be necessary to do a more expensive - * dispatch on the current instruction. The superstate - * pointer is allowed to become invalid during next-char - * transitions -- now we must bring it up to date. - */ - search_state.super = - ((struct rx_superstate *) - ((char *)this_tr_table - - ((unsigned long) - ((struct rx_superstate *)0)->transitions))); - } - - /* We've encountered an instruction other than next-char. - * Dispatch that instruction: - */ - inx = (int)search_state.ifr->inx; -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp = search_state.super->contents; - - fprintf (stderr, "%d %d>> %s @ %d (%d)", search_state.line_no, - search_state.backtrack_depth, - inx_names[inx], - (search_state.test_pos.pos - search_state.test_pos.string - + (test_pos.half == 0 ? 0 : size1)), search_state.c); - - fprintf (stderr, " superstet (rx=%d, &=%x: ", - rxb->rx.rx_id, setp); - while (setp) - { - fprintf (stderr, "%d ", setp->id); - setp = setp->cdr; - } - fprintf (stderr, "\n"); - } -#endif - switch ((enum rx_opcode)inx) - { - case rx_do_side_effects: - - /* RX_DO_SIDE_EFFECTS occurs when we cross epsilon - * edges associated with parentheses, backreferencing, etc. - */ - { - struct rx_distinct_future * df = - (struct rx_distinct_future *)search_state.ifr->data_2; - struct rx_se_list * el = df->effects; - /* Side effects come in lists. This walks down - * a list, dispatching. - */ - while (el) - { - long effect; - effect = (long)el->car; - if (effect < 0) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp = search_state.super->contents; - - fprintf (stderr, "....%d %d>> %s\n", search_state.line_no, - search_state.backtrack_depth, - efnames[-effect]); - } -#endif - switch ((enum re_side_effects) effect) - - { - case re_se_pushback: - search_state.ifr = &df->future_frame; - if (!search_state.ifr->data) - { - struct rx_superstate * sup; - sup = search_state.super; - rx_lock_superstate (rx, sup); - if (!rx_handle_cache_miss (&rxb->rx, - search_state.super, - search_state.c, - (search_state.ifr - ->data_2))) - { - rx_unlock_superstate (rx, sup); - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - rx_unlock_superstate (rx, sup); - } - /* --search_state.test_pos.pos; */ - search_state.c = 't'; - search_state.super - = ((struct rx_superstate *) - ((char *)search_state.ifr->data - - (long)(((struct rx_superstate *)0) - ->transitions))); - goto top_of_cycle; - break; - case re_se_push0: - { - struct rx_counter_frame * old_cf - = (search_state.counter_stack - ? ((struct rx_counter_frame *) - search_state.counter_stack->sp) - : 0); - struct rx_counter_frame * cf; - PUSH (search_state.counter_stack, - sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - cf->tag = re_se_iter; - cf->val = 0; - cf->inherited_from = 0; - cf->cdr = old_cf; - break; - } - case re_se_fail: - goto test_do_return; - case re_se_begbuf: - if (!AT_STRINGS_BEG ()) - goto test_do_return; - break; - case re_se_endbuf: - if (!AT_STRINGS_END ()) - goto test_do_return; - break; - case re_se_wordbeg: - if ( LETTER_P (&search_state.test_pos, 1) - && ( AT_STRINGS_BEG() - || !LETTER_P (&search_state.test_pos, 0))) - break; - else - goto test_do_return; - case re_se_wordend: - if ( !AT_STRINGS_BEG () - && LETTER_P (&search_state.test_pos, 0) - && (AT_STRINGS_END () - || !LETTER_P (&search_state.test_pos, 1))) - break; - else - goto test_do_return; - case re_se_wordbound: - if (AT_WORD_BOUNDARY (&search_state.test_pos)) - break; - else - goto test_do_return; - case re_se_notwordbound: - if (!AT_WORD_BOUNDARY (&search_state.test_pos)) - break; - else - goto test_do_return; - case re_se_hat: - if (AT_STRINGS_BEG ()) - { - if (rxb->not_bol) - goto test_do_return; - else - break; - } - else - { - char pos_c = *search_state.test_pos.pos; - if ( (SRCH_TRANSLATE (pos_c) - == SRCH_TRANSLATE('\n')) - && rxb->newline_anchor) - break; - else - goto test_do_return; - } - case re_se_dollar: - if (AT_STRINGS_END ()) - { - if (rxb->not_eol) - goto test_do_return; - else - break; - } - else - { - if ( ( SRCH_TRANSLATE (fetch_char - (&search_state.test_pos, 1, - app_closure, stop)) - == SRCH_TRANSLATE ('\n')) - && rxb->newline_anchor) - break; - else - goto test_do_return; - } - - case re_se_try: - /* This is the first side effect in every - * expression. - * - * FOR NO GOOD REASON...get rid of it... - */ - break; - - case re_se_pushpos: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - struct rx_counter_frame * old_cf - = (search_state.counter_stack - ? ((struct rx_counter_frame *) - search_state.counter_stack->sp) - : 0); - struct rx_counter_frame * cf; - PUSH(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - cf->tag = re_se_pushpos; - cf->val = urhere; - cf->inherited_from = 0; - cf->cdr = old_cf; - break; - } - - case re_se_chkpos: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - struct rx_counter_frame * cf - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (cf->val == urhere) - goto test_do_return; - cf->val = urhere; - break; - } - break; - - case re_se_poppos: - POP(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - break; - - - case re_se_at_dot: - case re_se_syntax: - case re_se_not_syntax: -#ifdef emacs - /* - * this release lacks emacs support - */ -#endif - break; - case re_se_win: - case re_se_lparen: - case re_se_rparen: - case re_se_backref: - case re_se_iter: - case re_se_end_iter: - case re_se_tv: - case re_floogle_flap: - search_state.ret_val = 0; - goto test_do_return; - } - } - else - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "....%d %d>> %s %d %d\n", search_state.line_no, - search_state.backtrack_depth, - efnames2[rxb->se_params [effect].se], - rxb->se_params [effect].op1, - rxb->se_params [effect].op2); -#endif - switch (rxb->se_params [effect].se) - { - case re_se_win: - /* This side effect indicates that we've - * found a match, though not necessarily the - * best match. This is a fancy assignment to - * register 0 unless the caller didn't - * care about registers. In which case, - * this stops the match. - */ - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - - if ( (search_state.best_last_r < 0) - || (urhere + 1 > search_state.best_rparen[0])) - { - /* Record the best known and keep - * looking. - */ - int x; - for (x = 0; x <= search_state.last_l; ++x) - search_state.best_lparen[x] = search_state.lparen[x]; - search_state.best_last_l = search_state.last_l; - for (x = 0; x <= search_state.last_r; ++x) - search_state.best_rparen[x] = search_state.rparen[x]; - search_state.best_rparen[0] = urhere + 1; - search_state.best_last_r = search_state.last_r; - } - /* If we're not reporting the match-length - * or other register info, we need look no - * further. - */ - if (search_state.first_found) - { - search_state.test_ret = rx_test_found_first; - goto test_do_return; - } - } - break; - case re_se_lparen: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - - int reg = rxb->se_params [effect].op1; -#if 0 - if (reg > search_state.last_l) -#endif - { - search_state.lparen[reg] = urhere + 1; - /* In addition to making this assignment, - * we now know that lower numbered regs - * that haven't already been assigned, - * won't be. We make sure they're - * filled with -1, so they can be - * recognized as unassigned. - */ - if (search_state.last_l < reg) - while (++search_state.last_l < reg) - search_state.lparen[search_state.last_l] = -1; - } - break; - } - - case re_se_rparen: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - int reg = rxb->se_params [effect].op1; - search_state.rparen[reg] = urhere + 1; - if (search_state.last_r < reg) - { - while (++search_state.last_r < reg) - search_state.rparen[search_state.last_r] - = -1; - } - break; - } - - case re_se_backref: - { - int reg = rxb->se_params [effect].op1; - if ( reg > search_state.last_r - || search_state.rparen[reg] < 0) - goto test_do_return; - - { - int backref_status; - check_backreference: - backref_status - = back_check (&search_state.test_pos, - search_state.lparen[reg], - search_state.rparen[reg], - search_state.translate, - app_closure, - stop); - switch (backref_status) - { - case rx_back_check_continuation: - search_state.saved_reg = reg; - test_pc = rx_test_backreference_check; - goto test_return_continuation; - resume_continuation_2: - reg = search_state.saved_reg; - goto check_backreference; - case rx_back_check_fail: - /* Fail */ - goto test_do_return; - case rx_back_check_pass: - /* pass -- - * test_pos now advanced to last - * char matched by backref - */ - break; - } - } - break; - } - case re_se_iter: - { - struct rx_counter_frame * csp - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (csp->val == rxb->se_params[effect].op2) - goto test_do_return; - else - ++csp->val; - break; - } - case re_se_end_iter: - { - struct rx_counter_frame * csp - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (csp->val < rxb->se_params[effect].op1) - goto test_do_return; - else - { - struct rx_counter_frame * source = csp; - while (source->inherited_from) - source = source->inherited_from; - if (!source || !source->cdr) - { - POP(search_state.counter_stack, - sizeof(struct rx_counter_frame)); - } - else - { - source = source->cdr; - csp->val = source->val; - csp->tag = source->tag; - csp->cdr = 0; - csp->inherited_from = source; - } - } - break; - } - case re_se_tv: - /* is a noop */ - break; - case re_se_try: - case re_se_pushback: - case re_se_push0: - case re_se_pushpos: - case re_se_chkpos: - case re_se_poppos: - case re_se_at_dot: - case re_se_syntax: - case re_se_not_syntax: - case re_se_begbuf: - case re_se_hat: - case re_se_wordbeg: - case re_se_wordbound: - case re_se_notwordbound: - case re_se_wordend: - case re_se_endbuf: - case re_se_dollar: - case re_se_fail: - case re_floogle_flap: - search_state.ret_val = 0; - goto test_do_return; - } - } - el = el->cdr; - } - /* Now the side effects are done, - * so get the next instruction. - * and move on. - */ - search_state.ifr = &df->future_frame; - goto restart; - } - - case rx_backtrack_point: - { - /* A backtrack point indicates that we've reached a - * non-determinism in the superstate NFA. This is a - * loop that exhaustively searches the possibilities. - * - * A backtracking strategy is used. We keep track of what - * registers are valid so we can erase side effects. - * - * First, make sure there is some stack space to hold - * our state. - */ - - struct rx_backtrack_frame * bf; - - PUSH(search_state.backtrack_stack, - search_state.backtrack_frame_bytes); -#ifdef RX_DEBUG_0 - ++search_state.backtrack_depth; -#endif - - bf = ((struct rx_backtrack_frame *) - search_state.backtrack_stack->sp); - { - bf->stk_super = search_state.super; - /* We prevent the current superstate from being - * deleted from the superstate cache. - */ - rx_lock_superstate (&rxb->rx, search_state.super); -#ifdef RX_DEBUG_0 - bf->stk_search_state.line_no = search_state.line_no; -#endif - bf->stk_c = search_state.c; - bf->stk_test_pos = search_state.test_pos; - bf->stk_last_l = search_state.last_l; - bf->stk_last_r = search_state.last_r; - bf->df = ((struct rx_super_edge *) - search_state.ifr->data_2)->options; - bf->first_df = bf->df; - bf->counter_stack_sp = (search_state.counter_stack - ? search_state.counter_stack->sp - : 0); - bf->stk_test_ret = search_state.test_ret; - if (rxb->match_regs_on_stack) - { - int x; - regoff_t * stk = - (regoff_t *)((char *)bf + sizeof (*bf)); - for (x = 0; x <= search_state.last_l; ++x) - stk[x] = search_state.lparen[x]; - stk += x; - for (x = 0; x <= search_state.last_r; ++x) - stk[x] = search_state.rparen[x]; - } - } - - /* Here is a while loop whose body is mainly a function - * call and some code to handle a return from that - * function. - * - * From here on for the rest of `case backtrack_point' it - * is unsafe to assume that the search_state copies of - * variables saved on the backtracking stack are valid - * -- so read their values from the backtracking stack. - * - * This lets us use one generation fewer stack saves in - * the call-graph of a search. - */ - - while_non_det_options: -#ifdef RX_DEBUG_0 - ++search_state.lines_found; - if (rx_debug_trace) - fprintf (stderr, "@@@ %d calls %d @@@\n", - search_state.line_no, search_state.lines_found); - - search_state.line_no = search_state.lines_found; -#endif - - if (bf->df->next_same_super_edge[0] == bf->first_df) - { - /* This is a tail-call optimization -- we don't recurse - * for the last of the possible futures. - */ - search_state.ifr = (bf->df->effects - ? &bf->df->side_effects_frame - : &bf->df->future_frame); - - rx_unlock_superstate (&rxb->rx, search_state.super); - POP(search_state.backtrack_stack, - search_state.backtrack_frame_bytes); -#ifdef RX_DEBUG - --search_state.backtrack_depth; -#endif - goto restart; - } - else - { - if (search_state.counter_stack) - { - struct rx_counter_frame * old_cf - = ((struct rx_counter_frame *)search_state.counter_stack->sp); - struct rx_counter_frame * cf; - PUSH(search_state.counter_stack, sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *)search_state.counter_stack->sp); - cf->tag = old_cf->tag; - cf->val = old_cf->val; - cf->inherited_from = old_cf; - cf->cdr = 0; - } - /* `Call' this test-match block */ - search_state.ifr = (bf->df->effects - ? &bf->df->side_effects_frame - : &bf->df->future_frame); - goto recurse_test_match; - } - - /* Returns in this block are accomplished by - * goto test_do_return. There are two cases. - * If there is some search-stack left, - * then it is a return from a `recursive' call. - * If there is no search-stack left, then - * we should return to the fastmap/search loop. - */ - - test_do_return: - - if (!search_state.backtrack_stack) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "!!! %d bails returning %d !!!\n", - search_state.line_no, search_state.test_ret); -#endif - - /* No more search-stack -- this test is done. */ - if (search_state.test_ret != rx_test_internal_error) - goto return_from_test_match; - else - goto error_in_testing_match; - } - - /* Returning from a recursive call to - * the test match block: - */ - - bf = ((struct rx_backtrack_frame *) - search_state.backtrack_stack->sp); -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "+++ %d returns %d (to %d)+++\n", - search_state.line_no, - search_state.test_ret, - bf->stk_search_state.line_no); -#endif - - while (search_state.counter_stack - && (!bf->counter_stack_sp - || (bf->counter_stack_sp - != search_state.counter_stack->sp))) - { - POP(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - } - - if (search_state.test_ret == rx_test_internal_error) - { - POP (search_state.backtrack_stack, - search_state.backtrack_frame_bytes); - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - - /* If a non-longest match was found and that is good - * enough, return immediately. - */ - if ( (search_state.test_ret == rx_test_found_first) - && search_state.first_found) - { - rx_unlock_superstate (&rxb->rx, bf->stk_super); - POP (search_state.backtrack_stack, - search_state.backtrack_frame_bytes); - goto test_do_return; - } - - search_state.test_ret = bf->stk_test_ret; - search_state.last_l = bf->stk_last_l; - search_state.last_r = bf->stk_last_r; - bf->df = bf->df->next_same_super_edge[0]; - search_state.super = bf->stk_super; - search_state.c = bf->stk_c; -#ifdef RX_DEBUG_0 - search_state.line_no = bf->stk_search_state.line_no; -#endif - - if (rxb->match_regs_on_stack) - { - int x; - regoff_t * stk = - (regoff_t *)((char *)bf + sizeof (*bf)); - for (x = 0; x <= search_state.last_l; ++x) - search_state.lparen[x] = stk[x]; - stk += x; - for (x = 0; x <= search_state.last_r; ++x) - search_state.rparen[x] = stk[x]; - } - - { - int x; - try_burst_2: - x = get_burst (&bf->stk_test_pos, app_closure, stop); - switch (x) - { - case rx_get_burst_continuation: - search_state.saved_bf = bf; - test_pc = rx_test_backtrack_return; - goto test_return_continuation; - resume_continuation_3: - bf = search_state.saved_bf; - goto try_burst_2; - case rx_get_burst_no_more: - /* Since we've been here before, it is some kind of - * error that we can't return. - */ - case rx_get_burst_error: - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - case rx_get_burst_ok: - break; - } - } - search_state.test_pos = bf->stk_test_pos; - goto while_non_det_options; - } - - - case rx_cache_miss: - /* Because the superstate NFA is lazily constructed, - * and in fact may erode from underneath us, we sometimes - * have to construct the next instruction from the hard way. - * This invokes one step in the lazy-conversion. - */ - search_state.ifr = rx_handle_cache_miss (&rxb->rx, - search_state.super, - search_state.c, - search_state.ifr->data_2); - if (!search_state.ifr) - { - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - goto restart; - - case rx_backtrack: - /* RX_BACKTRACK means that we've reached the empty - * superstate, indicating that match can't succeed - * from this point. - */ - goto test_do_return; - - case rx_next_char: - case rx_error_inx: - case rx_num_instructions: - search_state.ret_val = 0; - goto test_do_return; - } - goto pseudo_while_1; - } - - /* Healthy exits from the test-match loop do a - * `goto return_from_test_match' On the other hand, - * we might end up here. - */ - error_in_testing_match: - test_state = rx_test_error; - goto test_returns_to_search; - - /***** fastmap/search loop body - * considering the results testing for a match - */ - - return_from_test_match: - - if (search_state.best_last_l >= 0) - { - if (regs && (regs->start != search_state.best_lparen)) - { - bcopy (search_state.best_lparen, regs->start, - regs->num_regs * sizeof (int)); - bcopy (search_state.best_rparen, regs->end, - regs->num_regs * sizeof (int)); - } - if (regs && !rxb->no_sub) - { - int q; - int bound = (regs->num_regs > search_state.num_regs - ? regs->num_regs - : search_state.num_regs); - regoff_t * s = regs->start; - regoff_t * e = regs->end; - for (q = search_state.best_last_l + 1; q < bound; ++q) - s[q] = e[q] = -1; - } - search_state.ret_val = search_state.best_lparen[0]; - test_state = rx_test_ok; - goto test_returns_to_search; - } - else - { - test_state = rx_test_fail; - goto test_returns_to_search; - } - - test_return_continuation: - search_state.test_match_resume_pt = test_pc; - test_state = rx_test_continuation; - goto test_returns_to_search; - } -} - - - -#endif /* RX_WANT_RX_DEFS */ - - - -#else /* RX_WANT_SE_DEFS */ - /* Integers are used to represent side effects. - * - * Simple side effects are given negative integer names by these enums. - * - * Non-negative names are reserved for complex effects. - * - * Complex effects are those that take arguments. For example, - * a register assignment associated with a group is complex because - * it requires an argument to tell which group is being matched. - * - * The integer name of a complex effect is an index into rxb->se_params. - */ - - RX_DEF_SE(1, re_se_try, = -1) /* Epsilon from start state */ - - RX_DEF_SE(0, re_se_pushback, = re_se_try - 1) - RX_DEF_SE(0, re_se_push0, = re_se_pushback -1) - RX_DEF_SE(0, re_se_pushpos, = re_se_push0 - 1) - RX_DEF_SE(0, re_se_chkpos, = re_se_pushpos -1) - RX_DEF_SE(0, re_se_poppos, = re_se_chkpos - 1) - - RX_DEF_SE(1, re_se_at_dot, = re_se_poppos - 1) /* Emacs only */ - RX_DEF_SE(0, re_se_syntax, = re_se_at_dot - 1) /* Emacs only */ - RX_DEF_SE(0, re_se_not_syntax, = re_se_syntax - 1) /* Emacs only */ - - RX_DEF_SE(1, re_se_begbuf, = re_se_not_syntax - 1) /* match beginning of buffer */ - RX_DEF_SE(1, re_se_hat, = re_se_begbuf - 1) /* match beginning of line */ - - RX_DEF_SE(1, re_se_wordbeg, = re_se_hat - 1) - RX_DEF_SE(1, re_se_wordbound, = re_se_wordbeg - 1) - RX_DEF_SE(1, re_se_notwordbound, = re_se_wordbound - 1) - - RX_DEF_SE(1, re_se_wordend, = re_se_notwordbound - 1) - RX_DEF_SE(1, re_se_endbuf, = re_se_wordend - 1) - - /* This fails except at the end of a line. - * It deserves to go here since it is typicly one of the last steps - * in a match. - */ - RX_DEF_SE(1, re_se_dollar, = re_se_endbuf - 1) - - /* Simple effects: */ - RX_DEF_SE(1, re_se_fail, = re_se_dollar - 1) - - /* Complex effects. These are used in the 'se' field of - * a struct re_se_params. Indexes into the se array - * are stored as instructions on nfa edges. - */ - RX_DEF_CPLX_SE(1, re_se_win, = 0) - RX_DEF_CPLX_SE(1, re_se_lparen, = re_se_win + 1) - RX_DEF_CPLX_SE(1, re_se_rparen, = re_se_lparen + 1) - RX_DEF_CPLX_SE(0, re_se_backref, = re_se_rparen + 1) - RX_DEF_CPLX_SE(0, re_se_iter, = re_se_backref + 1) - RX_DEF_CPLX_SE(0, re_se_end_iter, = re_se_iter + 1) - RX_DEF_CPLX_SE(0, re_se_tv, = re_se_end_iter + 1) - -#endif - -#endif diff --git a/gnu/lib/libg++/libg++/src/sqrt.cc b/gnu/lib/libg++/libg++/src/sqrt.cc deleted file mode 100644 index 622895eed45..00000000000 --- a/gnu/lib/libg++/libg++/src/sqrt.cc +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright (C) 1990 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif -#include <builtin.h> -#include <math.h> - -long sqrt(long x) -{ - if (x <= 0) - return 0; // no int error handler, so ... - else if (x == 1) - return 1; - else - { - long r = x >> 1; - long q; - for(;;) - { - q = x / r; - if (q >= r) - return r; - else - r = (r + q) >> 1; - } - } -} diff --git a/gnu/lib/libg++/libg++/src/std.h b/gnu/lib/libg++/libg++/src/std.h deleted file mode 100644 index 2cd73f24386..00000000000 --- a/gnu/lib/libg++/libg++/src/std.h +++ /dev/null @@ -1,35 +0,0 @@ -// This may look like C code, but it is really -*- C++ -*- -/* -Copyright (C) 1988, 1992 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _std_h -#define _std_h 1 - -#include <_G_config.h> -#include <stddef> -#include <cstdlib> -#include <cstring> -#include <unistd.h> -#include <cstdio> -#include <cerrno> -#include <fcntl.h> - -extern "C" { -int strcasecmp _G_ARGS((const char*, const char*)); -} - -#endif diff --git a/gnu/lib/libg++/libg++/src/strclass.h b/gnu/lib/libg++/libg++/src/strclass.h deleted file mode 100644 index 57dbcc8cf90..00000000000 --- a/gnu/lib/libg++/libg++/src/strclass.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _strclass_h -#define _strclass_h -#include <String.h> -typedef class String string; -#endif diff --git a/gnu/lib/libg++/libg++/src/swap.h b/gnu/lib/libg++/libg++/src/swap.h deleted file mode 100644 index 005cb0e4648..00000000000 --- a/gnu/lib/libg++/libg++/src/swap.h +++ /dev/null @@ -1,3 +0,0 @@ -/* From Ron Guillmette; apparently needed for Hansen's code */ - -#define swap(a,b) ({ typeof(a) temp = (a); (a) = (b); (b) = temp; }) diff --git a/gnu/lib/libg++/libg++/src/sysent.h b/gnu/lib/libg++/libg++/src/sysent.h deleted file mode 100644 index 0535f38e934..00000000000 --- a/gnu/lib/libg++/libg++/src/sysent.h +++ /dev/null @@ -1,2 +0,0 @@ -/* Provided for compatibity with other C++ compilers ONLY! */ -#include <std.h> diff --git a/gnu/lib/libg++/libg++/src/timer.c b/gnu/lib/libg++/libg++/src/timer.c deleted file mode 100644 index a7e2242d529..00000000000 --- a/gnu/lib/libg++/libg++/src/timer.c +++ /dev/null @@ -1,165 +0,0 @@ -/* -Copyright (C) 1990, 1992, 1995 Free Software Foundation - written by Doug Lea (dl@rocky.oswego.edu) - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef __GNUG__ -#pragma implementation -#endif - -/* Timing functions from Doug Schmidt... */ - -/* no such thing as "negative time"! */ -#define TIMER_ERROR_VALUE -1.0 - -/* If this does not work on your system, change this to #if 0, and - report the problem. */ - -#if 1 - -#include <_G_config.h> -#include <sys/types.h> -#if _G_HAVE_SYS_RESOURCE -#include <sys/time.h> -#include <sys/resource.h> -#endif -#if !_G_HAVE_SYS_RESOURCE || !defined(RUSAGE_SELF) -#if _G_HAVE_SYS_TIMES -#define USE_TIMES -#include <sys/param.h> -#include <sys/times.h> -#if !defined (HZ) && defined(CLK_TCK) -#define HZ CLK_TCK -#endif -static struct tms Old_Time; -static struct tms New_Time; -#else /* ! _G_HAVE_SYS_TIMES */ -#define USE_CLOCK -#include <time.h> -#ifndef CLOCKS_PER_SEC -#define CLOCKS_PER_SEC 1 -#endif -clock_t Old_Time; -clock_t New_Time; -#endif /* ! _G_HAVE_SYS_TIMES */ -#else /* _G_HAVE_SYS_RESOURCE && defined(RUSAGE_SELF) */ -static struct rusage Old_Time; -static struct rusage New_Time; -#endif -static int Timer_Set = 0; - -double -start_timer() -{ - Timer_Set = 1; -#ifdef USE_CLOCK - Old_Time = clock() / CLOCKS_PER_SEC; - return((double) Old_Time); -#else -#ifdef USE_TIMES - times(&Old_Time); - return((double) Old_Time.tms_utime / HZ); -#else - getrusage(RUSAGE_SELF,&Old_Time); /* set starting process time */ - return(Old_Time.ru_utime.tv_sec + (Old_Time.ru_utime.tv_usec / 1000000.0)); -#endif -#endif -} - -/* Returns process time since Last_Time. - If parameter is 0.0, returns time since the Old_Time was set. - Returns TIMER_ERROR_VALUE if `start_timer' is not called first. */ - -double -return_elapsed_time(Last_Time) - double Last_Time; -{ - if (!Timer_Set) { - return(TIMER_ERROR_VALUE); - } - else { - /* get process time */ -#ifdef USE_CLOCK - New_Time = clock(); -#else -#ifdef USE_TIMES - times(&New_Time); -#else - getrusage(RUSAGE_SELF,&New_Time); -#endif -#endif - if (Last_Time == 0.0) { -#ifdef USE_CLOCK - return((double) (New_Time - Old_Time) / CLOCKS_PER_SEC); -#else -#ifdef USE_TIMES - return((double) (New_Time.tms_utime - Old_Time.tms_utime) / HZ); -#else - return((New_Time.ru_utime.tv_sec - Old_Time.ru_utime.tv_sec) + - ((New_Time.ru_utime.tv_usec - Old_Time.ru_utime.tv_usec) - / 1000000.0)); -#endif -#endif - } - else { -#ifdef USE_CLOCK - return((double) New_Time / CLOCKS_PER_SEC - Last_Time); -#else -#ifdef USE_TIMES - return((double) New_Time.tms_utime / HZ - Last_Time); -#else - return((New_Time.ru_utime.tv_sec + - (New_Time.ru_utime.tv_usec / 1000000.0)) - Last_Time); -#endif -#endif - } - } -} - -#ifdef VMS -void sys$gettim(unsigned int*) asm("sys$gettim"); - -getrusage(int dummy,struct rusage* time){ - double rtime; - unsigned int systime[2]; - int i; - sys$gettim(&systime[0]); - rtime=systime[1]; - for(i=0;i<4;i++) rtime *= 256; - rtime+= systime[0]; -/* we subtract an offset to make sure that the number fits in a long int*/ - rtime=rtime/1.0e+7-4.144e+9; - time->ru_utime.tv_sec= rtime; - rtime=(rtime-time->ru_utime.tv_sec)*1.0e6; - time->ru_utime.tv_usec= rtime; -} -#endif -#else /* dummy them out */ - -double start_timer() -{ - return TIMER_ERROR_VALUE; -} - -double -return_elapsed_time(Last_Time) - double Last_Time; -{ - return TIMER_ERROR_VALUE; -} - -#endif /* timing stuff */ - - diff --git a/gnu/lib/libg++/libg++/src/typemacros.h b/gnu/lib/libg++/libg++/src/typemacros.h deleted file mode 100644 index f2bd7877e36..00000000000 --- a/gnu/lib/libg++/libg++/src/typemacros.h +++ /dev/null @@ -1,8 +0,0 @@ -#define _T(type) typeof(type) -#define pointer_to(type) _T(_T(type)*) -#define member_of(cls,type) _T(_T(type) cls::) -#define function(res, args) _T(_T(res) args) - -#define _xq_yq(x,y) x ## _ ## y -#define _x_y(x,y) _xq_yq(x,y) -#define _gensym(stem) _x_y(stem, __LINE__) diff --git a/gnu/lib/libg++/libg++2netbsd b/gnu/lib/libg++/libg++2netbsd deleted file mode 100644 index a9611c6aecd..00000000000 --- a/gnu/lib/libg++/libg++2netbsd +++ /dev/null @@ -1,708 +0,0 @@ -#!/usr/local/bin/perl -# -# $NetBSD: libg++2netbsd,v 1.24 1998/02/26 02:26:27 jonathan Exp $ -# -# Perl script to convert a standard distribution directory for libg++ into -# a NetBSD source tree. -# -# This is done as a script so that as each distribution is released, -# only changes from the previous one need to be dealt with as -# modifications to this script and related files. This should -# reduce the cost of updating from a new release of libg++ by an -# order of magnitude (or more?) -# -# Written by Phil Nelson, December 13, 1995. (for libg++-2.7.1) -# Updated for libg++-2.7.2 by Chris Demetriou, September 13, 1996. -# - -$version = "2.7.2"; -$srcdir = $ENV{'SRCDIR'}; -if (!$srcdir) { $srcdir = "libg++-$version" }; -$targetdir = "libg++"; - -# definitions ... - -@subdirs = ("include", "include/gen", "libg++", "libg++/genclass", - "libg++/src", "libio", "libiostream", "librx", "libstdc++", - "libstdc++/std", "libstdc++/stl"); - -@gf = ("ACG.cc", "AllocRing.cc", "Binomial.cc", "BitSet.cc", - "BitString.cc", "CursesW.cc", "DLList.cc", "DiscUnif.cc", - "Erlang.cc", "Fix.cc", "Fix16.cc", "Fix24.cc", "Geom.cc", - "GetOpt.cc", "HypGeom.cc", "Intdouble.cc", "Integer.cc", - "LogNorm.cc", "MLCG.cc", "NegExp.cc", "Normal.cc", - "Obstack.cc", "Poisson.cc", "RNG.cc", "Random.cc", - "Rational.cc", "Regex.cc", "RndInt.cc", "SLList.cc", - "SmplHist.cc", "SmplStat.cc", "String.cc", "Uniform.cc", - "Weibull.cc", "bitand.c", "bitany.c", "bitblt.c", "bitclear.c", - "bitcopy.c", "bitcount.c", "bitinvert.c", "bitlcomp.c", - "bitset1.c", "bitxor.c", "builtin.cc", "compare.cc", - "error.cc", "fmtq.cc", "gcd.cc", "hash.cc", "ioob.cc", "lg.cc", - "pow.cc", "sqrt.cc", "timer.c"); - -@gh = ("ACG.h", "AllocRing.h", "Binomial.h", "BitSet.h", - "BitString.h", "Complex.h", "CursesW.h", "DLList.h", - "DiscUnif.h", "Erlang.h", "Fix.h", "Fix16.h", "Fix24.h", - "Geom.h", "GetOpt.h", "HypGeom.h", "Incremental.h", - "Integer.h", "Integer.hP", "LogNorm.h", "MLCG.h", "NegExp.h", - "Normal.h", "Obstack.h", "Pix.h", "Poisson.h", "RNG.h", - "Random.h", "Rational.h", "Regex.h", "RndInt.h", "SLList.h", - "SmplHist.h", "SmplStat.h", "String.h", "Uniform.h", - "Weibull.h", "bitdo1.h", "bitdo2.h", "bitprims.h", "bool.h", - "builtin.h", "compare.h", "generic.h", "getpagesize.h", - "libc.h", "minmax.h", "osfcn.h", "std.h", "strclass.h", - "swap.h", "sysent.h", "typemacros.h" ); - -@iosf = ("PlotFile.cc", "SFile.cc", "builtinbuf.cc", "editbuf.cc", - "filebuf.cc", "fstream.cc", "indstream.cc", "ioassign.cc", - "ioextend.cc", "iomanip.cc", "iostream.cc", "isgetline.cc", - "isgetsb.cc", "isscan.cc", "osform.cc", "parsestream.cc", - "pfstream.cc", "procbuf.cc", "sbform.cc", "sbgetline.cc", - "sbscan.cc", "stdiostream.cc", "stdstrbufs.cc", - "stdstreams.cc", "stream.cc", "streambuf.cc", "strstream.cc", - "cleanup.c", "filedoalloc.c", "fileops.c", "floatconv.c", - "genops.c", "iofclose.c", "iofgetpos.c", "iofread.c", - "iofscanf.c", "iofsetpos.c", "iogetdelim.c", "iogetline.c", - "ioignore.c", "iopadn.c", "iopopen.c", "ioprims.c", - "ioprintf.c", "ioseekoff.c", "ioseekpos.c", "iostrerror.c", - "ioungetc.c", "iovfprintf.c", "iovfscanf.c", "outfloat.c", - "strops.c", ); - -@iosh = ("PlotFile.h", "SFile.h", "builtinbuf.h", - "editbuf.h", "floatio.h", "fstream.h", "indstream.h", - "iolibio.h", "iomanip.h", "iostdio.h", "iostream.h", - "iostreamP.h", "istream.h", "libio.h", "libioP.h", - "ostream.h", "parsestream.h", "pfstream.h", "procbuf.h", - "stdiostream.h", "stream.h", "streambuf.h", "strfile.h", - "strstream.h" ); - -@iof = ("chr.cc", "cleanup.c", "filedoalloc.c", "fileops.c", "floatconv.c", - "genops.c", "iofclose.c", "iofdopen.c", "iofflush.c", - "iofgetpos.c", "iofgets.c", "iofopen.c", "iofprintf.c", - "iofputs.c", "iofread.c", "iofscanf.c", "iofsetpos.c", - "ioftell.c", "iofwrite.c", "iogetdelim.c", "iogetline.c", - "iogets.c", "ioignore.c", "iopadn.c", "ioperror.c", - "iopopen.c", "ioprims.c", "ioprintf.c", "ioputs.c", - "ioscanf.c", "ioseekoff.c", "ioseekpos.c", "iosetbuffer.c", - "iosetvbuf.c", "iosprintf.c", "iosscanf.c", "iostrerror.c", - "ioungetc.c", "iovfprintf.c", "iovfscanf.c", "iovsprintf.c", - "iovsscanf.c", "outfloat.c", "str.cc", "stdfiles.c", "strops.c"); - -@iocf = ("iofdopen.c", "iofflush.c", "iofgets.c", "iofopen.c", - "iofprintf.c", "iofputs.c", "ioftell.c", "iofwrite.c", - "iogets.c", "ioperror.c", "ioputs.c", "ioscanf.c", - "iosetbuffer.c", "iosetvbuf.c", "iosprintf.c", "iosscanf.c", - "iovsprintf.c", "iovsscanf.c", "stdfiles.c"); - -@genclf = ("genclass.sh"); - -@genf = ("AVLMap.ccP", "AVLMap.hP", "AVLSet.ccP", "AVLSet.hP", - "AVec.ccP", "AVec.hP", "BSTSet.ccP", "BSTSet.hP", "Bag.ccP", - "Bag.hP", "CHBag.ccP", "CHBag.hP", "CHMap.ccP", "CHMap.hP", - "CHNode.ccP", "CHNode.hP", "CHSet.ccP", "CHSet.hP", - "DLDeque.ccP", "DLDeque.hP", "DLList.ccP", "DLList.hP", - "Deque.ccP", "Deque.hP", "FPQueue.ccP", "FPQueue.hP", - "FPStack.ccP", "FPStack.hP", "FPlex.ccP", "FPlex.hP", - "List.ccP", "List.hP", "MPlex.ccP", "MPlex.hP", "Map.ccP", - "Map.hP", "OSLBag.ccP", "OSLBag.hP", "OSLSet.ccP", - "OSLSet.hP", "OXPBag.ccP", "OXPBag.hP", "OXPSet.ccP", - "OXPSet.hP", "PHPQ.ccP", "PHPQ.hP", "PQ.ccP", "PQ.hP", - "PSList.hP", "PVec.hP", "Plex.ccP", "Plex.hP", "Queue.ccP", - "Queue.hP", "RAVLMap.ccP", "RAVLMap.hP", "RPlex.ccP", - "RPlex.hP", "SLBag.ccP", "SLBag.hP", "SLList.ccP", - "SLList.hP", "SLQueue.ccP", "SLQueue.hP", "SLSet.ccP", - "SLSet.hP", "SLStack.ccP", "SLStack.hP", "Set.ccP", "Set.hP", - "SkipBag.ccP", "SkipBag.hP", "SkipMap.ccP", "SkipMap.hP", - "SkipSet.ccP", "SkipSet.hP", "SplayBag.ccP", "SplayBag.hP", - "SplayMap.ccP", "SplayMap.hP", "SplayNode.ccP", - "SplayNode.hP", "SplayPQ.ccP", "SplayPQ.hP", "SplaySet.ccP", - "SplaySet.hP", "Stack.ccP", "Stack.hP", "VHBag.ccP", - "VHBag.hP", "VHMap.ccP", "VHMap.hP", "VHSet.ccP", "VHSet.hP", - "VOHSet.ccP", "VOHSet.hP", "VQueue.ccP", "VQueue.hP", - "VStack.ccP", "VStack.hP", "Vec.ccP", "Vec.hP", "XPBag.ccP", - "XPBag.hP", "XPDeque.ccP", "XPDeque.hP", "XPPQ.ccP", - "XPPQ.hP", "XPQueue.ccP", "XPQueue.hP", "XPSet.ccP", - "XPSet.hP", "XPStack.ccP", "XPStack.hP", "XPlex.ccP", - "XPlex.hP", "defs.hP", "intSList.hP", "intVec.hP" ); - -@lstdcf =("cmathi.cc", "cstdlibi.cc", "cstringi.cc", "exceptioni.cc", - "newi.cc", "stddefi.cc", "stdexcepti.cc", "typeinfoi.cc"); - -@lstdcf2 = ("cstrmain.cc", "cstrio.cc", "fcomplex.cc", "fcomio.cc", - "dcomplex.cc", "dcomio.cc", "ldcomplex.cc", "ldcomio.cc"); - -@lstdcof =("algorithm", "cassert", "cctype", "cerrno", "cfloat", - "ciso646", "climits", "clocale", "cmath", "complex", - "complex.h", "csetjmp", "csignal", "cstdarg", "cstddef", - "cstdio", "cstdlib", "cstring", "ctime", "cwchar", - "cwctype", "deque", "exception", "functional", "iterator", - "list", "map", "memory", "new", "new.h", "numeric", - "queue", "set", "stack", "stddef", "stdexcept", "stl.h", - "string", "typeinfo", "utility", "vector", "cinst.cc", - "sinst.cc" ); - -@rxf = ("rx.c"); - -@rxof = ("rx.h"); - -@stdf = ("bastring.cc", "complext.cc"); - -@stdof = ("bastring.h", "cassert.h", "cctype.h", "cerrno.h", - "cfloat.h", "cinst.h", "ciso646.h", "climits.h", - "clocale.h", "cmath.h", "complex.h", "complext.h", - "csetjmp.h", "csignal.h", "cstdarg.h", "cstddef.h", - "cstdio.h", "cstdlib.h", "cstring.h", "ctime.h", "cwchar.h", - "cwctype.h", "dcomplex.h", "exception.h", "fcomplex.h", - "ldcomplex.h", "new.h", "sinst.h", "stddef.h", - "stdexcept.h", "straits.h", "string.h", "typeinfo.h" ); - -@stlf = ("random.cc", "tempbuf.cc", "tree.cc"); - -@stlof = ("algo.h", "algobase.h", "bvector.h", "defalloc.h", - "deque.h", "faralloc.h", "fdeque.h", "flist.h", "fmap.h", - "fmultmap.h", "fmultset.h", "fset.h", "function.h", "hdeque.h", - "heap.h", "hlist.h", "hmap.h", "hmultmap.h", "hmultset.h", - "hset.h", "hugalloc.h", "hvector.h", "iterator.h", "lbvector.h", - "ldeque.h", "list.h", "llist.h", "lmap.h", "lmultmap.h", - "lmultset.h", "lngalloc.h", "lset.h", "map.h", "multimap.h", - "multiset.h", "neralloc.h", "nmap.h", "nmultmap.h", "nmultset.h", - "nset.h", "pair.h", "projectn.h", "set.h", "stack.h", "tempbuf.h", - "tree.h", "vector.h"); - -# sed edit list: file, sed-program -@sedlist = ( - "libg++/genclass/genclass.sh", "'s/<VERSION>/$version/g'", - "libg++/genclass/genclass.sh", - "'s/^PROTODIR=.*\$/PROTODIR=\\/usr\\/include\\/g++\\/gen/g'"); - -# -# Utility Subroutines -# - -# ©files (fromdir, todir, list of files); -sub copyfiles { - local ($fdir, $tdir, @list) = @_; - local ($f); - - foreach $f (@list) { - print " $fdir/$f --> $tdir/$f\n"; - system ("cp -p $fdir/$f $tdir/$f"); - } -} - -sub dumpsrcs { - local (@names) = @_; - local ($count); - - print ODATA "SRCS=\t"; - $count = 0; - foreach $f (@names) { - print ODATA "$f "; - if ($count == 5) { - print ODATA "\\\n"; - $count = 0; - } else { - $count += 1; - } - } - if ($count != 0) { - print ODATA "\n"; - } -} - -# Following functions written by Christos Zoulas, January 15, 1996. - -sub dumparray { - local (@names) = @_; - - foreach $f (@names) { - print ODATA "$f "; - } -} - -sub dumpfrag { - @cstrmain = ("REP", "MAIN", "TRAITS", "ADDSS", "ADDPS", "ADDCS", "ADDSP", - "ADDSC", "EQSS", "EQPS", "EQSP", "NESS", "NEPS", "NESP", - "LTSS", "LTPS", "LTSP", "GTSS", "GTPS", "GTSP", "LESS", - "LEPS", "LESP", "GESS", "GEPS", "GESP"); - - @complex = ("MAIN", "ADDCC", "ADDCF", "ADDFC", "SUBCC", "SUBCF", "SUBFC", - "MULCC", "MULCF", "MULFC", "DIVCC", "DIVCF", "DIVFC", "PLUS", - "MINUS", "EQCC", "EQCF", "EQFC", "NECC", "NECF", "NEFC", "ABS", - "ARG", "POLAR", "CONJ", "NORM", "COS", "COSH", "EXP", "LOG", - "POWCC", "POWCF", "POWCI", "POWFC", "SIN", "SINH", "SQRT"); - - @cstrio = ("EXTRACT", "INSERT", "GETLINE"); - - @comio = ("EXTRACT", "INSERT"); - - %prefix = ("ld", "LD", "d", "D", "f", "F"); - - print " Dumping frags\n"; - - foreach $f (@lstdcf2) { - print ODATA "$f: Makefile\n"; - print ODATA "\t\@echo Creating $f\n"; - print ODATA "\t@(for i in "; - if ($f eq "cstrmain.cc") { - &dumparray(@cstrmain); - $inc = "sinst.cc"; - $fl = "C"; - } - elsif ($f eq "cstrio.cc") { - &dumparray(@cstrio); - $inc = "sinst.cc"; - $fl = "C"; - } - elsif ($f =~ /(.*)complex\.cc/) { - $fl = $prefix{$1}; - &dumparray(@complex); - $inc = "cinst.cc"; - } - elsif ($f =~ /(.*)comio\.cc/) { - $fl = $prefix{$1}; - &dumparray(@comio); - $inc = "cinst.cc"; - } - else { - die "Unknown target type $f"; - } - print ODATA "; do \\\n"; - print ODATA "\t\techo \"#define \$\$i\"; \\\n"; - print ODATA "\t\tdone;\\\n"; - print ODATA "\techo '#define $fl';\\\n"; - print ODATA "\tcat \$(.CURDIR)/$inc) > \$(.TARGET)"; - print ODATA "\nCLEANFILES+=$f\n\n"; - } -} - -sub dumprtti { - local (@name) = @_; - - print " Dumping rtti for @name\n"; - - print ODATA "@name.o: @name.cc\n"; - print ODATA "\t\@echo \"\$(COMPILE.cc) -frtti \$(.IMPSRC)\"\n"; - print ODATA "\t\@\$(COMPILE.cc) -frtti \$(.IMPSRC) -o \$(.TARGET).o\n"; - print ODATA "\t\@\$(LD) -x -r \$(.TARGET).o -o \$(.TARGET)\n"; - print ODATA "\t\@rm -f \$(.TARGET).o\n"; - print ODATA "\n"; - - print ODATA "@name.po: @name.cc\n"; - print ODATA "\t\@echo \"\$(COMPILE.cc) -p -frtti \$(.IMPSRC) -o \$(.TARGET)\"\n"; - print ODATA "\t\@\$(COMPILE.cc) -p -frtti \$(.IMPSRC) -o \$(.TARGET).o\n"; - print ODATA "\t\@\$(LD) -X -r \$(.TARGET).o -o \$(.TARGET)\n"; - print ODATA "\t\@rm -f \$(.TARGET).o\n"; - print ODATA "\n"; - - print ODATA "@name.so: @name.cc\n"; - print ODATA "\t\@echo \"\$(COMPILE.cc) \$(CPICFLAGS) -frtti \$(.IMPSRC) -o \$(.TARGET)\"\n"; - print ODATA "\t\@\$(COMPILE.cc) \$(CPICFLAGS) -frtti \$(.IMPSRC) -o \$(.TARGET).o\n"; - print ODATA "\t\@\$(LD) -x -r \$(.TARGET).o -o \$(.TARGET)\n"; - print ODATA "\t\@rm -f \$(.TARGET).o\n"; - print ODATA "\n"; -} - -# -# Main progarm. -# - -if (!$srcdir) { - die "You must define the environment variables SRCDIR.\n" -} -print "Making the NetBSD directory tree.\n"; -mkdir ($targetdir,0777); -foreach $f (@subdirs) { - print " -->$f\n"; - mkdir ("$targetdir/$f",0777); -} - -print "Populating $targetdir.\n"; -©files ($srcdir, $targetdir, "COPYING"); - -print "Populating $targetdir/libg++/src\n"; -©files ("$srcdir/libg++/src", "$targetdir/libg++/src", @gf, @gh); -# Special file needed. -©files ("$srcdir/librx", "$targetdir/libg++/src", "rx.h"); - -print "Populating $targetdir/libg++/genclass\n"; -©files ("$srcdir/libg++/genclass", "$targetdir/libg++/genclass", @genclf); - -print "Populating $targetdir/libio\n"; -©files ("$srcdir/libio", "$targetdir/libio", @iocf, @iosf, @iosh); - -print "Populating $targetdir/include/gen\n"; -©files ("$srcdir/libg++/src/gen", "$targetdir/include/gen", @genf); - -print "Populating $targetdir/librx\n"; -©files ("$srcdir/librx", "$targetdir/librx", @rxf, @rxof); - -print "Populating $targetdir/libstdc++\n"; -©files ("$srcdir/libstdc++", "$targetdir/libstdc++", @lstdcf, @lstdcof); - -print "Populating $targetdir/libstdc++/std\n"; -©files ("$srcdir/libstdc++/std", "$targetdir/libstdc++/std", - @stdf, @stdof); - -print "Populating $targetdir/libstdc++/stl\n"; -©files ("$srcdir/libstdc++/stl", "$targetdir/libstdc++/stl", - @stlf, @stlof); - -# -# Build makefiles -# - -$first = "True"; -while ($line = <DATA>) { - chop ($line); - if (substr($line,0,2) eq "%%") { - @cmd = split (/ /,$line); - if ($cmd[1] eq "file") { - print "Building $targetdir/$cmd[2]\n"; - if ($first eq "") { - close (ODATA); - } else { - $first = ""; - } - open (ODATA, ">$targetdir/$cmd[2]") || - die "Could now create $targetdir/$cmd[2]"; - } elsif ($cmd[1] eq "srcs") { - print " Defining SRCS for $cmd[2]\n"; - if ($first) { - die "Data section must start with a %% file!"; - } - if ($cmd[2] eq "libg++") { - &dumpsrcs (@gf); - } elsif ($cmd[2] eq "genclass") { - &dumpsrcs (@genclf); - } elsif ($cmd[2] eq "iostream") { - &dumpsrcs (@iosf); - } elsif ($cmd[2] eq "io") { - &dumpsrcs (@iof); - } elsif ($cmd[2] eq "stdc++") { - &dumpsrcs (@iosf, @lstdcf, @lstdcf2, @stlf, @rxf); - } else { - die "Unknown SRCS command"; - } - } elsif ($cmd[1] eq "rtti") { - &dumprtti($cmd[2]); - } elsif ($cmd[1] eq "frag") { - &dumpfrag(); - } elsif ($cmd[1] eq "NetBSD") { - if ($first) { - die "Data section must start with a %% file!"; - } - print ODATA "# \$"."NetBSD".": \$\n"; - } - } else { - if ($first) { - die "Data section must start with a %% file!"; - } - print ODATA "$line\n"; - } -} -close (ODATA); - -# -# Sed transformations of files -# - -for ($i=0; $i<@sedlist; $i+=2) { - $f = $sedlist[$i]; - $p = $sedlist[$i+1]; - print "Modifying $f\n"; - system ("cd $targetdir; sed $p $f > tmp; mv -f tmp $f"); -} - -# -# end of the script -# - -# what follows is the data for makefiles and other special files -# that need to be created. - -__END__ -%% file Makefile -%% NetBSD - -SUBDIR= libg++ libstdc++ # libio libiostream - -HEADERS= cassert cctype cerrno cfloat ciso646 climits clocale cmath complex \ - csetjmp csignal cstdarg cstddef cstdio cstdlib cstring ctime \ - cwchar cwctype new stddef string exception stdexcept typeinfo \ - algorithm deque list map queue set stack vector utility functional \ - iterator memory numeric - - -includes: - @echo installing includes from libg++/src - @(cd libg++/src ; for j in *.[ih]; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/$$j; \ - done) - @echo installing includes from include/gen - @(cd include/gen ; for j in *.*P; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/gen/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/gen/$$j; \ - done) - @echo installing includes from libio - @(cd libio ; for j in *.h; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/$$j; \ - done) - @echo installing includes from libstdc++/std - @(cd libstdc++/std ; for j in *.h *.cc; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/std/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/std/$$j; \ - done) - @echo installing includes from libstdc++/stl - @(cd libstdc++/stl ; for j in *.h *.cc; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/$$j; \ - done) - @echo installing includes from libstdc++ - @(cd libstdc++ ; for j in *.h ${HEADERS}; do \ - cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \ - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \ - ${DESTDIR}/usr/include/g++/$$j; \ - done) - -.include <bsd.subdir.mk> -%% file libg++/Makefile -%% NetBSD -SUBDIR = src genclass - -.include <bsd.subdir.mk> -%% file libg++/genclass/Makefile -%% NetBSD -# Makefile for g++ library genclass - -BINDIR?= /usr/bin - -beforeinstall: - ${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - ${.CURDIR}/genclass.sh ${DESTDIR}${BINDIR}/genclass - -.include <bsd.prog.mk> -%% file libg++/src/Makefile -%% NetBSD - -LIB= g++ - -%% srcs libg++ - -CXXFLAGS+= -nostdinc++ -I$(.CURDIR)/../../include \ - -I$(.CURDIR)/../../libio -I$(.CURDIR)/../../libstdc++ -CPPFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../../libio -.if (${MACHINE} == "alpha") -LDADD= -lcurses -DPADD= ${LIBCURSES} -.else -LDADD= ${DESTDIR}/usr/lib/c++rt0.o -lcurses -DPADD= ${DESTDIR}/usr/lib/c++rt0.o ${LIBCURSES} -.endif -NOMAN= noman -NOLINT= nolint -LIBCURSES!= printf "xxx:\n\techo \$${LIBCURSES}\n.include <bsd.prog.mk>" |\ - $(MAKE) -r -s -f - xxx | grep curses - -.include <bsd.lib.mk> -%% file libio/Makefile -%% NetBSD - -LIB= io - -%% srcs io - -CXXFLAGS+= -nostdinc++ -I$(.CURDIR)/../include -CPPFLAGS+= -I$(.CURDIR) -NOMAN= noman -NOLINT= nolint - -.include <bsd.lib.mk> -%% file libiostream/Makefile -%% NetBSD - -LIB= iostream - -%% srcs iostream - -CXXFLAGS+= -nostdinc++ -I$(.CURDIR)/../include \ - -I$(.CURDIR)/../libio -CPPFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../libio -NOMAN= noman -NOLINT= nolint - -.PATH: $(.CURDIR)/../libio - -.include <bsd.lib.mk> -%% file libstdc++/Makefile -%% NetBSD - -LIB= stdc++ - -%% srcs stdc++ - -CXXFLAGS+= -nostdinc++ -CPPFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../libio -I$(.CURDIR)/stl -NOMAN= noman -NOLINT= nolint - -.PATH: $(.CURDIR)/../libio $(.CURDIR)/stl $(.CURDIR)/../librx - -.if (${MACHINE} != "alpha") -LDADD= ${DESTDIR}/usr/lib/c++rt0.o -DPADD= ${DESTDIR}/usr/lib/c++rt0.o -.endif - -.include <bsd.lib.mk> - -%% frag -%% rtti typeinfoi -%% rtti stdexcepti - -%% file libio/_G_config.h -/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ -#ifndef _G_config_h -#define _G_config_h -#define _G_LIB_VERSION "2.7.2" -#if ! defined(__alpha__) && !defined(__mips) /* ELF */ -#define _G_NAMES_HAVE_UNDERSCORE 1 -#else /* ELF */ -#define _G_NAMES_HAVE_UNDERSCORE 0 -#endif /* ELF */ -#define _G_VTABLE_LABEL_HAS_LENGTH 1 -#if ! defined(__alpha__) && !defined(__mips) /* ELF */ -#define _G_VTABLE_LABEL_PREFIX "__vt$" -#else /* ELF */ -#define _G_VTABLE_LABEL_PREFIX "_vt$" -#endif /* ELF */ -#define _G_HAVE_ST_BLKSIZE 1 -#ifndef __alpha__ -typedef unsigned long _G_clock_t; -#else /* __alpha__ */ -typedef int _G_clock_t; -#endif /* __alpha__ */ -typedef int _G_dev_t; -#ifndef __alpha__ -typedef long long _G_fpos_t; -#else /* __alpha__ */ -typedef long _G_fpos_t; -#endif /* __alpha__ */ -typedef unsigned int _G_gid_t; -typedef unsigned int _G_ino_t; -typedef unsigned short _G_mode_t; -typedef unsigned short _G_nlink_t; -#ifndef __alpha__ -typedef long long _G_off_t; -#else /* __alpha__ */ -typedef long _G_off_t; -#endif /* __alpha__ */ -typedef int _G_pid_t; -#ifndef __PTRDIFF_TYPE__ -#ifndef __alpha__ -#define __PTRDIFF_TYPE__ int -#else /* __alpha__ */ -#define __PTRDIFF_TYPE__ long -#endif /* __alpha__ */ -#endif -typedef __PTRDIFF_TYPE__ _G_ptrdiff_t; -typedef unsigned int _G_sigset_t; -#ifndef __SIZE_TYPE__ -#ifndef __alpha__ -#define __SIZE_TYPE__ unsigned int -#else /* __alpha__ */ -#define __SIZE_TYPE__ unsigned long -#endif /* __alpha__ */ -#endif -typedef __SIZE_TYPE__ _G_size_t; -#ifndef __alpha__ -typedef long _G_time_t; -#else /* __alpha__ */ -typedef int _G_time_t; -#endif /* __alpha__ */ -typedef unsigned int _G_uid_t; -typedef int _G_wchar_t; -#ifndef __alpha__ -typedef int _G_ssize_t; -typedef int /* default */ _G_wint_t; -#ifndef __powerpc__ -typedef char * _G_va_list; -#else -#define _G_NEED_STDARG_H 1 -#endif /* __powerpc__ */ -#else /* __alpha__ */ -typedef long _G_ssize_t; -typedef unsigned int /* default */ _G_wint_t; -#define _G_NEED_STDARG_H -#define _G_va_list va_list -#endif /* __alpha__ */ -#define _G_signal_return_type void -#define _G_sprintf_return_type int - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) -typedef int _G_int8_t __attribute__((__mode__(__QI__))); -typedef unsigned int _G_uint8_t __attribute__((__mode__(__QI__))); -typedef int _G_int16_t __attribute__((__mode__(__HI__))); -typedef unsigned int _G_uint16_t __attribute__((__mode__(__HI__))); -typedef int _G_int32_t __attribute__((__mode__(__SI__))); -typedef unsigned int _G_uint32_t __attribute__((__mode__(__SI__))); -typedef int _G_int64_t __attribute__((__mode__(__DI__))); -typedef unsigned int _G_uint64_t __attribute__((__mode__(__DI__))); -#else -typedef short _G_int16_t; -typedef unsigned short _G_uint16_t; -typedef int _G_int32_t; -typedef unsigned int _G_uint32_t; -#endif - -#define _G_BUFSIZ 1024 -#define _G_FOPEN_MAX 20 -#define _G_FILENAME_MAX 1024 -#define _G_NULL 0 /* default */ -#if defined (__cplusplus) || defined (__STDC__) -#define _G_ARGS(ARGLIST) ARGLIST -#else -#define _G_ARGS(ARGLIST) () -#endif -#if !defined (__GNUG__) || defined (__STRICT_ANSI__) -#define _G_NO_NRV -#endif -#if !defined (__GNUG__) -#define _G_NO_EXTERN_TEMPLATES -#endif -#define _G_HAVE_ATEXIT 1 -#define _G_HAVE_SYS_RESOURCE 1 -#define _G_HAVE_SYS_TIMES 1 -#define _G_HAVE_SYS_SOCKET 1 -#define _G_HAVE_SYS_CDEFS 1 -#define _G_HAVE_SYS_WAIT 1 -#define _G_HAVE_UNISTD 1 -#define _G_HAVE_DIRENT 1 -#define _G_HAVE_CURSES 1 -#define _G_MATH_H_INLINES 0 -#define _G_HAVE_BOOL 1 -#endif /* !_G_config_h */ -%% file libg++/src/shlib_version -major=4 -minor=0 -%% file libiostream/shlib_version -major=0 -minor=1 -%% file libio/shlib_version -major=0 -minor=1 -%% file libstdc++/shlib_version -major=0 -minor=1 -%% file VERSION -This is libg++ 2.7.2 from the Free Software Foundation. - -Complete, unmodified libg++ sources are available from -prep.ai.mit.edu and prep's mirrors. - diff --git a/gnu/lib/libg++/libio/_G_config.h b/gnu/lib/libg++/libio/_G_config.h index 0806ed75f15..bf0c5a1c2b5 100644 --- a/gnu/lib/libg++/libio/_G_config.h +++ b/gnu/lib/libg++/libio/_G_config.h @@ -1,121 +1,5 @@ -/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ -#ifndef _G_config_h -#define _G_config_h -#define _G_LIB_VERSION "2.7.2" -#if ! defined(__alpha__) && !defined(__mips) /* ELF */ -#define _G_NAMES_HAVE_UNDERSCORE 1 -#else /* ELF */ -#define _G_NAMES_HAVE_UNDERSCORE 0 -#endif /* ELF */ -#define _G_VTABLE_LABEL_HAS_LENGTH 1 -#if ! defined(__alpha__) && !defined(__mips) /* ELF */ -#define _G_VTABLE_LABEL_PREFIX "__vt$" -#else /* ELF */ -#define _G_VTABLE_LABEL_PREFIX "_vt$" -#endif /* ELF */ -#define _G_HAVE_ST_BLKSIZE 1 -#ifndef __alpha__ -typedef unsigned long _G_clock_t; -#else /* __alpha__ */ -typedef int _G_clock_t; -#endif /* __alpha__ */ -typedef int _G_dev_t; -#ifndef __alpha__ -typedef long long _G_fpos_t; -#else /* __alpha__ */ -typedef long _G_fpos_t; -#endif /* __alpha__ */ -typedef unsigned int _G_gid_t; -typedef unsigned int _G_ino_t; -typedef unsigned short _G_mode_t; -typedef unsigned short _G_nlink_t; -#ifndef __alpha__ -typedef long long _G_off_t; -#else /* __alpha__ */ -typedef long _G_off_t; -#endif /* __alpha__ */ -typedef int _G_pid_t; -#ifndef __PTRDIFF_TYPE__ -#ifndef __alpha__ -#define __PTRDIFF_TYPE__ int -#else /* __alpha__ */ -#define __PTRDIFF_TYPE__ long -#endif /* __alpha__ */ -#endif -typedef __PTRDIFF_TYPE__ _G_ptrdiff_t; -typedef unsigned int _G_sigset_t; -#ifndef __SIZE_TYPE__ -#ifndef __alpha__ -#define __SIZE_TYPE__ unsigned int -#else /* __alpha__ */ -#define __SIZE_TYPE__ unsigned long -#endif /* __alpha__ */ -#endif -typedef __SIZE_TYPE__ _G_size_t; -#ifndef __alpha__ -typedef long _G_time_t; -#else /* __alpha__ */ -typedef int _G_time_t; -#endif /* __alpha__ */ -typedef unsigned int _G_uid_t; -typedef int _G_wchar_t; -#ifndef __alpha__ -typedef int _G_ssize_t; -typedef int /* default */ _G_wint_t; -#ifndef __powerpc__ -typedef char * _G_va_list; -#else -#define _G_NEED_STDARG_H 1 -#endif /* __powerpc__ */ -#else /* __alpha__ */ -typedef long _G_ssize_t; -typedef unsigned int /* default */ _G_wint_t; -#define _G_NEED_STDARG_H -#define _G_va_list va_list -#endif /* __alpha__ */ -#define _G_signal_return_type void -#define _G_sprintf_return_type int +/* $NetBSD: _G_config.h,v 1.5 1998/09/13 22:23:16 tv Exp $ */ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) -typedef int _G_int8_t __attribute__((__mode__(__QI__))); -typedef unsigned int _G_uint8_t __attribute__((__mode__(__QI__))); -typedef int _G_int16_t __attribute__((__mode__(__HI__))); -typedef unsigned int _G_uint16_t __attribute__((__mode__(__HI__))); -typedef int _G_int32_t __attribute__((__mode__(__SI__))); -typedef unsigned int _G_uint32_t __attribute__((__mode__(__SI__))); -typedef int _G_int64_t __attribute__((__mode__(__DI__))); -typedef unsigned int _G_uint64_t __attribute__((__mode__(__DI__))); -#else -typedef short _G_int16_t; -typedef unsigned short _G_uint16_t; -typedef int _G_int32_t; -typedef unsigned int _G_uint32_t; -#endif +/* These definitions are machine-dependent, so pick up the proper MD file. */ -#define _G_BUFSIZ 1024 -#define _G_FOPEN_MAX 20 -#define _G_FILENAME_MAX 1024 -#define _G_NULL 0 /* default */ -#if defined (__cplusplus) || defined (__STDC__) -#define _G_ARGS(ARGLIST) ARGLIST -#else -#define _G_ARGS(ARGLIST) () -#endif -#if !defined (__GNUG__) || defined (__STRICT_ANSI__) -#define _G_NO_NRV -#endif -#if !defined (__GNUG__) -#define _G_NO_EXTERN_TEMPLATES -#endif -#define _G_HAVE_ATEXIT 1 -#define _G_HAVE_SYS_RESOURCE 1 -#define _G_HAVE_SYS_TIMES 1 -#define _G_HAVE_SYS_SOCKET 1 -#define _G_HAVE_SYS_CDEFS 1 -#define _G_HAVE_SYS_WAIT 1 -#define _G_HAVE_UNISTD 1 -#define _G_HAVE_DIRENT 1 -#define _G_HAVE_CURSES 1 -#define _G_MATH_H_INLINES 0 -#define _G_HAVE_BOOL 1 -#endif /* !_G_config_h */ +#include <machine/_G_config.h> diff --git a/gnu/lib/libg++/libiostream/Makefile b/gnu/lib/libg++/libiostream/Makefile deleted file mode 100644 index a954d67487a..00000000000 --- a/gnu/lib/libg++/libiostream/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# $NetBSD: Makefile,v 1.4 1998/02/19 02:17:06 cgd Exp $ - -LIB= iostream - -SRCS= PlotFile.cc SFile.cc builtinbuf.cc editbuf.cc filebuf.cc fstream.cc \ -indstream.cc ioassign.cc ioextend.cc iomanip.cc iostream.cc isgetline.cc \ -isgetsb.cc isscan.cc osform.cc parsestream.cc pfstream.cc procbuf.cc \ -sbform.cc sbgetline.cc sbscan.cc stdiostream.cc stdstrbufs.cc stdstreams.cc \ -stream.cc streambuf.cc strstream.cc cleanup.c filedoalloc.c fileops.c \ -floatconv.c genops.c iofclose.c iofgetpos.c iofread.c iofscanf.c \ -iofsetpos.c iogetdelim.c iogetline.c ioignore.c iopadn.c iopopen.c \ -ioprims.c ioprintf.c ioseekoff.c ioseekpos.c iostrerror.c ioungetc.c \ -iovfprintf.c iovfscanf.c outfloat.c strops.c - -CXXFLAGS+= -nostdinc++ -I$(.CURDIR)/../include \ - -I$(.CURDIR)/../libio -CPPFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../libio -NOMAN= noman -NOLINT= nolint (c++) - -.PATH: $(.CURDIR)/../libio - -.include <bsd.lib.mk> diff --git a/gnu/lib/libg++/libiostream/shlib_version b/gnu/lib/libg++/libiostream/shlib_version deleted file mode 100644 index 3d7c908e43d..00000000000 --- a/gnu/lib/libg++/libiostream/shlib_version +++ /dev/null @@ -1,2 +0,0 @@ -major=0 -minor=1 diff --git a/gnu/lib/libg++/librx/rx.c b/gnu/lib/libg++/librx/rx.c deleted file mode 100644 index 3230cdccf8b..00000000000 --- a/gnu/lib/libg++/librx/rx.c +++ /dev/null @@ -1,7193 +0,0 @@ -/* Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - -This file is part of the librx library. - -Librx is free software; you can redistribute it and/or modify it under -the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -Librx is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU Library General Public -License along with this software; see the file COPYING.LIB. If not, -write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA -02139, USA. */ - -/* NOTE!!! AIX is so losing it requires this to be the first thing in the - * file. - * Do not put ANYTHING before it! - */ -#if !defined (__GNUC__) && defined (_AIX) - #pragma alloca -#endif - -/* To make linux happy? */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - - -char rx_version_string[] = "GNU Rx version 0.07.2"; - - /* ``Too hard!'' - * -- anon. - */ - - -#include <stdio.h> -#include <ctype.h> -#ifndef isgraph -#define isgraph(c) (isprint (c) && !isspace (c)) -#endif -#ifndef isblank -#define isblank(c) ((c) == ' ' || (c) == '\t') -#endif - -#include <sys/types.h> - -#undef MAX -#undef MIN -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - -typedef char boolean; -#define false 0 -#define true 1 - -#ifndef __GCC__ -#undef __inline__ -#define __inline__ -#endif - -/* Emacs already defines alloca, sometimes. */ -#ifndef alloca - -/* Make alloca work the best possible way. */ -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not __GNUC__ */ -#if HAVE_ALLOCA_H -#include <alloca.h> -#else /* not __GNUC__ or HAVE_ALLOCA_H */ -#ifndef _AIX /* Already did AIX, up at the top. */ -char *alloca (); -#endif /* not _AIX */ -#endif /* not HAVE_ALLOCA_H */ -#endif /* not __GNUC__ */ - -#endif /* not alloca */ - -/* Memory management and stuff for emacs. */ - -#define CHARBITS 8 -#define remalloc(M, S) (M ? realloc (M, S) : malloc (S)) - - -/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we - * use `alloca' instead of `malloc' for the backtracking stack. - * - * Emacs will die miserably if we don't do this. - */ - -#ifdef REGEX_MALLOC -#define REGEX_ALLOCATE malloc -#else /* not REGEX_MALLOC */ -#define REGEX_ALLOCATE alloca -#endif /* not REGEX_MALLOC */ - - -#ifdef RX_WANT_RX_DEFS -#define RX_DECL extern -#define RX_DEF_QUAL -#else -#define RX_WANT_RX_DEFS -#define RX_DECL static -#define RX_DEF_QUAL static -#endif -#include "rx.h" -#undef RX_DECL -#define RX_DECL RX_DEF_QUAL - - -#ifndef emacs - -#ifdef SYNTAX_TABLE -extern char *re_syntax_table; -#else /* not SYNTAX_TABLE */ - -#ifndef RX_WANT_RX_DEFS -RX_DECL char re_syntax_table[CHAR_SET_SIZE]; -#endif - -#ifdef __STDC__ -static void -init_syntax_once (void) -#else -static void -init_syntax_once () -#endif -{ - register int c; - static int done = 0; - - if (done) - return; - - bzero (re_syntax_table, sizeof re_syntax_table); - - for (c = 'a'; c <= 'z'; c++) - re_syntax_table[c] = Sword; - - for (c = 'A'; c <= 'Z'; c++) - re_syntax_table[c] = Sword; - - for (c = '0'; c <= '9'; c++) - re_syntax_table[c] = Sword; - - re_syntax_table['_'] = Sword; - - done = 1; -} -#endif /* not SYNTAX_TABLE */ -#endif /* not emacs */ - -/* Compile with `-DRX_DEBUG' and use the following flags. - * - * Debugging flags: - * rx_debug - print information as a regexp is compiled - * rx_debug_trace - print information as a regexp is executed - */ - -#ifdef RX_DEBUG - -int rx_debug_compile = 0; -int rx_debug_trace = 0; -static struct re_pattern_buffer * dbug_rxb = 0; - -#ifdef __STDC__ -typedef void (*side_effect_printer) (struct rx *, void *, FILE *); -#else -typedef void (*side_effect_printer) (); -#endif - -#ifdef __STDC__ -static void print_cset (struct rx *rx, rx_Bitset cset, FILE * fp); -#else -static void print_cset (); -#endif - -#ifdef __STDC__ -static void -print_rexp (struct rx *rx, - struct rexp_node *node, int depth, - side_effect_printer seprint, FILE * fp) -#else -static void -print_rexp (rx, node, depth, seprint, fp) - struct rx *rx; - struct rexp_node *node; - int depth; - side_effect_printer seprint; - FILE * fp; -#endif -{ - if (!node) - return; - else - { - switch (node->type) - { - case r_cset: - { - fprintf (fp, "%*s", depth, ""); - print_cset (rx, node->params.cset, fp); - fputc ('\n', fp); - break; - } - - case r_opt: - case r_star: - fprintf (fp, "%*s%s\n", depth, "", - node->type == r_opt ? "opt" : "star"); - print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp); - break; - - case r_2phase_star: - fprintf (fp, "%*s2phase star\n", depth, ""); - print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp); - print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp); - break; - - - case r_alternate: - case r_concat: - fprintf (fp, "%*s%s\n", depth, "", - node->type == r_alternate ? "alt" : "concat"); - print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp); - print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp); - break; - case r_side_effect: - fprintf (fp, "%*sSide effect: ", depth, ""); - seprint (rx, node->params.side_effect, fp); - fputc ('\n', fp); - } - } -} - -#ifdef __STDC__ -static void -print_nfa (struct rx * rx, - struct rx_nfa_state * n, - side_effect_printer seprint, FILE * fp) -#else -static void -print_nfa (rx, n, seprint, fp) - struct rx * rx; - struct rx_nfa_state * n; - side_effect_printer seprint; - FILE * fp; -#endif -{ - while (n) - { - struct rx_nfa_edge *e = n->edges; - struct rx_possible_future *ec = n->futures; - fprintf (fp, "node %d %s\n", n->id, - n->is_final ? "final" : (n->is_start ? "start" : "")); - while (e) - { - fprintf (fp, " edge to %d, ", e->dest->id); - switch (e->type) - { - case ne_epsilon: - fprintf (fp, "epsilon\n"); - break; - case ne_side_effect: - fprintf (fp, "side effect "); - seprint (rx, e->params.side_effect, fp); - fputc ('\n', fp); - break; - case ne_cset: - fprintf (fp, "cset "); - print_cset (rx, e->params.cset, fp); - fputc ('\n', fp); - break; - } - e = e->next; - } - - while (ec) - { - int x; - struct rx_nfa_state_set * s; - struct rx_se_list * l; - fprintf (fp, " eclosure to {"); - for (s = ec->destset; s; s = s->cdr) - fprintf (fp, "%d ", s->car->id); - fprintf (fp, "} ("); - for (l = ec->effects; l; l = l->cdr) - { - seprint (rx, l->car, fp); - fputc (' ', fp); - } - fprintf (fp, ")\n"); - ec = ec->next; - } - n = n->next; - } -} - -static char * efnames [] = -{ - "bogon", - "re_se_try", - "re_se_pushback", - "re_se_push0", - "re_se_pushpos", - "re_se_chkpos", - "re_se_poppos", - "re_se_at_dot", - "re_se_syntax", - "re_se_not_syntax", - "re_se_begbuf", - "re_se_hat", - "re_se_wordbeg", - "re_se_wordbound", - "re_se_notwordbound", - "re_se_wordend", - "re_se_endbuf", - "re_se_dollar", - "re_se_fail", -}; - -static char * efnames2[] = -{ - "re_se_win", - "re_se_lparen", - "re_se_rparen", - "re_se_backref", - "re_se_iter", - "re_se_end_iter", - "re_se_tv" -}; - -static char * inx_names[] = -{ - "rx_backtrack_point", - "rx_do_side_effects", - "rx_cache_miss", - "rx_next_char", - "rx_backtrack", - "rx_error_inx", - "rx_num_instructions" -}; - - -#ifdef __STDC__ -static void -re_seprint (struct rx * rx, void * effect, FILE * fp) -#else -static void -re_seprint (rx, effect, fp) - struct rx * rx; - void * effect; - FILE * fp; -#endif -{ - if ((int)effect < 0) - fputs (efnames[-(int)effect], fp); - else if (dbug_rxb) - { - struct re_se_params * p = &dbug_rxb->se_params[(int)effect]; - fprintf (fp, "%s(%d,%d)", efnames2[p->se], p->op1, p->op2); - } - else - fprintf (fp, "[complex op # %d]", (int)effect); -} - - -/* These are so the regex.c regression tests will compile. */ -void -print_compiled_pattern (rxb) - struct re_pattern_buffer * rxb; -{ -} - -void -print_fastmap (fm) - char * fm; -{ -} - -#endif /* RX_DEBUG */ - - - -/* This page: Bitsets. Completely unintersting. */ - -#ifdef __STDC__ -RX_DECL int -rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL int -rx_bitset_is_equal (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - RX_subset s = b[0]; - b[0] = ~a[0]; - - for (x = rx_bitset_numb_subsets(size) - 1; a[x] == b[x]; --x) - ; - - b[0] = s; - return !x && s == a[0]; -} - -#ifdef __STDC__ -RX_DECL int -rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL int -rx_bitset_is_subset (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x = rx_bitset_numb_subsets(size) - 1; - while (x-- && (a[x] & b[x]) == a[x]); - return x == -1; -} - - -#ifdef __STDC__ -RX_DECL int -rx_bitset_empty (int size, rx_Bitset set) -#else -RX_DECL int -rx_bitset_empty (size, set) - int size; - rx_Bitset set; -#endif -{ - int x; - RX_subset s = set[0]; - set[0] = 1; - for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x) - ; - set[0] = s; - return !s; -} - -#ifdef __STDC__ -RX_DECL void -rx_bitset_null (int size, rx_Bitset b) -#else -RX_DECL void -rx_bitset_null (size, b) - int size; - rx_Bitset b; -#endif -{ - bzero (b, rx_sizeof_bitset(size)); -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_universe (int size, rx_Bitset b) -#else -RX_DECL void -rx_bitset_universe (size, b) - int size; - rx_Bitset b; -#endif -{ - int x = rx_bitset_numb_subsets (size); - while (x--) - *b++ = ~(RX_subset)0; -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_complement (int size, rx_Bitset b) -#else -RX_DECL void -rx_bitset_complement (size, b) - int size; - rx_Bitset b; -#endif -{ - int x = rx_bitset_numb_subsets (size); - while (x--) - { - *b = ~*b; - ++b; - } -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_assign (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] = b[x]; -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_union (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_union (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] |= b[x]; -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_intersection (int size, - rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_intersection (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] &= b[x]; -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_difference (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] &= ~ b[x]; -} - - -#ifdef __STDC__ -RX_DECL void -rx_bitset_revdifference (int size, - rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_revdifference (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] = ~a[x] & b[x]; -} - -#ifdef __STDC__ -RX_DECL void -rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b) -#else -RX_DECL void -rx_bitset_xor (size, a, b) - int size; - rx_Bitset a; - rx_Bitset b; -#endif -{ - int x; - for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x) - a[x] ^= b[x]; -} - - -#ifdef __STDC__ -RX_DECL unsigned long -rx_bitset_hash (int size, rx_Bitset b) -#else -RX_DECL unsigned long -rx_bitset_hash (size, b) - int size; - rx_Bitset b; -#endif -{ - int x; - unsigned long hash = (unsigned long)rx_bitset_hash; - - for (x = rx_bitset_numb_subsets(size) - 1; x >= 0; --x) - hash ^= rx_bitset_subset_val(b, x); - - return hash; -} - - -RX_DECL RX_subset rx_subset_singletons [RX_subset_bits] = -{ - 0x1, - 0x2, - 0x4, - 0x8, - 0x10, - 0x20, - 0x40, - 0x80, - 0x100, - 0x200, - 0x400, - 0x800, - 0x1000, - 0x2000, - 0x4000, - 0x8000, - 0x10000, - 0x20000, - 0x40000, - 0x80000, - 0x100000, - 0x200000, - 0x400000, - 0x800000, - 0x1000000, - 0x2000000, - 0x4000000, - 0x8000000, - 0x10000000, - 0x20000000, - 0x40000000, - 0x80000000 -}; - -#ifdef RX_DEBUG - -#ifdef __STDC__ -static void -print_cset (struct rx *rx, rx_Bitset cset, FILE * fp) -#else -static void -print_cset (rx, cset, fp) - struct rx *rx; - rx_Bitset cset; - FILE * fp; -#endif -{ - int x; - fputc ('[', fp); - for (x = 0; x < rx->local_cset_size; ++x) - if (RX_bitset_member (cset, x)) - { - if (isprint(x)) - fputc (x, fp); - else - fprintf (fp, "\\0%o ", x); - } - fputc (']', fp); -} - -#endif /* RX_DEBUG */ - - - -static unsigned long rx_hash_masks[4] = -{ - 0x12488421, - 0x96699669, - 0xbe7dd7eb, - 0xffffffff -}; - - -/* Hash tables */ -#ifdef __STDC__ -RX_DECL struct rx_hash_item * -rx_hash_find (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules) -#else -RX_DECL struct rx_hash_item * -rx_hash_find (table, hash, value, rules) - struct rx_hash * table; - unsigned long hash; - void * value; - struct rx_hash_rules * rules; -#endif -{ - rx_hash_eq eq = rules->eq; - int maskc = 0; - long mask = rx_hash_masks [0]; - int bucket = (hash & mask) % 13; - - while (table->children [bucket]) - { - table = table->children [bucket]; - ++maskc; - mask = rx_hash_masks[maskc]; - bucket = (hash & mask) % 13; - } - - { - struct rx_hash_item * it = table->buckets[bucket]; - while (it) - if (eq (it->data, value)) - return it; - else - it = it->next_same_hash; - } - - return 0; -} - - -#ifdef __STDC__ -RX_DECL struct rx_hash_item * -rx_hash_store (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules) -#else -RX_DECL struct rx_hash_item * -rx_hash_store (table, hash, value, rules) - struct rx_hash * table; - unsigned long hash; - void * value; - struct rx_hash_rules * rules; -#endif -{ - rx_hash_eq eq = rules->eq; - int maskc = 0; - long mask = rx_hash_masks[0]; - int bucket = (hash & mask) % 13; - int depth = 0; - - while (table->children [bucket]) - { - table = table->children [bucket]; - ++maskc; - mask = rx_hash_masks[maskc]; - bucket = (hash & mask) % 13; - ++depth; - } - - { - struct rx_hash_item * it = table->buckets[bucket]; - while (it) - if (eq (it->data, value)) - return it; - else - it = it->next_same_hash; - } - - { - if ( (depth < 3) - && (table->bucket_size [bucket] >= 4)) - { - struct rx_hash * newtab = ((struct rx_hash *) - rules->hash_alloc (rules)); - if (!newtab) - goto add_to_bucket; - bzero (newtab, sizeof (*newtab)); - newtab->parent = table; - { - struct rx_hash_item * them = table->buckets[bucket]; - unsigned long newmask = rx_hash_masks[maskc + 1]; - while (them) - { - struct rx_hash_item * save = them->next_same_hash; - int new_buck = (them->hash & newmask) % 13; - them->next_same_hash = newtab->buckets[new_buck]; - newtab->buckets[new_buck] = them; - them->table = newtab; - them = save; - ++newtab->bucket_size[new_buck]; - ++newtab->refs; - } - table->refs = (table->refs - table->bucket_size[bucket] + 1); - table->bucket_size[bucket] = 0; - table->buckets[bucket] = 0; - table->children[bucket] = newtab; - table = newtab; - bucket = (hash & newmask) % 13; - } - } - } - add_to_bucket: - { - struct rx_hash_item * it = ((struct rx_hash_item *) - rules->hash_item_alloc (rules, value)); - if (!it) - return 0; - it->hash = hash; - it->table = table; - /* DATA and BINDING are to be set in hash_item_alloc */ - it->next_same_hash = table->buckets [bucket]; - table->buckets[bucket] = it; - ++table->bucket_size [bucket]; - ++table->refs; - return it; - } -} - - -#ifdef __STDC__ -RX_DECL void -rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules) -#else -RX_DECL void -rx_hash_free (it, rules) - struct rx_hash_item * it; - struct rx_hash_rules * rules; -#endif -{ - if (it) - { - struct rx_hash * table = it->table; - unsigned long hash = it->hash; - int depth = (table->parent - ? (table->parent->parent - ? (table->parent->parent->parent - ? 3 - : 2) - : 1) - : 0); - int bucket = (hash & rx_hash_masks [depth]) % 13; - struct rx_hash_item ** pos = &table->buckets [bucket]; - - while (*pos != it) - pos = &(*pos)->next_same_hash; - *pos = it->next_same_hash; - rules->free_hash_item (it, rules); - --table->bucket_size[bucket]; - --table->refs; - while (!table->refs && depth) - { - struct rx_hash * save = table; - table = table->parent; - --depth; - bucket = (hash & rx_hash_masks [depth]) % 13; - --table->refs; - table->children[bucket] = 0; - rules->free_hash (save, rules); - } - } -} - -#ifdef __STDC__ -RX_DECL void -rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn, - struct rx_hash_rules * rules) -#else -RX_DECL void -rx_free_hash_table (tab, freefn, rules) - struct rx_hash * tab; - rx_hash_freefn freefn; - struct rx_hash_rules * rules; -#endif -{ - int x; - - for (x = 0; x < 13; ++x) - if (tab->children[x]) - { - rx_free_hash_table (tab->children[x], freefn, rules); - rules->free_hash (tab->children[x], rules); - } - else - { - struct rx_hash_item * them = tab->buckets[x]; - while (them) - { - struct rx_hash_item * that = them; - them = that->next_same_hash; - freefn (that); - rules->free_hash_item (that, rules); - } - } -} - - - -/* Utilities for manipulating bitset represntations of characters sets. */ - -#ifdef __STDC__ -RX_DECL rx_Bitset -rx_cset (struct rx *rx) -#else -RX_DECL rx_Bitset -rx_cset (rx) - struct rx *rx; -#endif -{ - rx_Bitset b = (rx_Bitset) malloc (rx_sizeof_bitset (rx->local_cset_size)); - if (b) - rx_bitset_null (rx->local_cset_size, b); - return b; -} - - -#ifdef __STDC__ -RX_DECL rx_Bitset -rx_copy_cset (struct rx *rx, rx_Bitset a) -#else -RX_DECL rx_Bitset -rx_copy_cset (rx, a) - struct rx *rx; - rx_Bitset a; -#endif -{ - rx_Bitset cs = rx_cset (rx); - - if (cs) - rx_bitset_union (rx->local_cset_size, cs, a); - - return cs; -} - - -#ifdef __STDC__ -RX_DECL void -rx_free_cset (struct rx * rx, rx_Bitset c) -#else -RX_DECL void -rx_free_cset (rx, c) - struct rx * rx; - rx_Bitset c; -#endif -{ - if (c) - free ((char *)c); -} - - -/* Hash table memory allocation policy for the regexp compiler */ - -#ifdef __STDC__ -static struct rx_hash * -compiler_hash_alloc (struct rx_hash_rules * rules) -#else -static struct rx_hash * -compiler_hash_alloc (rules) - struct rx_hash_rules * rules; -#endif -{ - return (struct rx_hash *)malloc (sizeof (struct rx_hash)); -} - - -#ifdef __STDC__ -static struct rx_hash_item * -compiler_hash_item_alloc (struct rx_hash_rules * rules, void * value) -#else -static struct rx_hash_item * -compiler_hash_item_alloc (rules, value) - struct rx_hash_rules * rules; - void * value; -#endif -{ - struct rx_hash_item * it; - it = (struct rx_hash_item *)malloc (sizeof (*it)); - if (it) - { - it->data = value; - it->binding = 0; - } - return it; -} - - -#ifdef __STDC__ -static void -compiler_free_hash (struct rx_hash * tab, - struct rx_hash_rules * rules) -#else -static void -compiler_free_hash (tab, rules) - struct rx_hash * tab; - struct rx_hash_rules * rules; -#endif -{ - free ((char *)tab); -} - - -#ifdef __STDC__ -static void -compiler_free_hash_item (struct rx_hash_item * item, - struct rx_hash_rules * rules) -#else -static void -compiler_free_hash_item (item, rules) - struct rx_hash_item * item; - struct rx_hash_rules * rules; -#endif -{ - free ((char *)item); -} - - -/* This page: REXP_NODE (expression tree) structures. */ - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rexp_node (struct rx *rx, - enum rexp_node_type type) -#else -RX_DECL struct rexp_node * -rexp_node (rx, type) - struct rx *rx; - enum rexp_node_type type; -#endif -{ - struct rexp_node *n; - - n = (struct rexp_node *)malloc (sizeof (*n)); - bzero (n, sizeof (*n)); - if (n) - n->type = type; - return n; -} - - -/* free_rexp_node assumes that the bitset passed to rx_mk_r_cset - * can be freed using rx_free_cset. - */ -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_cset (struct rx * rx, - rx_Bitset b) -#else -RX_DECL struct rexp_node * -rx_mk_r_cset (rx, b) - struct rx * rx; - rx_Bitset b; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_cset); - if (n) - n->params.cset = b; - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_concat (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b) -#else -RX_DECL struct rexp_node * -rx_mk_r_concat (rx, a, b) - struct rx * rx; - struct rexp_node * a; - struct rexp_node * b; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_concat); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = b; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_alternate (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b) -#else -RX_DECL struct rexp_node * -rx_mk_r_alternate (rx, a, b) - struct rx * rx; - struct rexp_node * a; - struct rexp_node * b; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_alternate); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = b; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_opt (struct rx * rx, - struct rexp_node * a) -#else -RX_DECL struct rexp_node * -rx_mk_r_opt (rx, a) - struct rx * rx; - struct rexp_node * a; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_opt); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = 0; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_star (struct rx * rx, - struct rexp_node * a) -#else -RX_DECL struct rexp_node * -rx_mk_r_star (rx, a) - struct rx * rx; - struct rexp_node * a; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_star); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = 0; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_2phase_star (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b) -#else -RX_DECL struct rexp_node * -rx_mk_r_2phase_star (rx, a, b) - struct rx * rx; - struct rexp_node * a; - struct rexp_node * b; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_2phase_star); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = b; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_side_effect (struct rx * rx, - rx_side_effect a) -#else -RX_DECL struct rexp_node * -rx_mk_r_side_effect (rx, a) - struct rx * rx; - rx_side_effect a; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_side_effect); - if (n) - { - n->params.side_effect = a; - n->params.pair.right = 0; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_mk_r_data (struct rx * rx, - void * a) -#else -RX_DECL struct rexp_node * -rx_mk_r_data (rx, a) - struct rx * rx; - void * a; -#endif -{ - struct rexp_node * n = rexp_node (rx, r_data); - if (n) - { - n->params.pair.left = a; - n->params.pair.right = 0; - } - return n; -} - - -#ifdef __STDC__ -RX_DECL void -rx_free_rexp (struct rx * rx, struct rexp_node * node) -#else -RX_DECL void -rx_free_rexp (rx, node) - struct rx * rx; - struct rexp_node * node; -#endif -{ - if (node) - { - switch (node->type) - { - case r_cset: - if (node->params.cset) - rx_free_cset (rx, node->params.cset); - - case r_side_effect: - break; - - case r_concat: - case r_alternate: - case r_2phase_star: - case r_opt: - case r_star: - rx_free_rexp (rx, node->params.pair.left); - rx_free_rexp (rx, node->params.pair.right); - break; - - case r_data: - /* This shouldn't occur. */ - break; - } - free ((char *)node); - } -} - - -#ifdef __STDC__ -RX_DECL struct rexp_node * -rx_copy_rexp (struct rx *rx, - struct rexp_node *node) -#else -RX_DECL struct rexp_node * -rx_copy_rexp (rx, node) - struct rx *rx; - struct rexp_node *node; -#endif -{ - if (!node) - return 0; - else - { - struct rexp_node *n = rexp_node (rx, node->type); - if (!n) - return 0; - switch (node->type) - { - case r_cset: - n->params.cset = rx_copy_cset (rx, node->params.cset); - if (!n->params.cset) - { - rx_free_rexp (rx, n); - return 0; - } - break; - - case r_side_effect: - n->params.side_effect = node->params.side_effect; - break; - - case r_concat: - case r_alternate: - case r_opt: - case r_2phase_star: - case r_star: - n->params.pair.left = - rx_copy_rexp (rx, node->params.pair.left); - n->params.pair.right = - rx_copy_rexp (rx, node->params.pair.right); - if ( (node->params.pair.left && !n->params.pair.left) - || (node->params.pair.right && !n->params.pair.right)) - { - rx_free_rexp (rx, n); - return 0; - } - break; - case r_data: - /* shouldn't happen */ - break; - } - return n; - } -} - - - -/* This page: functions to build and destroy graphs that describe nfa's */ - -/* Constructs a new nfa node. */ -#ifdef __STDC__ -RX_DECL struct rx_nfa_state * -rx_nfa_state (struct rx *rx) -#else -RX_DECL struct rx_nfa_state * -rx_nfa_state (rx) - struct rx *rx; -#endif -{ - struct rx_nfa_state * n = (struct rx_nfa_state *)malloc (sizeof (*n)); - if (!n) - return 0; - bzero (n, sizeof (*n)); - n->next = rx->nfa_states; - rx->nfa_states = n; - return n; -} - - -#ifdef __STDC__ -RX_DECL void -rx_free_nfa_state (struct rx_nfa_state * n) -#else -RX_DECL void -rx_free_nfa_state (n) - struct rx_nfa_state * n; -#endif -{ - free ((char *)n); -} - - -/* This looks up an nfa node, given a numeric id. Numeric id's are - * assigned after the nfa has been built. - */ -#ifdef __STDC__ -RX_DECL struct rx_nfa_state * -rx_id_to_nfa_state (struct rx * rx, - int id) -#else -RX_DECL struct rx_nfa_state * -rx_id_to_nfa_state (rx, id) - struct rx * rx; - int id; -#endif -{ - struct rx_nfa_state * n; - for (n = rx->nfa_states; n; n = n->next) - if (n->id == id) - return n; - return 0; -} - - -/* This adds an edge between two nodes, but doesn't initialize the - * edge label. - */ - -#ifdef __STDC__ -RX_DECL struct rx_nfa_edge * -rx_nfa_edge (struct rx *rx, - enum rx_nfa_etype type, - struct rx_nfa_state *start, - struct rx_nfa_state *dest) -#else -RX_DECL struct rx_nfa_edge * -rx_nfa_edge (rx, type, start, dest) - struct rx *rx; - enum rx_nfa_etype type; - struct rx_nfa_state *start; - struct rx_nfa_state *dest; -#endif -{ - struct rx_nfa_edge *e; - e = (struct rx_nfa_edge *)malloc (sizeof (*e)); - if (!e) - return 0; - e->next = start->edges; - start->edges = e; - e->type = type; - e->dest = dest; - return e; -} - - -#ifdef __STDC__ -RX_DECL void -rx_free_nfa_edge (struct rx_nfa_edge * e) -#else -RX_DECL void -rx_free_nfa_edge (e) - struct rx_nfa_edge * e; -#endif -{ - free ((char *)e); -} - - -/* This constructs a POSSIBLE_FUTURE, which is a kind epsilon-closure - * of an NFA. These are added to an nfa automaticly by eclose_nfa. - */ - -#ifdef __STDC__ -static struct rx_possible_future * -rx_possible_future (struct rx * rx, - struct rx_se_list * effects) -#else -static struct rx_possible_future * -rx_possible_future (rx, effects) - struct rx * rx; - struct rx_se_list * effects; -#endif -{ - struct rx_possible_future *ec; - ec = (struct rx_possible_future *) malloc (sizeof (*ec)); - if (!ec) - return 0; - ec->destset = 0; - ec->next = 0; - ec->effects = effects; - return ec; -} - - -#ifdef __STDC__ -static void -rx_free_possible_future (struct rx_possible_future * pf) -#else -static void -rx_free_possible_future (pf) - struct rx_possible_future * pf; -#endif -{ - free ((char *)pf); -} - - -#ifdef __STDC__ -RX_DECL void -rx_free_nfa (struct rx *rx) -#else -RX_DECL void -rx_free_nfa (rx) - struct rx *rx; -#endif -{ - while (rx->nfa_states) - { - while (rx->nfa_states->edges) - { - switch (rx->nfa_states->edges->type) - { - case ne_cset: - rx_free_cset (rx, rx->nfa_states->edges->params.cset); - break; - default: - break; - } - { - struct rx_nfa_edge * e; - e = rx->nfa_states->edges; - rx->nfa_states->edges = rx->nfa_states->edges->next; - rx_free_nfa_edge (e); - } - } /* while (rx->nfa_states->edges) */ - { - /* Iterate over the partial epsilon closures of rx->nfa_states */ - struct rx_possible_future * pf = rx->nfa_states->futures; - while (pf) - { - struct rx_possible_future * pft = pf; - pf = pf->next; - rx_free_possible_future (pft); - } - } - { - struct rx_nfa_state *n; - n = rx->nfa_states; - rx->nfa_states = rx->nfa_states->next; - rx_free_nfa_state (n); - } - } -} - - - -/* This page: translating a pattern expression into an nfa and doing the - * static part of the nfa->super-nfa translation. - */ - -/* This is the thompson regexp->nfa algorithm. - * It is modified to allow for `side-effect epsilons.' Those are - * edges that are taken whenever a similar epsilon edge would be, - * but which imply that some side effect occurs when the edge - * is taken. - * - * Side effects are used to model parts of the pattern langauge - * that are not regular (in the formal sense). - */ - -#ifdef __STDC__ -RX_DECL int -rx_build_nfa (struct rx *rx, - struct rexp_node *rexp, - struct rx_nfa_state **start, - struct rx_nfa_state **end) -#else -RX_DECL int -rx_build_nfa (rx, rexp, start, end) - struct rx *rx; - struct rexp_node *rexp; - struct rx_nfa_state **start; - struct rx_nfa_state **end; -#endif -{ - struct rx_nfa_edge *edge; - - /* Start & end nodes may have been allocated by the caller. */ - *start = *start ? *start : rx_nfa_state (rx); - - if (!*start) - return 0; - - if (!rexp) - { - *end = *start; - return 1; - } - - *end = *end ? *end : rx_nfa_state (rx); - - if (!*end) - { - rx_free_nfa_state (*start); - return 0; - } - - switch (rexp->type) - { - case r_data: - return 0; - - case r_cset: - edge = rx_nfa_edge (rx, ne_cset, *start, *end); - if (!edge) - return 0; - edge->params.cset = rx_copy_cset (rx, rexp->params.cset); - if (!edge->params.cset) - { - rx_free_nfa_edge (edge); - return 0; - } - return 1; - - case r_opt: - return (rx_build_nfa (rx, rexp->params.pair.left, start, end) - && rx_nfa_edge (rx, ne_epsilon, *start, *end)); - - case r_star: - { - struct rx_nfa_state * star_start = 0; - struct rx_nfa_state * star_end = 0; - return (rx_build_nfa (rx, rexp->params.pair.left, - &star_start, &star_end) - && star_start - && star_end - && rx_nfa_edge (rx, ne_epsilon, star_start, star_end) - && rx_nfa_edge (rx, ne_epsilon, *start, star_start) - && rx_nfa_edge (rx, ne_epsilon, star_end, *end) - - && rx_nfa_edge (rx, ne_epsilon, star_end, star_start)); - } - - case r_2phase_star: - { - struct rx_nfa_state * star_start = 0; - struct rx_nfa_state * star_end = 0; - struct rx_nfa_state * loop_exp_start = 0; - struct rx_nfa_state * loop_exp_end = 0; - - return (rx_build_nfa (rx, rexp->params.pair.left, - &star_start, &star_end) - && rx_build_nfa (rx, rexp->params.pair.right, - &loop_exp_start, &loop_exp_end) - && star_start - && star_end - && loop_exp_end - && loop_exp_start - && rx_nfa_edge (rx, ne_epsilon, star_start, *end) - && rx_nfa_edge (rx, ne_epsilon, *start, star_start) - && rx_nfa_edge (rx, ne_epsilon, star_end, *end) - - && rx_nfa_edge (rx, ne_epsilon, star_end, loop_exp_start) - && rx_nfa_edge (rx, ne_epsilon, loop_exp_end, star_start)); - } - - - case r_concat: - { - struct rx_nfa_state *shared = 0; - return - (rx_build_nfa (rx, rexp->params.pair.left, start, &shared) - && rx_build_nfa (rx, rexp->params.pair.right, &shared, end)); - } - - case r_alternate: - { - struct rx_nfa_state *ls = 0; - struct rx_nfa_state *le = 0; - struct rx_nfa_state *rs = 0; - struct rx_nfa_state *re = 0; - return (rx_build_nfa (rx, rexp->params.pair.left, &ls, &le) - && rx_build_nfa (rx, rexp->params.pair.right, &rs, &re) - && rx_nfa_edge (rx, ne_epsilon, *start, ls) - && rx_nfa_edge (rx, ne_epsilon, *start, rs) - && rx_nfa_edge (rx, ne_epsilon, le, *end) - && rx_nfa_edge (rx, ne_epsilon, re, *end)); - } - - case r_side_effect: - edge = rx_nfa_edge (rx, ne_side_effect, *start, *end); - if (!edge) - return 0; - edge->params.side_effect = rexp->params.side_effect; - return 1; - } - - /* this should never happen */ - return 0; -} - - -/* RX_NAME_NFA_STATES identifies all nodes with outgoing non-epsilon - * transitions. Only these nodes can occur in super-states. - * All nodes are given an integer id. - * The id is non-negative if the node has non-epsilon out-transitions, negative - * otherwise (this is because we want the non-negative ids to be used as - * array indexes in a few places). - */ - -#ifdef __STDC__ -RX_DECL void -rx_name_nfa_states (struct rx *rx) -#else -RX_DECL void -rx_name_nfa_states (rx) - struct rx *rx; -#endif -{ - struct rx_nfa_state *n = rx->nfa_states; - - rx->nodec = 0; - rx->epsnodec = -1; - - while (n) - { - struct rx_nfa_edge *e = n->edges; - - if (n->is_start) - n->eclosure_needed = 1; - - while (e) - { - switch (e->type) - { - case ne_epsilon: - case ne_side_effect: - break; - - case ne_cset: - n->id = rx->nodec++; - { - struct rx_nfa_edge *from_n = n->edges; - while (from_n) - { - from_n->dest->eclosure_needed = 1; - from_n = from_n->next; - } - } - goto cont; - } - e = e->next; - } - n->id = rx->epsnodec--; - cont: - n = n->next; - } - rx->epsnodec = -rx->epsnodec; -} - - -/* This page: data structures for the static part of the nfa->supernfa - * translation. - * - * There are side effect lists -- lists of side effects occuring - * along an uninterrupted, acyclic path of side-effect epsilon edges. - * Such paths are collapsed to single edges in the course of computing - * epsilon closures. Such single edges are labled with a list of all - * the side effects entailed in crossing them. Like lists of side - * effects are made == by the constructors below. - * - * There are also nfa state sets. These are used to hold a list of all - * states reachable from a starting state for a given type of transition - * and side effect list. These are also hash-consed. - */ - -/* The next several functions compare, construct, etc. lists of side - * effects. See ECLOSE_NFA (below) for details. - */ - -/* Ordering of rx_se_list - * (-1, 0, 1 return value convention). - */ - -#ifdef __STDC__ -static int -se_list_cmp (void * va, void * vb) -#else -static int -se_list_cmp (va, vb) - void * va; - void * vb; -#endif -{ - struct rx_se_list * a = (struct rx_se_list *)va; - struct rx_se_list * b = (struct rx_se_list *)vb; - - return ((va == vb) - ? 0 - : (!va - ? -1 - : (!vb - ? 1 - : ((long)a->car < (long)b->car - ? 1 - : ((long)a->car > (long)b->car - ? -1 - : se_list_cmp ((void *)a->cdr, (void *)b->cdr)))))); -} - - -#ifdef __STDC__ -static int -se_list_equal (void * va, void * vb) -#else -static int -se_list_equal (va, vb) - void * va; - void * vb; -#endif -{ - return !(se_list_cmp (va, vb)); -} - -static struct rx_hash_rules se_list_hash_rules = -{ - se_list_equal, - compiler_hash_alloc, - compiler_free_hash, - compiler_hash_item_alloc, - compiler_free_hash_item -}; - - -#ifdef __STDC__ -static struct rx_se_list * -side_effect_cons (struct rx * rx, - void * se, struct rx_se_list * list) -#else -static struct rx_se_list * -side_effect_cons (rx, se, list) - struct rx * rx; - void * se; - struct rx_se_list * list; -#endif -{ - struct rx_se_list * l; - l = ((struct rx_se_list *) malloc (sizeof (*l))); - if (!l) - return 0; - l->car = se; - l->cdr = list; - return l; -} - - -#ifdef __STDC__ -static struct rx_se_list * -hash_cons_se_prog (struct rx * rx, - struct rx_hash * memo, - void * car, struct rx_se_list * cdr) -#else -static struct rx_se_list * -hash_cons_se_prog (rx, memo, car, cdr) - struct rx * rx; - struct rx_hash * memo; - void * car; - struct rx_se_list * cdr; -#endif -{ - long hash = (long)car ^ (long)cdr; - struct rx_se_list template; - - template.car = car; - template.cdr = cdr; - { - struct rx_hash_item * it = rx_hash_store (memo, hash, - (void *)&template, - &se_list_hash_rules); - if (!it) - return 0; - if (it->data == (void *)&template) - { - struct rx_se_list * consed; - consed = (struct rx_se_list *) malloc (sizeof (*consed)); - *consed = template; - it->data = (void *)consed; - } - return (struct rx_se_list *)it->data; - } -} - - -#ifdef __STDC__ -static struct rx_se_list * -hash_se_prog (struct rx * rx, struct rx_hash * memo, struct rx_se_list * prog) -#else -static struct rx_se_list * -hash_se_prog (rx, memo, prog) - struct rx * rx; - struct rx_hash * memo; - struct rx_se_list * prog; -#endif -{ - struct rx_se_list * answer = 0; - while (prog) - { - answer = hash_cons_se_prog (rx, memo, prog->car, answer); - if (!answer) - return 0; - prog = prog->cdr; - } - return answer; -} - -#ifdef __STDC__ -static int -nfa_set_cmp (void * va, void * vb) -#else -static int -nfa_set_cmp (va, vb) - void * va; - void * vb; -#endif -{ - struct rx_nfa_state_set * a = (struct rx_nfa_state_set *)va; - struct rx_nfa_state_set * b = (struct rx_nfa_state_set *)vb; - - return ((va == vb) - ? 0 - : (!va - ? -1 - : (!vb - ? 1 - : (a->car->id < b->car->id - ? 1 - : (a->car->id > b->car->id - ? -1 - : nfa_set_cmp ((void *)a->cdr, (void *)b->cdr)))))); -} - -#ifdef __STDC__ -static int -nfa_set_equal (void * va, void * vb) -#else -static int -nfa_set_equal (va, vb) - void * va; - void * vb; -#endif -{ - return !nfa_set_cmp (va, vb); -} - -static struct rx_hash_rules nfa_set_hash_rules = -{ - nfa_set_equal, - compiler_hash_alloc, - compiler_free_hash, - compiler_hash_item_alloc, - compiler_free_hash_item -}; - - -#ifdef __STDC__ -static struct rx_nfa_state_set * -nfa_set_cons (struct rx * rx, - struct rx_hash * memo, struct rx_nfa_state * state, - struct rx_nfa_state_set * set) -#else -static struct rx_nfa_state_set * -nfa_set_cons (rx, memo, state, set) - struct rx * rx; - struct rx_hash * memo; - struct rx_nfa_state * state; - struct rx_nfa_state_set * set; -#endif -{ - struct rx_nfa_state_set template; - struct rx_hash_item * node; - template.car = state; - template.cdr = set; - node = rx_hash_store (memo, - (((long)state) >> 8) ^ (long)set, - &template, &nfa_set_hash_rules); - if (!node) - return 0; - if (node->data == &template) - { - struct rx_nfa_state_set * l; - l = (struct rx_nfa_state_set *) malloc (sizeof (*l)); - node->data = (void *) l; - if (!l) - return 0; - *l = template; - } - return (struct rx_nfa_state_set *)node->data; -} - - -#ifdef __STDC__ -static struct rx_nfa_state_set * -nfa_set_enjoin (struct rx * rx, - struct rx_hash * memo, struct rx_nfa_state * state, - struct rx_nfa_state_set * set) -#else -static struct rx_nfa_state_set * -nfa_set_enjoin (rx, memo, state, set) - struct rx * rx; - struct rx_hash * memo; - struct rx_nfa_state * state; - struct rx_nfa_state_set * set; -#endif -{ - if (!set || state->id < set->car->id) - return nfa_set_cons (rx, memo, state, set); - if (state->id == set->car->id) - return set; - else - { - struct rx_nfa_state_set * newcdr - = nfa_set_enjoin (rx, memo, state, set->cdr); - if (newcdr != set->cdr) - set = nfa_set_cons (rx, memo, set->car, newcdr); - return set; - } -} - - - -/* This page: computing epsilon closures. The closures aren't total. - * Each node's closures are partitioned according to the side effects entailed - * along the epsilon edges. Return true on success. - */ - -struct eclose_frame -{ - struct rx_se_list *prog_backwards; -}; - - -#ifdef __STDC__ -static int -eclose_node (struct rx *rx, struct rx_nfa_state *outnode, - struct rx_nfa_state *node, struct eclose_frame *frame) -#else -static int -eclose_node (rx, outnode, node, frame) - struct rx *rx; - struct rx_nfa_state *outnode; - struct rx_nfa_state *node; - struct eclose_frame *frame; -#endif -{ - struct rx_nfa_edge *e = node->edges; - - /* For each node, we follow all epsilon paths to build the closure. - * The closure omits nodes that have only epsilon edges. - * The closure is split into partial closures -- all the states in - * a partial closure are reached by crossing the same list of - * of side effects (though not necessarily the same path). - */ - if (node->mark) - return 1; - node->mark = 1; - - if (node->id >= 0 || node->is_final) - { - struct rx_possible_future **ec; - struct rx_se_list * prog_in_order - = ((struct rx_se_list *)hash_se_prog (rx, - &rx->se_list_memo, - frame->prog_backwards)); - int cmp; - - ec = &outnode->futures; - - while (*ec) - { - cmp = se_list_cmp ((void *)(*ec)->effects, (void *)prog_in_order); - if (cmp <= 0) - break; - ec = &(*ec)->next; - } - if (!*ec || (cmp < 0)) - { - struct rx_possible_future * saved = *ec; - *ec = rx_possible_future (rx, prog_in_order); - (*ec)->next = saved; - if (!*ec) - return 0; - } - if (node->id >= 0) - { - (*ec)->destset = nfa_set_enjoin (rx, &rx->set_list_memo, - node, (*ec)->destset); - if (!(*ec)->destset) - return 0; - } - } - - while (e) - { - switch (e->type) - { - case ne_epsilon: - if (!eclose_node (rx, outnode, e->dest, frame)) - return 0; - break; - case ne_side_effect: - { - frame->prog_backwards = side_effect_cons (rx, - e->params.side_effect, - frame->prog_backwards); - if (!frame->prog_backwards) - return 0; - if (!eclose_node (rx, outnode, e->dest, frame)) - return 0; - { - struct rx_se_list * dying = frame->prog_backwards; - frame->prog_backwards = frame->prog_backwards->cdr; - free ((char *)dying); - } - break; - } - default: - break; - } - e = e->next; - } - node->mark = 0; - return 1; -} - - -#ifdef __STDC__ -RX_DECL int -rx_eclose_nfa (struct rx *rx) -#else -RX_DECL int -rx_eclose_nfa (rx) - struct rx *rx; -#endif -{ - struct rx_nfa_state *n = rx->nfa_states; - struct eclose_frame frame; - static int rx_id = 0; - - frame.prog_backwards = 0; - rx->rx_id = rx_id++; - bzero (&rx->se_list_memo, sizeof (rx->se_list_memo)); - bzero (&rx->set_list_memo, sizeof (rx->set_list_memo)); - while (n) - { - n->futures = 0; - if (n->eclosure_needed && !eclose_node (rx, n, n, &frame)) - return 0; - /* clear_marks (rx); */ - n = n->next; - } - return 1; -} - - -/* This deletes epsilon edges from an NFA. After running eclose_node, - * we have no more need for these edges. They are removed to simplify - * further operations on the NFA. - */ - -#ifdef __STDC__ -RX_DECL void -rx_delete_epsilon_transitions (struct rx *rx) -#else -RX_DECL void -rx_delete_epsilon_transitions (rx) - struct rx *rx; -#endif -{ - struct rx_nfa_state *n = rx->nfa_states; - struct rx_nfa_edge **e; - - while (n) - { - e = &n->edges; - while (*e) - { - struct rx_nfa_edge *t; - switch ((*e)->type) - { - case ne_epsilon: - case ne_side_effect: - t = *e; - *e = t->next; - rx_free_nfa_edge (t); - break; - - default: - e = &(*e)->next; - break; - } - } - n = n->next; - } -} - - -/* This page: storing the nfa in a contiguous region of memory for - * subsequent conversion to a super-nfa. - */ - -/* This is for qsort on an array of nfa_states. The order - * is based on state ids and goes - * [0...MAX][MIN..-1] where (MAX>=0) and (MIN<0) - * This way, positive ids double as array indices. - */ - -#ifdef __STDC__ -static int -nfacmp (void * va, void * vb) -#else -static int -nfacmp (va, vb) - void * va; - void * vb; -#endif -{ - struct rx_nfa_state **a = (struct rx_nfa_state **)va; - struct rx_nfa_state **b = (struct rx_nfa_state **)vb; - return (*a == *b /* &&&& 3.18 */ - ? 0 - : (((*a)->id < 0) == ((*b)->id < 0) - ? (((*a)->id < (*b)->id) ? -1 : 1) - : (((*a)->id < 0) - ? 1 : -1))); -} - -#ifdef __STDC__ -static int -count_hash_nodes (struct rx_hash * st) -#else -static int -count_hash_nodes (st) - struct rx_hash * st; -#endif -{ - int x; - int count = 0; - for (x = 0; x < 13; ++x) - count += ((st->children[x]) - ? count_hash_nodes (st->children[x]) - : st->bucket_size[x]); - - return count; -} - - -#ifdef __STDC__ -static void -se_memo_freer (struct rx_hash_item * node) -#else -static void -se_memo_freer (node) - struct rx_hash_item * node; -#endif -{ - free ((char *)node->data); -} - - -#ifdef __STDC__ -static void -nfa_set_freer (struct rx_hash_item * node) -#else -static void -nfa_set_freer (node) - struct rx_hash_item * node; -#endif -{ - free ((char *)node->data); -} - - -/* This copies an entire NFA into a single malloced block of memory. - * Mostly this is for compatability with regex.c, though it is convenient - * to have the nfa nodes in an array. - */ - -#ifdef __STDC__ -RX_DECL int -rx_compactify_nfa (struct rx *rx, - void **mem, unsigned long *size) -#else -RX_DECL int -rx_compactify_nfa (rx, mem, size) - struct rx *rx; - void **mem; - unsigned long *size; -#endif -{ - int total_nodec; - struct rx_nfa_state *n; - int edgec = 0; - int eclosec = 0; - int se_list_consc = count_hash_nodes (&rx->se_list_memo); - int nfa_setc = count_hash_nodes (&rx->set_list_memo); - unsigned long total_size; - - /* This takes place in two stages. First, the total size of the - * nfa is computed, then structures are copied. - */ - n = rx->nfa_states; - total_nodec = 0; - while (n) - { - struct rx_nfa_edge *e = n->edges; - struct rx_possible_future *ec = n->futures; - ++total_nodec; - while (e) - { - ++edgec; - e = e->next; - } - while (ec) - { - ++eclosec; - ec = ec->next; - } - n = n->next; - } - - total_size = (total_nodec * sizeof (struct rx_nfa_state) - + edgec * rx_sizeof_bitset (rx->local_cset_size) - + edgec * sizeof (struct rx_nfa_edge) - + nfa_setc * sizeof (struct rx_nfa_state_set) - + eclosec * sizeof (struct rx_possible_future) - + se_list_consc * sizeof (struct rx_se_list) - + rx->reserved); - - if (total_size > *size) - { - *mem = remalloc (*mem, total_size); - if (*mem) - *size = total_size; - else - return 0; - } - /* Now we've allocated the memory; this copies the NFA. */ - { - static struct rx_nfa_state **scratch = 0; - static int scratch_alloc = 0; - struct rx_nfa_state *state_base = (struct rx_nfa_state *) * mem; - struct rx_nfa_state *new_state = state_base; - struct rx_nfa_edge *new_edge = - (struct rx_nfa_edge *) - ((char *) state_base + total_nodec * sizeof (struct rx_nfa_state)); - struct rx_se_list * new_se_list = - (struct rx_se_list *) - ((char *)new_edge + edgec * sizeof (struct rx_nfa_edge)); - struct rx_possible_future *new_close = - ((struct rx_possible_future *) - ((char *) new_se_list - + se_list_consc * sizeof (struct rx_se_list))); - struct rx_nfa_state_set * new_nfa_set = - ((struct rx_nfa_state_set *) - ((char *)new_close + eclosec * sizeof (struct rx_possible_future))); - char *new_bitset = - ((char *) new_nfa_set + nfa_setc * sizeof (struct rx_nfa_state_set)); - int x; - struct rx_nfa_state *n; - - if (scratch_alloc < total_nodec) - { - scratch = ((struct rx_nfa_state **) - remalloc (scratch, total_nodec * sizeof (*scratch))); - if (scratch) - scratch_alloc = total_nodec; - else - { - scratch_alloc = 0; - return 0; - } - } - - for (x = 0, n = rx->nfa_states; n; n = n->next) - scratch[x++] = n; - - qsort (scratch, total_nodec, - sizeof (struct rx_nfa_state *), (int (*)())nfacmp); - - for (x = 0; x < total_nodec; ++x) - { - struct rx_possible_future *eclose = scratch[x]->futures; - struct rx_nfa_edge *edge = scratch[x]->edges; - struct rx_nfa_state *cn = new_state++; - cn->futures = 0; - cn->edges = 0; - cn->next = (x == total_nodec - 1) ? 0 : (cn + 1); - cn->id = scratch[x]->id; - cn->is_final = scratch[x]->is_final; - cn->is_start = scratch[x]->is_start; - cn->mark = 0; - while (edge) - { - int indx = (edge->dest->id < 0 - ? (total_nodec + edge->dest->id) - : edge->dest->id); - struct rx_nfa_edge *e = new_edge++; - rx_Bitset cset = (rx_Bitset) new_bitset; - new_bitset += rx_sizeof_bitset (rx->local_cset_size); - rx_bitset_null (rx->local_cset_size, cset); - rx_bitset_union (rx->local_cset_size, cset, edge->params.cset); - e->next = cn->edges; - cn->edges = e; - e->type = edge->type; - e->dest = state_base + indx; - e->params.cset = cset; - edge = edge->next; - } - while (eclose) - { - struct rx_possible_future *ec = new_close++; - struct rx_hash_item * sp; - struct rx_se_list ** sepos; - struct rx_se_list * sesrc; - struct rx_nfa_state_set * destlst; - struct rx_nfa_state_set ** destpos; - ec->next = cn->futures; - cn->futures = ec; - for (sepos = &ec->effects, sesrc = eclose->effects; - sesrc; - sesrc = sesrc->cdr, sepos = &(*sepos)->cdr) - { - sp = rx_hash_find (&rx->se_list_memo, - (long)sesrc->car ^ (long)sesrc->cdr, - sesrc, &se_list_hash_rules); - if (sp->binding) - { - sesrc = (struct rx_se_list *)sp->binding; - break; - } - *new_se_list = *sesrc; - sp->binding = (void *)new_se_list; - *sepos = new_se_list; - ++new_se_list; - } - *sepos = sesrc; - for (destpos = &ec->destset, destlst = eclose->destset; - destlst; - destpos = &(*destpos)->cdr, destlst = destlst->cdr) - { - sp = rx_hash_find (&rx->set_list_memo, - ((((long)destlst->car) >> 8) - ^ (long)destlst->cdr), - destlst, &nfa_set_hash_rules); - if (sp->binding) - { - destlst = (struct rx_nfa_state_set *)sp->binding; - break; - } - *new_nfa_set = *destlst; - new_nfa_set->car = state_base + destlst->car->id; - sp->binding = (void *)new_nfa_set; - *destpos = new_nfa_set; - ++new_nfa_set; - } - *destpos = destlst; - eclose = eclose->next; - } - } - } - rx_free_hash_table (&rx->se_list_memo, se_memo_freer, &se_list_hash_rules); - bzero (&rx->se_list_memo, sizeof (rx->se_list_memo)); - rx_free_hash_table (&rx->set_list_memo, nfa_set_freer, &nfa_set_hash_rules); - bzero (&rx->set_list_memo, sizeof (rx->set_list_memo)); - - rx_free_nfa (rx); - rx->nfa_states = (struct rx_nfa_state *)*mem; - return 1; -} - - -/* The functions in the next several pages define the lazy-NFA-conversion used - * by matchers. The input to this construction is an NFA such as - * is built by compactify_nfa (rx.c). The output is the superNFA. - */ - -/* Match engines can use arbitrary values for opcodes. So, the parse tree - * is built using instructions names (enum rx_opcode), but the superstate - * nfa is populated with mystery opcodes (void *). - * - * For convenience, here is an id table. The opcodes are == to their inxs - * - * The lables in re_search_2 would make good values for instructions. - */ - -void * rx_id_instruction_table[rx_num_instructions] = -{ - (void *) rx_backtrack_point, - (void *) rx_do_side_effects, - (void *) rx_cache_miss, - (void *) rx_next_char, - (void *) rx_backtrack, - (void *) rx_error_inx -}; - - - -/* Memory mgt. for superstate graphs. */ - -#ifdef __STDC__ -static char * -rx_cache_malloc (struct rx_cache * cache, int bytes) -#else -static char * -rx_cache_malloc (cache, bytes) - struct rx_cache * cache; - int bytes; -#endif -{ - while (cache->bytes_left < bytes) - { - if (cache->memory_pos) - cache->memory_pos = cache->memory_pos->next; - if (!cache->memory_pos) - { - cache->morecore (cache); - if (!cache->memory_pos) - return 0; - } - cache->bytes_left = cache->memory_pos->bytes; - cache->memory_addr = ((char *)cache->memory_pos - + sizeof (struct rx_blocklist)); - } - cache->bytes_left -= bytes; - { - char * addr = cache->memory_addr; - cache->memory_addr += bytes; - return addr; - } -} - -#ifdef __STDC__ -static void -rx_cache_free (struct rx_cache * cache, - struct rx_freelist ** freelist, char * mem) -#else -static void -rx_cache_free (cache, freelist, mem) - struct rx_cache * cache; - struct rx_freelist ** freelist; - char * mem; -#endif -{ - struct rx_freelist * it = (struct rx_freelist *)mem; - it->next = *freelist; - *freelist = it; -} - - -/* The partially instantiated superstate graph has a transition - * table at every node. There is one entry for every character. - * This fills in the transition for a set. - */ -#ifdef __STDC__ -static void -install_transition (struct rx_superstate *super, - struct rx_inx *answer, rx_Bitset trcset) -#else -static void -install_transition (super, answer, trcset) - struct rx_superstate *super; - struct rx_inx *answer; - rx_Bitset trcset; -#endif -{ - struct rx_inx * transitions = super->transitions; - int chr; - for (chr = 0; chr < 256; ) - if (!*trcset) - { - ++trcset; - chr += 32; - } - else - { - RX_subset sub = *trcset; - RX_subset mask = 1; - int bound = chr + 32; - while (chr < bound) - { - if (sub & mask) - transitions [chr] = *answer; - ++chr; - mask <<= 1; - } - ++trcset; - } -} - - -#ifdef __STDC__ -static int -qlen (struct rx_superstate * q) -#else -static int -qlen (q) - struct rx_superstate * q; -#endif -{ - int count = 1; - struct rx_superstate * it; - if (!q) - return 0; - for (it = q->next_recyclable; it != q; it = it->next_recyclable) - ++count; - return count; -} - -#ifdef __STDC__ -static void -check_cache (struct rx_cache * cache) -#else -static void -check_cache (cache) - struct rx_cache * cache; -#endif -{ - struct rx_cache * you_fucked_up = 0; - int total = cache->superstates; - int semi = cache->semifree_superstates; - if (semi != qlen (cache->semifree_superstate)) - check_cache (you_fucked_up); - if ((total - semi) != qlen (cache->lru_superstate)) - check_cache (you_fucked_up); -} - -/* When a superstate is old and neglected, it can enter a - * semi-free state. A semi-free state is slated to die. - * Incoming transitions to a semi-free state are re-written - * to cause an (interpreted) fault when they are taken. - * The fault handler revives the semi-free state, patches - * incoming transitions back to normal, and continues. - * - * The idea is basicly to free in two stages, aborting - * between the two if the state turns out to be useful again. - * When a free is aborted, the rescued superstate is placed - * in the most-favored slot to maximize the time until it - * is next semi-freed. - */ - -#ifdef __STDC__ -static void -semifree_superstate (struct rx_cache * cache) -#else -static void -semifree_superstate (cache) - struct rx_cache * cache; -#endif -{ - int disqualified = cache->semifree_superstates; - if (disqualified == cache->superstates) - return; - while (cache->lru_superstate->locks) - { - cache->lru_superstate = cache->lru_superstate->next_recyclable; - ++disqualified; - if (disqualified == cache->superstates) - return; - } - { - struct rx_superstate * it = cache->lru_superstate; - it->next_recyclable->prev_recyclable = it->prev_recyclable; - it->prev_recyclable->next_recyclable = it->next_recyclable; - cache->lru_superstate = (it == it->next_recyclable - ? 0 - : it->next_recyclable); - if (!cache->semifree_superstate) - { - cache->semifree_superstate = it; - it->next_recyclable = it; - it->prev_recyclable = it; - } - else - { - it->prev_recyclable = cache->semifree_superstate->prev_recyclable; - it->next_recyclable = cache->semifree_superstate; - it->prev_recyclable->next_recyclable = it; - it->next_recyclable->prev_recyclable = it; - } - { - struct rx_distinct_future *df; - it->is_semifree = 1; - ++cache->semifree_superstates; - df = it->transition_refs; - if (df) - { - df->prev_same_dest->next_same_dest = 0; - for (df = it->transition_refs; df; df = df->next_same_dest) - { - df->future_frame.inx = cache->instruction_table[rx_cache_miss]; - df->future_frame.data = 0; - df->future_frame.data_2 = (void *) df; - /* If there are any NEXT-CHAR instruction frames that - * refer to this state, we convert them to CACHE-MISS frames. - */ - if (!df->effects - && (df->edge->options->next_same_super_edge[0] - == df->edge->options)) - install_transition (df->present, &df->future_frame, - df->edge->cset); - } - df = it->transition_refs; - df->prev_same_dest->next_same_dest = df; - } - } - } -} - - -#ifdef __STDC__ -static void -refresh_semifree_superstate (struct rx_cache * cache, - struct rx_superstate * super) -#else -static void -refresh_semifree_superstate (cache, super) - struct rx_cache * cache; - struct rx_superstate * super; -#endif -{ - struct rx_distinct_future *df; - - if (super->transition_refs) - { - super->transition_refs->prev_same_dest->next_same_dest = 0; - for (df = super->transition_refs; df; df = df->next_same_dest) - { - df->future_frame.inx = cache->instruction_table[rx_next_char]; - df->future_frame.data = (void *) super->transitions; - /* CACHE-MISS instruction frames that refer to this state, - * must be converted to NEXT-CHAR frames. - */ - if (!df->effects - && (df->edge->options->next_same_super_edge[0] - == df->edge->options)) - install_transition (df->present, &df->future_frame, - df->edge->cset); - } - super->transition_refs->prev_same_dest->next_same_dest - = super->transition_refs; - } - if (cache->semifree_superstate == super) - cache->semifree_superstate = (super->prev_recyclable == super - ? 0 - : super->prev_recyclable); - super->next_recyclable->prev_recyclable = super->prev_recyclable; - super->prev_recyclable->next_recyclable = super->next_recyclable; - - if (!cache->lru_superstate) - (cache->lru_superstate - = super->next_recyclable - = super->prev_recyclable - = super); - else - { - super->next_recyclable = cache->lru_superstate; - super->prev_recyclable = cache->lru_superstate->prev_recyclable; - super->next_recyclable->prev_recyclable = super; - super->prev_recyclable->next_recyclable = super; - } - super->is_semifree = 0; - --cache->semifree_superstates; -} - -#ifdef __STDC__ -static void -rx_refresh_this_superstate (struct rx_cache * cache, struct rx_superstate * superstate) -#else -static void -rx_refresh_this_superstate (cache, superstate) - struct rx_cache * cache; - struct rx_superstate * superstate; -#endif -{ - if (superstate->is_semifree) - refresh_semifree_superstate (cache, superstate); - else if (cache->lru_superstate == superstate) - cache->lru_superstate = superstate->next_recyclable; - else if (superstate != cache->lru_superstate->prev_recyclable) - { - superstate->next_recyclable->prev_recyclable - = superstate->prev_recyclable; - superstate->prev_recyclable->next_recyclable - = superstate->next_recyclable; - superstate->next_recyclable = cache->lru_superstate; - superstate->prev_recyclable = cache->lru_superstate->prev_recyclable; - superstate->next_recyclable->prev_recyclable = superstate; - superstate->prev_recyclable->next_recyclable = superstate; - } -} - -#ifdef __STDC__ -static void -release_superset_low (struct rx_cache * cache, - struct rx_superset *set) -#else -static void -release_superset_low (cache, set) - struct rx_cache * cache; - struct rx_superset *set; -#endif -{ - if (!--set->refs) - { - if (set->cdr) - release_superset_low (cache, set->cdr); - - set->starts_for = 0; - - rx_hash_free - (rx_hash_find - (&cache->superset_table, - (unsigned long)set->car ^ set->id ^ (unsigned long)set->cdr, - (void *)set, - &cache->superset_hash_rules), - &cache->superset_hash_rules); - rx_cache_free (cache, &cache->free_supersets, (char *)set); - } -} - -#ifdef __STDC__ -RX_DECL void -rx_release_superset (struct rx *rx, - struct rx_superset *set) -#else -RX_DECL void -rx_release_superset (rx, set) - struct rx *rx; - struct rx_superset *set; -#endif -{ - release_superset_low (rx->cache, set); -} - -/* This tries to add a new superstate to the superstate freelist. - * It might, as a result, free some edge pieces or hash tables. - * If nothing can be freed because too many locks are being held, fail. - */ - -#ifdef __STDC__ -static int -rx_really_free_superstate (struct rx_cache * cache) -#else -static int -rx_really_free_superstate (cache) - struct rx_cache * cache; -#endif -{ - int locked_superstates = 0; - struct rx_superstate * it; - - if (!cache->superstates) - return 0; - - { - /* This is a total guess. The idea is that we should expect as - * many misses as we've recently experienced. I.e., cache->misses - * should be the same as cache->semifree_superstates. - */ - while ((cache->hits + cache->misses) > cache->superstates_allowed) - { - cache->hits >>= 1; - cache->misses >>= 1; - } - if ( ((cache->hits + cache->misses) * cache->semifree_superstates) - < (cache->superstates * cache->misses)) - { - semifree_superstate (cache); - semifree_superstate (cache); - } - } - - while (cache->semifree_superstate && cache->semifree_superstate->locks) - { - refresh_semifree_superstate (cache, cache->semifree_superstate); - ++locked_superstates; - if (locked_superstates == cache->superstates) - return 0; - } - - if (cache->semifree_superstate) - { - it = cache->semifree_superstate; - it->next_recyclable->prev_recyclable = it->prev_recyclable; - it->prev_recyclable->next_recyclable = it->next_recyclable; - cache->semifree_superstate = ((it == it->next_recyclable) - ? 0 - : it->next_recyclable); - --cache->semifree_superstates; - } - else - { - while (cache->lru_superstate->locks) - { - cache->lru_superstate = cache->lru_superstate->next_recyclable; - ++locked_superstates; - if (locked_superstates == cache->superstates) - return 0; - } - it = cache->lru_superstate; - it->next_recyclable->prev_recyclable = it->prev_recyclable; - it->prev_recyclable->next_recyclable = it->next_recyclable; - cache->lru_superstate = ((it == it->next_recyclable) - ? 0 - : it->next_recyclable); - } - - if (it->transition_refs) - { - struct rx_distinct_future *df; - for (df = it->transition_refs, - df->prev_same_dest->next_same_dest = 0; - df; - df = df->next_same_dest) - { - df->future_frame.inx = cache->instruction_table[rx_cache_miss]; - df->future_frame.data = 0; - df->future_frame.data_2 = (void *) df; - df->future = 0; - } - it->transition_refs->prev_same_dest->next_same_dest = - it->transition_refs; - } - { - struct rx_super_edge *tc = it->edges; - while (tc) - { - struct rx_distinct_future * df; - struct rx_super_edge *tct = tc->next; - df = tc->options; - df->next_same_super_edge[1]->next_same_super_edge[0] = 0; - while (df) - { - struct rx_distinct_future *dft = df; - df = df->next_same_super_edge[0]; - - - if (dft->future && dft->future->transition_refs == dft) - { - dft->future->transition_refs = dft->next_same_dest; - if (dft->future->transition_refs == dft) - dft->future->transition_refs = 0; - } - dft->next_same_dest->prev_same_dest = dft->prev_same_dest; - dft->prev_same_dest->next_same_dest = dft->next_same_dest; - rx_cache_free (cache, &cache->free_discernable_futures, - (char *)dft); - } - rx_cache_free (cache, &cache->free_transition_classes, (char *)tc); - tc = tct; - } - } - - if (it->contents->superstate == it) - it->contents->superstate = 0; - release_superset_low (cache, it->contents); - rx_cache_free (cache, &cache->free_superstates, (char *)it); - --cache->superstates; - return 1; -} - -#ifdef __STDC__ -static char * -rx_cache_get (struct rx_cache * cache, - struct rx_freelist ** freelist) -#else -static char * -rx_cache_get (cache, freelist) - struct rx_cache * cache; - struct rx_freelist ** freelist; -#endif -{ - while (!*freelist && rx_really_free_superstate (cache)) - ; - if (!*freelist) - return 0; - { - struct rx_freelist * it = *freelist; - *freelist = it->next; - return (char *)it; - } -} - -#ifdef __STDC__ -static char * -rx_cache_malloc_or_get (struct rx_cache * cache, - struct rx_freelist ** freelist, int bytes) -#else -static char * -rx_cache_malloc_or_get (cache, freelist, bytes) - struct rx_cache * cache; - struct rx_freelist ** freelist; - int bytes; -#endif -{ - if (!*freelist) - { - char * answer = rx_cache_malloc (cache, bytes); - if (answer) - return answer; - } - - return rx_cache_get (cache, freelist); -} - -#ifdef __STDC__ -static char * -rx_cache_get_superstate (struct rx_cache * cache) -#else -static char * -rx_cache_get_superstate (cache) - struct rx_cache * cache; -#endif -{ - char * answer; - int bytes = ( sizeof (struct rx_superstate) - + cache->local_cset_size * sizeof (struct rx_inx)); - if (!cache->free_superstates - && (cache->superstates < cache->superstates_allowed)) - { - answer = rx_cache_malloc (cache, bytes); - if (answer) - { - ++cache->superstates; - return answer; - } - } - answer = rx_cache_get (cache, &cache->free_superstates); - if (!answer) - { - answer = rx_cache_malloc (cache, bytes); - if (answer) - ++cache->superstates_allowed; - } - ++cache->superstates; - return answer; -} - - - -#ifdef __STDC__ -static int -supersetcmp (void * va, void * vb) -#else -static int -supersetcmp (va, vb) - void * va; - void * vb; -#endif -{ - struct rx_superset * a = (struct rx_superset *)va; - struct rx_superset * b = (struct rx_superset *)vb; - return ( (a == b) - || (a && b && (a->car == b->car) && (a->cdr == b->cdr))); -} - -#ifdef __STDC__ -static struct rx_hash_item * -superset_allocator (struct rx_hash_rules * rules, void * val) -#else -static struct rx_hash_item * -superset_allocator (rules, val) - struct rx_hash_rules * rules; - void * val; -#endif -{ - struct rx_cache * cache - = ((struct rx_cache *) - ((char *)rules - - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules))); - struct rx_superset * template = (struct rx_superset *)val; - struct rx_superset * newset - = ((struct rx_superset *) - rx_cache_malloc_or_get (cache, - &cache->free_supersets, - sizeof (*template))); - if (!newset) - return 0; - newset->refs = 0; - newset->car = template->car; - newset->id = template->car->id; - newset->cdr = template->cdr; - newset->superstate = 0; - rx_protect_superset (rx, template->cdr); - newset->hash_item.data = (void *)newset; - newset->hash_item.binding = 0; - return &newset->hash_item; -} - -#ifdef __STDC__ -static struct rx_hash * -super_hash_allocator (struct rx_hash_rules * rules) -#else -static struct rx_hash * -super_hash_allocator (rules) - struct rx_hash_rules * rules; -#endif -{ - struct rx_cache * cache - = ((struct rx_cache *) - ((char *)rules - - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules))); - return ((struct rx_hash *) - rx_cache_malloc_or_get (cache, - &cache->free_hash, sizeof (struct rx_hash))); -} - - -#ifdef __STDC__ -static void -super_hash_liberator (struct rx_hash * hash, struct rx_hash_rules * rules) -#else -static void -super_hash_liberator (hash, rules) - struct rx_hash * hash; - struct rx_hash_rules * rules; -#endif -{ - struct rx_cache * cache - = ((struct rx_cache *) - (char *)rules - (long)(&((struct rx_cache *)0)->superset_hash_rules)); - rx_cache_free (cache, &cache->free_hash, (char *)hash); -} - -#ifdef __STDC__ -static void -superset_hash_item_liberator (struct rx_hash_item * it, - struct rx_hash_rules * rules) -#else -static void -superset_hash_item_liberator (it, rules) /* Well, it does ya know. */ - struct rx_hash_item * it; - struct rx_hash_rules * rules; -#endif -{ -} - -int rx_cache_bound = 128; -static int rx_default_cache_got = 0; - -#ifdef __STDC__ -static int -bytes_for_cache_size (int supers, int cset_size) -#else -static int -bytes_for_cache_size (supers, cset_size) - int supers; - int cset_size; -#endif -{ - /* What the hell is this? !!!*/ - return (int) - ((float)supers * - ( (1.03 * (float) ( rx_sizeof_bitset (cset_size) - + sizeof (struct rx_super_edge))) - + (1.80 * (float) sizeof (struct rx_possible_future)) - + (float) ( sizeof (struct rx_superstate) - + cset_size * sizeof (struct rx_inx)))); -} - -#ifdef __STDC__ -static void -rx_morecore (struct rx_cache * cache) -#else -static void -rx_morecore (cache) - struct rx_cache * cache; -#endif -{ - if (rx_default_cache_got >= rx_cache_bound) - return; - - rx_default_cache_got += 16; - cache->superstates_allowed = rx_cache_bound; - { - struct rx_blocklist ** pos = &cache->memory; - int size = bytes_for_cache_size (16, cache->local_cset_size); - while (*pos) - pos = &(*pos)->next; - *pos = ((struct rx_blocklist *) - malloc (size + sizeof (struct rx_blocklist))); - if (!*pos) - return; - - (*pos)->next = 0; - (*pos)->bytes = size; - cache->memory_pos = *pos; - cache->memory_addr = (char *)*pos + sizeof (**pos); - cache->bytes_left = size; - } -} - -static struct rx_cache default_cache = -{ - { - supersetcmp, - super_hash_allocator, - super_hash_liberator, - superset_allocator, - superset_hash_item_liberator, - }, - 0, - 0, - 0, - 0, - rx_morecore, - - 0, - 0, - 0, - 0, - 0, - - 0, - 0, - - 0, - - 0, - 0, - 0, - 0, - 128, - - 256, - rx_id_instruction_table, - - { - 0, - 0, - {0}, - {0}, - {0} - } -}; - -/* This adds an element to a superstate set. These sets are lists, such - * that lists with == elements are ==. The empty set is returned by - * superset_cons (rx, 0, 0) and is NOT equivelent to - * (struct rx_superset)0. - */ - -#ifdef __STDC__ -RX_DECL struct rx_superset * -rx_superset_cons (struct rx * rx, - struct rx_nfa_state *car, struct rx_superset *cdr) -#else -RX_DECL struct rx_superset * -rx_superset_cons (rx, car, cdr) - struct rx * rx; - struct rx_nfa_state *car; - struct rx_superset *cdr; -#endif -{ - struct rx_cache * cache = rx->cache; - if (!car && !cdr) - { - if (!cache->empty_superset) - { - cache->empty_superset - = ((struct rx_superset *) - rx_cache_malloc_or_get (cache, &cache->free_supersets, - sizeof (struct rx_superset))); - if (!cache->empty_superset) - return 0; - bzero (cache->empty_superset, sizeof (struct rx_superset)); - cache->empty_superset->refs = 1000; - } - return cache->empty_superset; - } - { - struct rx_superset template; - struct rx_hash_item * hit; - template.car = car; - template.cdr = cdr; - template.id = car->id; - hit = rx_hash_store (&cache->superset_table, - (unsigned long)car ^ car->id ^ (unsigned long)cdr, - (void *)&template, - &cache->superset_hash_rules); - return (hit - ? (struct rx_superset *)hit->data - : 0); - } -} - -/* This computes a union of two NFA state sets. The sets do not have the - * same representation though. One is a RX_SUPERSET structure (part - * of the superstate NFA) and the other is an NFA_STATE_SET (part of the NFA). - */ - -#ifdef __STDC__ -RX_DECL struct rx_superset * -rx_superstate_eclosure_union - (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl) -#else -RX_DECL struct rx_superset * -rx_superstate_eclosure_union (rx, set, ecl) - struct rx * rx; - struct rx_superset *set; - struct rx_nfa_state_set *ecl; -#endif -{ - if (!ecl) - return set; - - if (!set->car) - return rx_superset_cons (rx, ecl->car, - rx_superstate_eclosure_union (rx, set, ecl->cdr)); - if (set->car == ecl->car) - return rx_superstate_eclosure_union (rx, set, ecl->cdr); - - { - struct rx_superset * tail; - struct rx_nfa_state * first; - - if (set->car > ecl->car) - { - tail = rx_superstate_eclosure_union (rx, set->cdr, ecl); - first = set->car; - } - else - { - tail = rx_superstate_eclosure_union (rx, set, ecl->cdr); - first = ecl->car; - } - if (!tail) - return 0; - else - { - struct rx_superset * answer; - answer = rx_superset_cons (rx, first, tail); - if (!answer) - { - rx_protect_superset (rx, tail); - rx_release_superset (rx, tail); - return 0; - } - else - return answer; - } - } -} - - - - -/* - * This makes sure that a list of rx_distinct_futures contains - * a future for each possible set of side effects in the eclosure - * of a given state. This is some of the work of filling in a - * superstate transition. - */ - -#ifdef __STDC__ -static struct rx_distinct_future * -include_futures (struct rx *rx, - struct rx_distinct_future *df, struct rx_nfa_state - *state, struct rx_superstate *superstate) -#else -static struct rx_distinct_future * -include_futures (rx, df, state, superstate) - struct rx *rx; - struct rx_distinct_future *df; - struct rx_nfa_state *state; - struct rx_superstate *superstate; -#endif -{ - struct rx_possible_future *future; - struct rx_cache * cache = rx->cache; - for (future = state->futures; future; future = future->next) - { - struct rx_distinct_future *dfp; - struct rx_distinct_future *insert_before = 0; - if (df) - df->next_same_super_edge[1]->next_same_super_edge[0] = 0; - for (dfp = df; dfp; dfp = dfp->next_same_super_edge[0]) - if (dfp->effects == future->effects) - break; - else - { - int order = rx->se_list_cmp (rx, dfp->effects, future->effects); - if (order > 0) - { - insert_before = dfp; - dfp = 0; - break; - } - } - if (df) - df->next_same_super_edge[1]->next_same_super_edge[0] = df; - if (!dfp) - { - dfp - = ((struct rx_distinct_future *) - rx_cache_malloc_or_get (cache, &cache->free_discernable_futures, - sizeof (struct rx_distinct_future))); - if (!dfp) - return 0; - if (!df) - { - df = insert_before = dfp; - df->next_same_super_edge[0] = df->next_same_super_edge[1] = df; - } - else if (!insert_before) - insert_before = df; - else if (insert_before == df) - df = dfp; - - dfp->next_same_super_edge[0] = insert_before; - dfp->next_same_super_edge[1] - = insert_before->next_same_super_edge[1]; - dfp->next_same_super_edge[1]->next_same_super_edge[0] = dfp; - dfp->next_same_super_edge[0]->next_same_super_edge[1] = dfp; - dfp->next_same_dest = dfp->prev_same_dest = dfp; - dfp->future = 0; - dfp->present = superstate; - dfp->future_frame.inx = rx->instruction_table[rx_cache_miss]; - dfp->future_frame.data = 0; - dfp->future_frame.data_2 = (void *) dfp; - dfp->side_effects_frame.inx - = rx->instruction_table[rx_do_side_effects]; - dfp->side_effects_frame.data = 0; - dfp->side_effects_frame.data_2 = (void *) dfp; - dfp->effects = future->effects; - } - } - return df; -} - - - -/* This constructs a new superstate from its state set. The only - * complexity here is memory management. - */ -#ifdef __STDC__ -RX_DECL struct rx_superstate * -rx_superstate (struct rx *rx, - struct rx_superset *set) -#else -RX_DECL struct rx_superstate * -rx_superstate (rx, set) - struct rx *rx; - struct rx_superset *set; -#endif -{ - struct rx_cache * cache = rx->cache; - struct rx_superstate * superstate = 0; - - /* Does the superstate already exist in the cache? */ - if (set->superstate) - { - if (set->superstate->rx_id != rx->rx_id) - { - /* Aha. It is in the cache, but belongs to a superstate - * that refers to an NFA that no longer exists. - * (We know it no longer exists because it was evidently - * stored in the same region of memory as the current nfa - * yet it has a different id.) - */ - superstate = set->superstate; - if (!superstate->is_semifree) - { - if (cache->lru_superstate == superstate) - { - cache->lru_superstate = superstate->next_recyclable; - if (cache->lru_superstate == superstate) - cache->lru_superstate = 0; - } - { - superstate->next_recyclable->prev_recyclable - = superstate->prev_recyclable; - superstate->prev_recyclable->next_recyclable - = superstate->next_recyclable; - if (!cache->semifree_superstate) - { - (cache->semifree_superstate - = superstate->next_recyclable - = superstate->prev_recyclable - = superstate); - } - else - { - superstate->next_recyclable = cache->semifree_superstate; - superstate->prev_recyclable - = cache->semifree_superstate->prev_recyclable; - superstate->next_recyclable->prev_recyclable - = superstate; - superstate->prev_recyclable->next_recyclable - = superstate; - cache->semifree_superstate = superstate; - } - ++cache->semifree_superstates; - } - } - set->superstate = 0; - goto handle_cache_miss; - } - ++cache->hits; - superstate = set->superstate; - - rx_refresh_this_superstate (cache, superstate); - return superstate; - } - - handle_cache_miss: - - /* This point reached only for cache misses. */ - ++cache->misses; -#if RX_DEBUG - if (rx_debug_trace > 1) - { - struct rx_superset * setp = set; - fprintf (stderr, "Building a superstet %d(%d): ", rx->rx_id, set); - while (setp) - { - fprintf (stderr, "%d ", setp->id); - setp = setp->cdr; - } - fprintf (stderr, "(%d)\n", set); - } -#endif - superstate = (struct rx_superstate *)rx_cache_get_superstate (cache); - if (!superstate) - return 0; - - if (!cache->lru_superstate) - (cache->lru_superstate - = superstate->next_recyclable - = superstate->prev_recyclable - = superstate); - else - { - superstate->next_recyclable = cache->lru_superstate; - superstate->prev_recyclable = cache->lru_superstate->prev_recyclable; - ( superstate->prev_recyclable->next_recyclable - = superstate->next_recyclable->prev_recyclable - = superstate); - } - superstate->rx_id = rx->rx_id; - superstate->transition_refs = 0; - superstate->locks = 0; - superstate->is_semifree = 0; - set->superstate = superstate; - superstate->contents = set; - rx_protect_superset (rx, set); - superstate->edges = 0; - { - int x; - /* None of the transitions from this superstate are known yet. */ - for (x = 0; x < rx->local_cset_size; ++x) /* &&&&& 3.8 % */ - { - struct rx_inx * ifr = &superstate->transitions[x]; - ifr->inx = rx->instruction_table [rx_cache_miss]; - ifr->data = ifr->data_2 = 0; - } - } - return superstate; -} - - -/* This computes the destination set of one edge of the superstate NFA. - * Note that a RX_DISTINCT_FUTURE is a superstate edge. - * Returns 0 on an allocation failure. - */ - -#ifdef __STDC__ -static int -solve_destination (struct rx *rx, struct rx_distinct_future *df) -#else -static int -solve_destination (rx, df) - struct rx *rx; - struct rx_distinct_future *df; -#endif -{ - struct rx_super_edge *tc = df->edge; - struct rx_superset *nfa_state; - struct rx_superset *nil_set = rx_superset_cons (rx, 0, 0); - struct rx_superset *solution = nil_set; - struct rx_superstate *dest; - - rx_protect_superset (rx, solution); - /* Iterate over all NFA states in the state set of this superstate. */ - for (nfa_state = df->present->contents; - nfa_state->car; - nfa_state = nfa_state->cdr) - { - struct rx_nfa_edge *e; - /* Iterate over all edges of each NFA state. */ - for (e = nfa_state->car->edges; e; e = e->next) - /* If we find an edge that is labeled with - * the characters we are solving for..... - */ - if (rx_bitset_is_subset (rx->local_cset_size, - tc->cset, e->params.cset)) - { - struct rx_nfa_state *n = e->dest; - struct rx_possible_future *pf; - /* ....search the partial epsilon closures of the destination - * of that edge for a path that involves the same set of - * side effects we are solving for. - * If we find such a RX_POSSIBLE_FUTURE, we add members to the - * stateset we are computing. - */ - for (pf = n->futures; pf; pf = pf->next) - if (pf->effects == df->effects) - { - struct rx_superset * old_sol; - old_sol = solution; - solution = rx_superstate_eclosure_union (rx, solution, - pf->destset); - if (!solution) - return 0; - rx_protect_superset (rx, solution); - rx_release_superset (rx, old_sol); - } - } - } - /* It is possible that the RX_DISTINCT_FUTURE we are working on has - * the empty set of NFA states as its definition. In that case, this - * is a failure point. - */ - if (solution == nil_set) - { - df->future_frame.inx = (void *) rx_backtrack; - df->future_frame.data = 0; - df->future_frame.data_2 = 0; - return 1; - } - dest = rx_superstate (rx, solution); - rx_release_superset (rx, solution); - if (!dest) - return 0; - - { - struct rx_distinct_future *dft; - dft = df; - df->prev_same_dest->next_same_dest = 0; - while (dft) - { - dft->future = dest; - dft->future_frame.inx = rx->instruction_table[rx_next_char]; - dft->future_frame.data = (void *) dest->transitions; - dft = dft->next_same_dest; - } - df->prev_same_dest->next_same_dest = df; - } - if (!dest->transition_refs) - dest->transition_refs = df; - else - { - struct rx_distinct_future *dft = dest->transition_refs->next_same_dest; - dest->transition_refs->next_same_dest = df->next_same_dest; - df->next_same_dest->prev_same_dest = dest->transition_refs; - df->next_same_dest = dft; - dft->prev_same_dest = df; - } - return 1; -} - - -/* This takes a superstate and a character, and computes some edges - * from the superstate NFA. In particular, this computes all edges - * that lead from SUPERSTATE given CHR. This function also - * computes the set of characters that share this edge set. - * This returns 0 on allocation error. - * The character set and list of edges are returned through - * the paramters CSETOUT and DFOUT. -} */ - -#ifdef __STDC__ -static int -compute_super_edge (struct rx *rx, struct rx_distinct_future **dfout, - rx_Bitset csetout, struct rx_superstate *superstate, - unsigned char chr) -#else -static int -compute_super_edge (rx, dfout, csetout, superstate, chr) - struct rx *rx; - struct rx_distinct_future **dfout; - rx_Bitset csetout; - struct rx_superstate *superstate; - unsigned char chr; -#endif -{ - struct rx_superset *stateset = superstate->contents; - - /* To compute the set of characters that share edges with CHR, - * we start with the full character set, and subtract. - */ - rx_bitset_universe (rx->local_cset_size, csetout); - *dfout = 0; - - /* Iterate over the NFA states in the superstate state-set. */ - while (stateset->car) - { - struct rx_nfa_edge *e; - for (e = stateset->car->edges; e; e = e->next) - if (RX_bitset_member (e->params.cset, chr)) - { - /* If we find an NFA edge that applies, we make sure there - * are corresponding edges in the superstate NFA. - */ - { - struct rx_distinct_future * saved; - saved = *dfout; - *dfout = include_futures (rx, *dfout, e->dest, superstate); - if (!*dfout) - { - struct rx_distinct_future * df; - df = saved; - if (df) - df->next_same_super_edge[1]->next_same_super_edge[0] = 0; - while (df) - { - struct rx_distinct_future *dft; - dft = df; - df = df->next_same_super_edge[0]; - - if (dft->future && dft->future->transition_refs == dft) - { - dft->future->transition_refs = dft->next_same_dest; - if (dft->future->transition_refs == dft) - dft->future->transition_refs = 0; - } - dft->next_same_dest->prev_same_dest = dft->prev_same_dest; - dft->prev_same_dest->next_same_dest = dft->next_same_dest; - rx_cache_free (rx->cache, - &rx->cache->free_discernable_futures, - (char *)dft); - } - return 0; - } - } - /* We also trim the character set a bit. */ - rx_bitset_intersection (rx->local_cset_size, - csetout, e->params.cset); - } - else - /* An edge that doesn't apply at least tells us some characters - * that don't share the same edge set as CHR. - */ - rx_bitset_difference (rx->local_cset_size, csetout, e->params.cset); - stateset = stateset->cdr; - } - return 1; -} - - -/* This is a constructor for RX_SUPER_EDGE structures. These are - * wrappers for lists of superstate NFA edges that share character sets labels. - * If a transition class contains more than one rx_distinct_future (superstate - * edge), then it represents a non-determinism in the superstate NFA. - */ - -#ifdef __STDC__ -static struct rx_super_edge * -rx_super_edge (struct rx *rx, - struct rx_superstate *super, rx_Bitset cset, - struct rx_distinct_future *df) -#else -static struct rx_super_edge * -rx_super_edge (rx, super, cset, df) - struct rx *rx; - struct rx_superstate *super; - rx_Bitset cset; - struct rx_distinct_future *df; -#endif -{ - struct rx_super_edge *tc = - (struct rx_super_edge *)rx_cache_malloc_or_get - (rx->cache, &rx->cache->free_transition_classes, - sizeof (struct rx_super_edge) + rx_sizeof_bitset (rx->local_cset_size)); - - if (!tc) - return 0; - tc->next = super->edges; - super->edges = tc; - tc->rx_backtrack_frame.inx = rx->instruction_table[rx_backtrack_point]; - tc->rx_backtrack_frame.data = 0; - tc->rx_backtrack_frame.data_2 = (void *) tc; - tc->options = df; - tc->cset = (rx_Bitset) ((char *) tc + sizeof (*tc)); - rx_bitset_assign (rx->local_cset_size, tc->cset, cset); - if (df) - { - struct rx_distinct_future * dfp = df; - df->next_same_super_edge[1]->next_same_super_edge[0] = 0; - while (dfp) - { - dfp->edge = tc; - dfp = dfp->next_same_super_edge[0]; - } - df->next_same_super_edge[1]->next_same_super_edge[0] = df; - } - return tc; -} - - -/* There are three kinds of cache miss. The first occurs when a - * transition is taken that has never been computed during the - * lifetime of the source superstate. That cache miss is handled by - * calling COMPUTE_SUPER_EDGE. The second kind of cache miss - * occurs when the destination superstate of a transition doesn't - * exist. SOLVE_DESTINATION is used to construct the destination superstate. - * Finally, the third kind of cache miss occurs when the destination - * superstate of a transition is in a `semi-free state'. That case is - * handled by UNFREE_SUPERSTATE. - * - * The function of HANDLE_CACHE_MISS is to figure out which of these - * cases applies. - */ - -#ifdef __STDC__ -static void -install_partial_transition (struct rx_superstate *super, - struct rx_inx *answer, - RX_subset set, int offset) -#else -static void -install_partial_transition (super, answer, set, offset) - struct rx_superstate *super; - struct rx_inx *answer; - RX_subset set; - int offset; -#endif -{ - int start = offset; - int end = start + 32; - RX_subset pos = 1; - struct rx_inx * transitions = super->transitions; - - while (start < end) - { - if (set & pos) - transitions[start] = *answer; - pos <<= 1; - ++start; - } -} - - -#ifdef __STDC__ -RX_DECL struct rx_inx * -rx_handle_cache_miss - (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data) -#else -RX_DECL struct rx_inx * -rx_handle_cache_miss (rx, super, chr, data) - struct rx *rx; - struct rx_superstate *super; - unsigned char chr; - void *data; -#endif -{ - int offset = chr / RX_subset_bits; - struct rx_distinct_future *df = data; - - if (!df) /* must be the shared_cache_miss_frame */ - { - /* Perhaps this is just a transition waiting to be filled. */ - struct rx_super_edge *tc; - RX_subset mask = rx_subset_singletons [chr % RX_subset_bits]; - - for (tc = super->edges; tc; tc = tc->next) - if (tc->cset[offset] & mask) - { - struct rx_inx * answer; - df = tc->options; - answer = ((tc->options->next_same_super_edge[0] != tc->options) - ? &tc->rx_backtrack_frame - : (df->effects - ? &df->side_effects_frame - : &df->future_frame)); - install_partial_transition (super, answer, - tc->cset [offset], offset * 32); - return answer; - } - /* Otherwise, it's a flushed or newly encountered edge. */ - { - char cset_space[1024]; /* this limit is far from unreasonable */ - rx_Bitset trcset; - struct rx_inx *answer; - - if (rx_sizeof_bitset (rx->local_cset_size) > sizeof (cset_space)) - return 0; /* If the arbitrary limit is hit, always fail */ - /* cleanly. */ - trcset = (rx_Bitset)cset_space; - rx_lock_superstate (rx, super); - if (!compute_super_edge (rx, &df, trcset, super, chr)) - { - rx_unlock_superstate (rx, super); - return 0; - } - if (!df) /* We just computed the fail transition. */ - { - static struct rx_inx - shared_fail_frame = { 0, 0, (void *)rx_backtrack, 0 }; - answer = &shared_fail_frame; - } - else - { - tc = rx_super_edge (rx, super, trcset, df); - if (!tc) - { - rx_unlock_superstate (rx, super); - return 0; - } - answer = ((tc->options->next_same_super_edge[0] != tc->options) - ? &tc->rx_backtrack_frame - : (df->effects - ? &df->side_effects_frame - : &df->future_frame)); - } - install_partial_transition (super, answer, - trcset[offset], offset * 32); - rx_unlock_superstate (rx, super); - return answer; - } - } - else if (df->future) /* A cache miss on an edge with a future? Must be - * a semi-free destination. */ - { - if (df->future->is_semifree) - refresh_semifree_superstate (rx->cache, df->future); - return &df->future_frame; - } - else - /* no future superstate on an existing edge */ - { - rx_lock_superstate (rx, super); - if (!solve_destination (rx, df)) - { - rx_unlock_superstate (rx, super); - return 0; - } - if (!df->effects - && (df->edge->options->next_same_super_edge[0] == df->edge->options)) - install_partial_transition (super, &df->future_frame, - df->edge->cset[offset], offset * 32); - rx_unlock_superstate (rx, super); - return &df->future_frame; - } -} - - - - -/* The rest of the code provides a regex.c compatable interface. */ - - -__const__ char *re_error_msg[] = -{ - 0, /* REG_NOUT */ - "No match", /* REG_NOMATCH */ - "Invalid regular expression", /* REG_BADPAT */ - "Invalid collation character", /* REG_ECOLLATE */ - "Invalid character class name", /* REG_ECTYPE */ - "Trailing backslash", /* REG_EESCAPE */ - "Invalid back reference", /* REG_ESUBREG */ - "Unmatched [ or [^", /* REG_EBRACK */ - "Unmatched ( or \\(", /* REG_EPAREN */ - "Unmatched \\{", /* REG_EBRACE */ - "Invalid content of \\{\\}", /* REG_BADBR */ - "Invalid range end", /* REG_ERANGE */ - "Memory exhausted", /* REG_ESPACE */ - "Invalid preceding regular expression", /* REG_BADRPT */ - "Premature end of regular expression", /* REG_EEND */ - "Regular expression too big", /* REG_ESIZE */ - "Unmatched ) or \\)", /* REG_ERPAREN */ -}; - - - -/* - * Macros used while compiling patterns. - * - * By convention, PEND points just past the end of the uncompiled pattern, - * P points to the read position in the pattern. `translate' is the name - * of the translation table (`TRANSLATE' is the name of a macro that looks - * things up in `translate'). - */ - - -/* - * Fetch the next character in the uncompiled pattern---translating it - * if necessary. *Also cast from a signed character in the constant - * string passed to us by the user to an unsigned char that we can use - * as an array index (in, e.g., `translate'). - */ -#define PATFETCH(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - c = translate[c]; \ - } while (0) - -/* - * Fetch the next character in the uncompiled pattern, with no - * translation. - */ -#define PATFETCH_RAW(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - } while (0) - -/* Go backwards one character in the pattern. */ -#define PATUNFETCH p-- - - -#define TRANSLATE(d) translate[(unsigned char) (d)] - -typedef unsigned regnum_t; - -/* Since offsets can go either forwards or backwards, this type needs to - * be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. - */ -typedef int pattern_offset_t; - -typedef struct -{ - struct rexp_node ** top_expression; /* was begalt */ - struct rexp_node ** last_expression; /* was laststart */ - pattern_offset_t inner_group_offset; - regnum_t regnum; -} compile_stack_elt_t; - -typedef struct -{ - compile_stack_elt_t *stack; - unsigned size; - unsigned avail; /* Offset of next open position. */ -} compile_stack_type; - - -#define INIT_COMPILE_STACK_SIZE 32 - -#define COMPILE_STACK_EMPTY (compile_stack.avail == 0) -#define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) - -/* The next available element. */ -#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) - - -/* Set the bit for character C in a list. */ -#define SET_LIST_BIT(c) \ - (b[((unsigned char) (c)) / CHARBITS] \ - |= 1 << (((unsigned char) c) % CHARBITS)) - -/* Get the next unsigned number in the uncompiled pattern. */ -#define GET_UNSIGNED_NUMBER(num) \ - { if (p != pend) \ - { \ - PATFETCH (c); \ - while (isdigit (c)) \ - { \ - if (num < 0) \ - num = 0; \ - num = num * 10 + c - '0'; \ - if (p == pend) \ - break; \ - PATFETCH (c); \ - } \ - } \ - } - -#define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ - -#define IS_CHAR_CLASS(string) \ - (!strcmp (string, "alpha") || !strcmp (string, "upper") \ - || !strcmp (string, "lower") || !strcmp (string, "digit") \ - || !strcmp (string, "alnum") || !strcmp (string, "xdigit") \ - || !strcmp (string, "space") || !strcmp (string, "print") \ - || !strcmp (string, "punct") || !strcmp (string, "graph") \ - || !strcmp (string, "cntrl") || !strcmp (string, "blank")) - - -/* These predicates are used in regex_compile. */ - -/* P points to just after a ^ in PATTERN. Return true if that ^ comes - * after an alternative or a begin-subexpression. We assume there is at - * least one character before the ^. - */ - -#ifdef __STDC__ -static boolean -at_begline_loc_p (__const__ char *pattern, __const__ char * p, reg_syntax_t syntax) -#else -static boolean -at_begline_loc_p (pattern, p, syntax) - __const__ char *pattern; - __const__ char * p; - reg_syntax_t syntax; -#endif -{ - __const__ char *prev = p - 2; - boolean prev_prev_backslash = ((prev > pattern) && (prev[-1] == '\\')); - - return - - (/* After a subexpression? */ - ((*prev == '(') && ((syntax & RE_NO_BK_PARENS) || prev_prev_backslash)) - || - /* After an alternative? */ - ((*prev == '|') && ((syntax & RE_NO_BK_VBAR) || prev_prev_backslash)) - ); -} - -/* The dual of at_begline_loc_p. This one is for $. We assume there is - * at least one character after the $, i.e., `P < PEND'. - */ - -#ifdef __STDC__ -static boolean -at_endline_loc_p (__const__ char *p, __const__ char *pend, int syntax) -#else -static boolean -at_endline_loc_p (p, pend, syntax) - __const__ char *p; - __const__ char *pend; - int syntax; -#endif -{ - __const__ char *next = p; - boolean next_backslash = (*next == '\\'); - __const__ char *next_next = (p + 1 < pend) ? (p + 1) : 0; - - return - ( - /* Before a subexpression? */ - ((syntax & RE_NO_BK_PARENS) - ? (*next == ')') - : (next_backslash && next_next && (*next_next == ')'))) - || - /* Before an alternative? */ - ((syntax & RE_NO_BK_VBAR) - ? (*next == '|') - : (next_backslash && next_next && (*next_next == '|'))) - ); -} - - -unsigned char rx_id_translation[256] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255 -}; - -/* The compiler keeps an inverted translation table. - * This looks up/inititalize elements. - * VALID is an array of booleans that validate CACHE. - */ - -#ifdef __STDC__ -static rx_Bitset -inverse_translation (struct re_pattern_buffer * rxb, - char * valid, rx_Bitset cache, - unsigned char * translate, int c) -#else -static rx_Bitset -inverse_translation (rxb, valid, cache, translate, c) - struct re_pattern_buffer * rxb; - char * valid; - rx_Bitset cache; - unsigned char * translate; - int c; -#endif -{ - rx_Bitset cs - = cache + c * rx_bitset_numb_subsets (rxb->rx.local_cset_size); - - if (!valid[c]) - { - int x; - int c_tr = TRANSLATE(c); - rx_bitset_null (rxb->rx.local_cset_size, cs); - for (x = 0; x < 256; ++x) /* &&&& 13.37 */ - if (TRANSLATE(x) == c_tr) - RX_bitset_enjoin (cs, x); - valid[c] = 1; - } - return cs; -} - - - - -/* More subroutine declarations and macros for regex_compile. */ - -/* Returns true if REGNUM is in one of COMPILE_STACK's elements and - false if it's not. */ - -#ifdef __STDC__ -static boolean -group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum) -#else -static boolean -group_in_compile_stack (compile_stack, regnum) - compile_stack_type compile_stack; - regnum_t regnum; -#endif -{ - int this_element; - - for (this_element = compile_stack.avail - 1; - this_element >= 0; - this_element--) - if (compile_stack.stack[this_element].regnum == regnum) - return true; - - return false; -} - - -/* - * Read the ending character of a range (in a bracket expression) from the - * uncompiled pattern *P_PTR (which ends at PEND). We assume the - * starting character is in `P[-2]'. (`P[-1]' is the character `-'.) - * Then we set the translation of all bits between the starting and - * ending characters (inclusive) in the compiled pattern B. - * - * Return an error code. - * - * We use these short variable names so we can use the same macros as - * `regex_compile' itself. - */ - -#ifdef __STDC__ -static reg_errcode_t -compile_range (struct re_pattern_buffer * rxb, rx_Bitset cs, - __const__ char ** p_ptr, __const__ char * pend, - unsigned char * translate, reg_syntax_t syntax, - rx_Bitset inv_tr, char * valid_inv_tr) -#else -static reg_errcode_t -compile_range (rxb, cs, p_ptr, pend, translate, syntax, inv_tr, valid_inv_tr) - struct re_pattern_buffer * rxb; - rx_Bitset cs; - __const__ char ** p_ptr; - __const__ char * pend; - unsigned char * translate; - reg_syntax_t syntax; - rx_Bitset inv_tr; - char * valid_inv_tr; -#endif -{ - unsigned this_char; - - __const__ char *p = *p_ptr; - - unsigned char range_end; - unsigned char range_start = TRANSLATE(p[-2]); - - if (p == pend) - return REG_ERANGE; - - PATFETCH (range_end); - - (*p_ptr)++; - - if (range_start > range_end) - return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; - - for (this_char = range_start; this_char <= range_end; this_char++) - { - rx_Bitset it = - inverse_translation (rxb, valid_inv_tr, inv_tr, translate, this_char); - rx_bitset_union (rxb->rx.local_cset_size, cs, it); - } - - return REG_NOERROR; -} - - -/* This searches a regexp for backreference side effects. - * It fills in the array OUT with 1 at the index of every register pair - * referenced by a backreference. - * - * This is used to help optimize patterns for searching. The information is - * useful because, if the caller doesn't want register values, backreferenced - * registers are the only registers for which we need rx_backtrack. - */ - -#ifdef __STDC__ -static void -find_backrefs (char * out, struct rexp_node * rexp, - struct re_se_params * params) -#else -static void -find_backrefs (out, rexp, params) - char * out; - struct rexp_node * rexp; - struct re_se_params * params; -#endif -{ - if (rexp) - switch (rexp->type) - { - case r_cset: - case r_data: - return; - case r_alternate: - case r_concat: - case r_opt: - case r_star: - case r_2phase_star: - find_backrefs (out, rexp->params.pair.left, params); - find_backrefs (out, rexp->params.pair.right, params); - return; - case r_side_effect: - if ( ((long)rexp->params.side_effect >= 0) - && (params [(long)rexp->params.side_effect].se == re_se_backref)) - out[ params [(long)rexp->params.side_effect].op1] = 1; - return; - } -} - - - -/* Returns 0 unless the pattern can match the empty string. */ - -#ifdef __STDC__ -static int -compute_fastset (struct re_pattern_buffer * rxb, struct rexp_node * rexp) -#else -static int -compute_fastset (rxb, rexp) - struct re_pattern_buffer * rxb; - struct rexp_node * rexp; -#endif -{ - if (!rexp) - return 1; - switch (rexp->type) - { - case r_data: - return 1; - case r_cset: - { - rx_bitset_union (rxb->rx.local_cset_size, - rxb->fastset, rexp->params.cset); - } - return 0; - case r_concat: - return (compute_fastset (rxb, rexp->params.pair.left) - && compute_fastset (rxb, rexp->params.pair.right)); - case r_2phase_star: - compute_fastset (rxb, rexp->params.pair.left); - /* compute_fastset (rxb, rexp->params.pair.right); nope... */ - return 1; - case r_alternate: - return !!(compute_fastset (rxb, rexp->params.pair.left) - + compute_fastset (rxb, rexp->params.pair.right)); - case r_opt: - case r_star: - compute_fastset (rxb, rexp->params.pair.left); - return 1; - case r_side_effect: - return 1; - } - - /* this should never happen */ - return 0; -} - - -/* returns - * 1 -- yes, definately anchored by the given side effect. - * 2 -- maybe anchored, maybe the empty string. - * 0 -- definately not anchored - * There is simply no other possibility. - */ - -#ifdef __STDC__ -static int -is_anchored (struct rexp_node * rexp, rx_side_effect se) -#else -static int -is_anchored (rexp, se) - struct rexp_node * rexp; - rx_side_effect se; -#endif -{ - if (!rexp) - return 2; - switch (rexp->type) - { - case r_cset: - case r_data: - return 0; - case r_concat: - case r_2phase_star: - { - int l = is_anchored (rexp->params.pair.left, se); - return (l == 2 ? is_anchored (rexp->params.pair.right, se) : l); - } - case r_alternate: - { - int l = is_anchored (rexp->params.pair.left, se); - int r = l ? is_anchored (rexp->params.pair.right, se) : 0; - - if (l == r) - return l; - else if ((l == 0) || (r == 0)) - return 0; - else - return 2; - } - case r_opt: - case r_star: - return is_anchored (rexp->params.pair.left, se) ? 2 : 0; - - case r_side_effect: - return ((rexp->params.side_effect == se) - ? 1 : 2); - } - - /* this should never happen */ - return 0; -} - - -/* This removes register assignments that aren't required by backreferencing. - * This can speed up explore_future, especially if it eliminates - * non-determinism in the superstate NFA. - * - * NEEDED is an array of characters, presumably filled in by FIND_BACKREFS. - * The non-zero elements of the array indicate which register assignments - * can NOT be removed from the expression. - */ - -#ifdef __STDC__ -static struct rexp_node * -remove_unecessary_side_effects (struct rx * rx, char * needed, - struct rexp_node * rexp, - struct re_se_params * params) -#else -static struct rexp_node * -remove_unecessary_side_effects (rx, needed, rexp, params) - struct rx * rx; - char * needed; - struct rexp_node * rexp; - struct re_se_params * params; -#endif -{ - struct rexp_node * l; - struct rexp_node * r; - if (!rexp) - return 0; - else - switch (rexp->type) - { - case r_cset: - case r_data: - return rexp; - case r_alternate: - case r_concat: - case r_2phase_star: - l = remove_unecessary_side_effects (rx, needed, - rexp->params.pair.left, params); - r = remove_unecessary_side_effects (rx, needed, - rexp->params.pair.right, params); - if ((l && r) || (rexp->type != r_concat)) - { - rexp->params.pair.left = l; - rexp->params.pair.right = r; - return rexp; - } - else - { - rexp->params.pair.left = rexp->params.pair.right = 0; - rx_free_rexp (rx, rexp); - return l ? l : r; - } - case r_opt: - case r_star: - l = remove_unecessary_side_effects (rx, needed, - rexp->params.pair.left, params); - if (l) - { - rexp->params.pair.left = l; - return rexp; - } - else - { - rexp->params.pair.left = 0; - rx_free_rexp (rx, rexp); - return 0; - } - case r_side_effect: - { - int se = (long)rexp->params.side_effect; - if ( (se >= 0) - && ( ((enum re_side_effects)params[se].se == re_se_lparen) - || ((enum re_side_effects)params[se].se == re_se_rparen)) - && (params [se].op1 > 0) - && (!needed [params [se].op1])) - { - rx_free_rexp (rx, rexp); - return 0; - } - else - return rexp; - } - } - - /* this should never happen */ - return 0; -} - - - -#ifdef __STDC__ -static int -pointless_if_repeated (struct rexp_node * node, struct re_se_params * params) -#else -static int -pointless_if_repeated (node, params) - struct rexp_node * node; - struct re_se_params * params; -#endif -{ - if (!node) - return 1; - switch (node->type) - { - case r_cset: - return 0; - case r_alternate: - case r_concat: - case r_2phase_star: - return (pointless_if_repeated (node->params.pair.left, params) - && pointless_if_repeated (node->params.pair.right, params)); - case r_opt: - case r_star: - return pointless_if_repeated (node->params.pair.left, params); - case r_side_effect: - switch (((long)node->params.side_effect < 0) - ? (enum re_side_effects)node->params.side_effect - : (enum re_side_effects)params[(long)node->params.side_effect].se) - { - case re_se_try: - case re_se_at_dot: - case re_se_begbuf: - case re_se_hat: - case re_se_wordbeg: - case re_se_wordbound: - case re_se_notwordbound: - case re_se_wordend: - case re_se_endbuf: - case re_se_dollar: - case re_se_fail: - case re_se_win: - return 1; - case re_se_lparen: - case re_se_rparen: - case re_se_iter: - case re_se_end_iter: - case re_se_syntax: - case re_se_not_syntax: - case re_se_backref: - return 0; - } - case r_data: - default: - return 0; - } -} - - - -#ifdef __STDC__ -static int -registers_on_stack (struct re_pattern_buffer * rxb, - struct rexp_node * rexp, int in_danger, - struct re_se_params * params) -#else -static int -registers_on_stack (rxb, rexp, in_danger, params) - struct re_pattern_buffer * rxb; - struct rexp_node * rexp; - int in_danger; - struct re_se_params * params; -#endif -{ - if (!rexp) - return 0; - else - switch (rexp->type) - { - case r_cset: - case r_data: - return 0; - case r_alternate: - case r_concat: - return ( registers_on_stack (rxb, rexp->params.pair.left, - in_danger, params) - || (registers_on_stack - (rxb, rexp->params.pair.right, - in_danger, params))); - case r_opt: - return registers_on_stack (rxb, rexp->params.pair.left, 0, params); - case r_star: - return registers_on_stack (rxb, rexp->params.pair.left, 1, params); - case r_2phase_star: - return - ( registers_on_stack (rxb, rexp->params.pair.left, 1, params) - || registers_on_stack (rxb, rexp->params.pair.right, 1, params)); - case r_side_effect: - { - int se = (long)rexp->params.side_effect; - if ( in_danger - && (se >= 0) - && (params [se].op1 > 0) - && ( ((enum re_side_effects)params[se].se == re_se_lparen) - || ((enum re_side_effects)params[se].se == re_se_rparen))) - return 1; - else - return 0; - } - } - - /* this should never happen */ - return 0; -} - - - -static char idempotent_complex_se[] = -{ -#define RX_WANT_SE_DEFS 1 -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#define RX_DEF_SE(IDEM, NAME, VALUE) -#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE) IDEM, -#include "rx.h" -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#undef RX_WANT_SE_DEFS - 23 -}; - -static char idempotent_se[] = -{ - 13, -#define RX_WANT_SE_DEFS 1 -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#define RX_DEF_SE(IDEM, NAME, VALUE) IDEM, -#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE) -#include "rx.h" -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#undef RX_WANT_SE_DEFS - 42 -}; - - - - -#ifdef __STDC__ -static int -has_any_se (struct rx * rx, - struct rexp_node * rexp) -#else -static int -has_any_se (rx, rexp) - struct rx * rx; - struct rexp_node * rexp; -#endif -{ - if (!rexp) - return 0; - - switch (rexp->type) - { - case r_cset: - case r_data: - return 0; - - case r_side_effect: - return 1; - - case r_2phase_star: - case r_concat: - case r_alternate: - return - ( has_any_se (rx, rexp->params.pair.left) - || has_any_se (rx, rexp->params.pair.right)); - - case r_opt: - case r_star: - return has_any_se (rx, rexp->params.pair.left); - } - - /* this should never happen */ - return 0; -} - - - -/* This must be called AFTER `convert_hard_loops' for a given REXP. */ -#ifdef __STDC__ -static int -has_non_idempotent_epsilon_path (struct rx * rx, - struct rexp_node * rexp, - struct re_se_params * params) -#else -static int -has_non_idempotent_epsilon_path (rx, rexp, params) - struct rx * rx; - struct rexp_node * rexp; - struct re_se_params * params; -#endif -{ - if (!rexp) - return 0; - - switch (rexp->type) - { - case r_cset: - case r_data: - case r_star: - return 0; - - case r_side_effect: - return - !((long)rexp->params.side_effect > 0 - ? idempotent_complex_se [ params [(long)rexp->params.side_effect].se ] - : idempotent_se [-(long)rexp->params.side_effect]); - - case r_alternate: - return - ( has_non_idempotent_epsilon_path (rx, - rexp->params.pair.left, params) - || has_non_idempotent_epsilon_path (rx, - rexp->params.pair.right, params)); - - case r_2phase_star: - case r_concat: - return - ( has_non_idempotent_epsilon_path (rx, - rexp->params.pair.left, params) - && has_non_idempotent_epsilon_path (rx, - rexp->params.pair.right, params)); - - case r_opt: - return has_non_idempotent_epsilon_path (rx, - rexp->params.pair.left, params); - } - - /* this should never happen */ - return 0; -} - - - -/* This computes rougly what it's name suggests. It can (and does) go wrong - * in the direction of returning spurious 0 without causing disasters. - */ -#ifdef __STDC__ -static int -begins_with_complex_se (struct rx * rx, struct rexp_node * rexp) -#else -static int -begins_with_complex_se (rx, rexp) - struct rx * rx; - struct rexp_node * rexp; -#endif -{ - if (!rexp) - return 0; - - switch (rexp->type) - { - case r_cset: - case r_data: - return 0; - - case r_side_effect: - return ((long)rexp->params.side_effect >= 0); - - case r_alternate: - return - ( begins_with_complex_se (rx, rexp->params.pair.left) - && begins_with_complex_se (rx, rexp->params.pair.right)); - - - case r_concat: - return has_any_se (rx, rexp->params.pair.left); - case r_opt: - case r_star: - case r_2phase_star: - return 0; - } - - /* this should never happen */ - return 0; -} - - -/* This destructively removes some of the re_se_tv side effects from - * a rexp tree. In particular, during parsing re_se_tv was inserted on the - * right half of every | to guarantee that posix path preference could be - * honored. This function removes some which it can be determined aren't - * needed. - */ - -#ifdef __STDC__ -static void -speed_up_alt (struct rx * rx, - struct rexp_node * rexp, - int unposix) -#else -static void -speed_up_alt (rx, rexp, unposix) - struct rx * rx; - struct rexp_node * rexp; - int unposix; -#endif -{ - if (!rexp) - return; - - switch (rexp->type) - { - case r_cset: - case r_data: - case r_side_effect: - return; - - case r_opt: - case r_star: - speed_up_alt (rx, rexp->params.pair.left, unposix); - return; - - case r_2phase_star: - case r_concat: - speed_up_alt (rx, rexp->params.pair.left, unposix); - speed_up_alt (rx, rexp->params.pair.right, unposix); - return; - - case r_alternate: - /* the right child is guaranteed to be (concat re_se_tv <subexp>) */ - - speed_up_alt (rx, rexp->params.pair.left, unposix); - speed_up_alt (rx, rexp->params.pair.right->params.pair.right, unposix); - - if ( unposix - || (begins_with_complex_se - (rx, rexp->params.pair.right->params.pair.right)) - || !( has_any_se (rx, rexp->params.pair.right->params.pair.right) - || has_any_se (rx, rexp->params.pair.left))) - { - struct rexp_node * conc = rexp->params.pair.right; - rexp->params.pair.right = conc->params.pair.right; - conc->params.pair.right = 0; - rx_free_rexp (rx, conc); - } - } -} - - - - - -/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. - Returns one of error codes defined in `regex.h', or zero for success. - - Assumes the `allocated' (and perhaps `buffer') and `translate' - fields are set in BUFP on entry. - - If it succeeds, results are put in BUFP (if it returns an error, the - contents of BUFP are undefined): - `buffer' is the compiled pattern; - `syntax' is set to SYNTAX; - `used' is set to the length of the compiled pattern; - `fastmap_accurate' is set to zero; - `re_nsub' is set to the number of groups in PATTERN; - `not_bol' and `not_eol' are set to zero. - - The `fastmap' and `newline_anchor' fields are neither - examined nor set. */ - - - -#ifdef __STDC__ -RX_DECL reg_errcode_t -rx_compile (__const__ char *pattern, int size, - reg_syntax_t syntax, - struct re_pattern_buffer * rxb) -#else -RX_DECL reg_errcode_t -rx_compile (pattern, size, syntax, rxb) - __const__ char *pattern; - int size; - reg_syntax_t syntax; - struct re_pattern_buffer * rxb; -#endif -{ - RX_subset - inverse_translate [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)]; - char - validate_inv_tr [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)]; - - /* We fetch characters from PATTERN here. Even though PATTERN is - `char *' (i.e., signed), we declare these variables as unsigned, so - they can be reliably used as array indices. */ - register unsigned char c, c1; - - /* A random tempory spot in PATTERN. */ - __const__ char *p1; - - /* Keeps track of unclosed groups. */ - compile_stack_type compile_stack; - - /* Points to the current (ending) position in the pattern. */ - __const__ char *p = pattern; - __const__ char *pend = pattern + size; - - /* How to translate the characters in the pattern. */ - unsigned char *translate = (rxb->translate - ? rxb->translate - : rx_id_translation); - - /* When parsing is done, this will hold the expression tree. */ - struct rexp_node * rexp = 0; - - /* In the midst of compilation, this holds onto the regexp - * first parst while rexp goes on to aquire additional constructs. - */ - struct rexp_node * orig_rexp = 0; - struct rexp_node * fewer_side_effects = 0; - - /* This and top_expression are saved on the compile stack. */ - struct rexp_node ** top_expression = &rexp; - struct rexp_node ** last_expression = top_expression; - - /* Parameter to `goto append_node' */ - struct rexp_node * append; - - /* Counts open-groups as they are encountered. This is the index of the - * innermost group being compiled. - */ - regnum_t regnum = 0; - - /* Place in the uncompiled pattern (i.e., the {) to - * which to go back if the interval is invalid. - */ - __const__ char *beg_interval; - - struct re_se_params * params = 0; - int paramc = 0; /* How many complex side effects so far? */ - - rx_side_effect side; /* param to `goto add_side_effect' */ - - bzero (validate_inv_tr, sizeof (validate_inv_tr)); - - rxb->rx.instruction_table = rx_id_instruction_table; - - - /* Initialize the compile stack. */ - compile_stack.stack = (( compile_stack_elt_t *) malloc ((INIT_COMPILE_STACK_SIZE) * sizeof ( compile_stack_elt_t))); - if (compile_stack.stack == 0) - return REG_ESPACE; - - compile_stack.size = INIT_COMPILE_STACK_SIZE; - compile_stack.avail = 0; - - /* Initialize the pattern buffer. */ - rxb->rx.cache = &default_cache; - rxb->syntax = syntax; - rxb->fastmap_accurate = 0; - rxb->not_bol = rxb->not_eol = 0; - rxb->least_subs = 0; - - /* Always count groups, whether or not rxb->no_sub is set. - * The whole pattern is implicitly group 0, so counting begins - * with 1. - */ - rxb->re_nsub = 0; - -#if !defined (emacs) && !defined (SYNTAX_TABLE) - /* Initialize the syntax table. */ - init_syntax_once (); -#endif - - /* Loop through the uncompiled pattern until we're at the end. */ - while (p != pend) - { - PATFETCH (c); - - switch (c) - { - case '^': - { - if ( /* If at start of pattern, it's an operator. */ - p == pattern + 1 - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's come before. */ - || at_begline_loc_p (pattern, p, syntax)) - { - struct rexp_node * n - = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_hat); - if (!n) - return REG_ESPACE; - append = n; - goto append_node; - } - else - goto normal_char; - } - break; - - - case '$': - { - if ( /* If at end of pattern, it's an operator. */ - p == pend - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's next. */ - || at_endline_loc_p (p, pend, syntax)) - { - struct rexp_node * n - = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_dollar); - if (!n) - return REG_ESPACE; - append = n; - goto append_node; - } - else - goto normal_char; - } - break; - - - case '+': - case '?': - if ((syntax & RE_BK_PLUS_QM) - || (syntax & RE_LIMITED_OPS)) - goto normal_char; - - handle_plus: - case '*': - /* If there is no previous pattern... */ - if (pointless_if_repeated (*last_expression, params)) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - return REG_BADRPT; - else if (!(syntax & RE_CONTEXT_INDEP_OPS)) - goto normal_char; - } - - { - /* 1 means zero (many) matches is allowed. */ - char zero_times_ok = 0, many_times_ok = 0; - - /* If there is a sequence of repetition chars, collapse it - down to just one (the right one). We can't combine - interval operators with these because of, e.g., `a{2}*', - which should only match an even number of `a's. */ - - for (;;) - { - zero_times_ok |= c != '+'; - many_times_ok |= c != '?'; - - if (p == pend) - break; - - PATFETCH (c); - - if (c == '*' - || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) - ; - - else if (syntax & RE_BK_PLUS_QM && c == '\\') - { - if (p == pend) return REG_EESCAPE; - - PATFETCH (c1); - if (!(c1 == '+' || c1 == '?')) - { - PATUNFETCH; - PATUNFETCH; - break; - } - - c = c1; - } - else - { - PATUNFETCH; - break; - } - - /* If we get here, we found another repeat character. */ - } - - /* Star, etc. applied to an empty pattern is equivalent - to an empty pattern. */ - if (!last_expression) - break; - - /* Now we know whether or not zero matches is allowed - * and also whether or not two or more matches is allowed. - */ - - { - struct rexp_node * inner_exp = *last_expression; - int need_sync = 0; - - if (many_times_ok - && has_non_idempotent_epsilon_path (&rxb->rx, - inner_exp, params)) - { - struct rexp_node * pusher - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_pushpos); - struct rexp_node * checker - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_chkpos); - struct rexp_node * pushback - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_pushback); - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * lit_t = rx_mk_r_cset (&rxb->rx, cs); - struct rexp_node * fake_state - = rx_mk_r_concat (&rxb->rx, pushback, lit_t); - struct rexp_node * phase2 - = rx_mk_r_concat (&rxb->rx, checker, fake_state); - struct rexp_node * popper - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_poppos); - struct rexp_node * star - = rx_mk_r_2phase_star (&rxb->rx, inner_exp, phase2); - struct rexp_node * a - = rx_mk_r_concat (&rxb->rx, pusher, star); - struct rexp_node * whole_thing - = rx_mk_r_concat (&rxb->rx, a, popper); - if (!(pusher && star && pushback && lit_t && fake_state - && lit_t && phase2 && checker && popper - && a && whole_thing)) - return REG_ESPACE; - RX_bitset_enjoin (cs, 't'); - *last_expression = whole_thing; - } - else - { - struct rexp_node * star = - (many_times_ok ? rx_mk_r_star : rx_mk_r_opt) - (&rxb->rx, *last_expression); - if (!star) - return REG_ESPACE; - *last_expression = star; - need_sync = has_any_se (&rxb->rx, *last_expression); - } - if (!zero_times_ok) - { - struct rexp_node * concat - = rx_mk_r_concat (&rxb->rx, - rx_copy_rexp (&rxb->rx, - inner_exp), - *last_expression); - if (!concat) - return REG_ESPACE; - *last_expression = concat; - } - if (need_sync) - { - int sync_se = paramc; - params = (params - ? ((struct re_se_params *) - realloc (params, - sizeof (*params) * (1 + paramc))) - : ((struct re_se_params *) - malloc (sizeof (*params)))); - if (!params) - return REG_ESPACE; - ++paramc; - params [sync_se].se = re_se_tv; - side = (rx_side_effect)(long)sync_se; - goto add_side_effect; - } - } - /* The old regex.c used to optimize `.*\n'. - * Maybe rx should too? - */ - } - break; - - - case '.': - { - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * n = rx_mk_r_cset (&rxb->rx, cs); - if (!(cs && n)) - return REG_ESPACE; - - rx_bitset_universe (rxb->rx.local_cset_size, cs); - if (!(rxb->syntax & RE_DOT_NEWLINE)) - RX_bitset_remove (cs, '\n'); - if (!(rxb->syntax & RE_DOT_NOT_NULL)) - RX_bitset_remove (cs, 0); - - append = n; - goto append_node; - break; - } - - - case '[': - if (p == pend) return REG_EBRACK; - { - boolean had_char_class = false; - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * node = rx_mk_r_cset (&rxb->rx, cs); - int is_inverted = *p == '^'; - - if (!(node && cs)) - return REG_ESPACE; - - /* This branch of the switch is normally exited with - *`goto append_node' - */ - append = node; - - if (is_inverted) - p++; - - /* Remember the first position in the bracket expression. */ - p1 = p; - - /* Read in characters and ranges, setting map bits. */ - for (;;) - { - if (p == pend) return REG_EBRACK; - - PATFETCH (c); - - /* \ might escape characters inside [...] and [^...]. */ - if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') - { - if (p == pend) return REG_EESCAPE; - - PATFETCH (c1); - { - rx_Bitset it = inverse_translation (rxb, - validate_inv_tr, - inverse_translate, - translate, - c1); - rx_bitset_union (rxb->rx.local_cset_size, cs, it); - } - continue; - } - - /* Could be the end of the bracket expression. If it's - not (i.e., when the bracket expression is `[]' so - far), the ']' character bit gets set way below. */ - if (c == ']' && p != p1 + 1) - goto finalize_class_and_append; - - /* Look ahead to see if it's a range when the last thing - was a character class. */ - if (had_char_class && c == '-' && *p != ']') - return REG_ERANGE; - - /* Look ahead to see if it's a range when the last thing - was a character: if this is a hyphen not at the - beginning or the end of a list, then it's the range - operator. */ - if (c == '-' - && !(p - 2 >= pattern && p[-2] == '[') - && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') - && *p != ']') - { - reg_errcode_t ret - = compile_range (rxb, cs, &p, pend, translate, syntax, - inverse_translate, validate_inv_tr); - if (ret != REG_NOERROR) return ret; - } - - else if (p[0] == '-' && p[1] != ']') - { /* This handles ranges made up of characters only. */ - reg_errcode_t ret; - - /* Move past the `-'. */ - PATFETCH (c1); - - ret = compile_range (rxb, cs, &p, pend, translate, syntax, - inverse_translate, validate_inv_tr); - if (ret != REG_NOERROR) return ret; - } - - /* See if we're at the beginning of a possible character - class. */ - - else if ((syntax & RE_CHAR_CLASSES) - && (c == '[') && (*p == ':')) - { - char str[CHAR_CLASS_MAX_LENGTH + 1]; - - PATFETCH (c); - c1 = 0; - - /* If pattern is `[[:'. */ - if (p == pend) return REG_EBRACK; - - for (;;) - { - PATFETCH (c); - if (c == ':' || c == ']' || p == pend - || c1 == CHAR_CLASS_MAX_LENGTH) - break; - str[c1++] = c; - } - str[c1] = '\0'; - - /* If isn't a word bracketed by `[:' and:`]': - undo the ending character, the letters, and leave - the leading `:' and `[' (but set bits for them). */ - if (c == ':' && *p == ']') - { - int ch; - boolean is_alnum = !strcmp (str, "alnum"); - boolean is_alpha = !strcmp (str, "alpha"); - boolean is_blank = !strcmp (str, "blank"); - boolean is_cntrl = !strcmp (str, "cntrl"); - boolean is_digit = !strcmp (str, "digit"); - boolean is_graph = !strcmp (str, "graph"); - boolean is_lower = !strcmp (str, "lower"); - boolean is_print = !strcmp (str, "print"); - boolean is_punct = !strcmp (str, "punct"); - boolean is_space = !strcmp (str, "space"); - boolean is_upper = !strcmp (str, "upper"); - boolean is_xdigit = !strcmp (str, "xdigit"); - - if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; - - /* Throw away the ] at the end of the character - class. */ - PATFETCH (c); - - if (p == pend) return REG_EBRACK; - - for (ch = 0; ch < 1 << CHARBITS; ch++) - { - if ( (is_alnum && isalnum (ch)) - || (is_alpha && isalpha (ch)) - || (is_blank && isblank (ch)) - || (is_cntrl && iscntrl (ch)) - || (is_digit && isdigit (ch)) - || (is_graph && isgraph (ch)) - || (is_lower && islower (ch)) - || (is_print && isprint (ch)) - || (is_punct && ispunct (ch)) - || (is_space && isspace (ch)) - || (is_upper && isupper (ch)) - || (is_xdigit && isxdigit (ch))) - { - rx_Bitset it = - inverse_translation (rxb, - validate_inv_tr, - inverse_translate, - translate, - ch); - rx_bitset_union (rxb->rx.local_cset_size, - cs, it); - } - } - had_char_class = true; - } - else - { - c1++; - while (c1--) - PATUNFETCH; - { - rx_Bitset it = - inverse_translation (rxb, - validate_inv_tr, - inverse_translate, - translate, - '['); - rx_bitset_union (rxb->rx.local_cset_size, - cs, it); - } - { - rx_Bitset it = - inverse_translation (rxb, - validate_inv_tr, - inverse_translate, - translate, - ':'); - rx_bitset_union (rxb->rx.local_cset_size, - cs, it); - } - had_char_class = false; - } - } - else - { - had_char_class = false; - { - rx_Bitset it = inverse_translation (rxb, - validate_inv_tr, - inverse_translate, - translate, - c); - rx_bitset_union (rxb->rx.local_cset_size, cs, it); - } - } - } - - finalize_class_and_append: - if (is_inverted) - { - rx_bitset_complement (rxb->rx.local_cset_size, cs); - if (syntax & RE_HAT_LISTS_NOT_NEWLINE) - RX_bitset_remove (cs, '\n'); - } - goto append_node; - } - break; - - - case '(': - if (syntax & RE_NO_BK_PARENS) - goto handle_open; - else - goto normal_char; - - - case ')': - if (syntax & RE_NO_BK_PARENS) - goto handle_close; - else - goto normal_char; - - - case '\n': - if (syntax & RE_NEWLINE_ALT) - goto handle_alt; - else - goto normal_char; - - - case '|': - if (syntax & RE_NO_BK_VBAR) - goto handle_alt; - else - goto normal_char; - - - case '{': - if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - goto handle_interval; - else - goto normal_char; - - - case '\\': - if (p == pend) return REG_EESCAPE; - - /* Do not translate the character after the \, so that we can - distinguish, e.g., \B from \b, even if we normally would - translate, e.g., B to b. */ - PATFETCH_RAW (c); - - switch (c) - { - case '(': - if (syntax & RE_NO_BK_PARENS) - goto normal_backslash; - - handle_open: - rxb->re_nsub++; - regnum++; - if (COMPILE_STACK_FULL) - { - ((compile_stack.stack) = - (compile_stack_elt_t *) realloc (compile_stack.stack, ( compile_stack.size << 1) * sizeof ( - compile_stack_elt_t))); - if (compile_stack.stack == 0) return REG_ESPACE; - - compile_stack.size <<= 1; - } - - if (*last_expression) - { - struct rexp_node * concat - = rx_mk_r_concat (&rxb->rx, *last_expression, 0); - if (!concat) - return REG_ESPACE; - *last_expression = concat; - last_expression = &concat->params.pair.right; - } - - /* - * These are the values to restore when we hit end of this - * group. - */ - COMPILE_STACK_TOP.top_expression = top_expression; - COMPILE_STACK_TOP.last_expression = last_expression; - COMPILE_STACK_TOP.regnum = regnum; - - compile_stack.avail++; - - top_expression = last_expression; - break; - - - case ')': - if (syntax & RE_NO_BK_PARENS) goto normal_backslash; - - handle_close: - /* See similar code for backslashed left paren above. */ - if (COMPILE_STACK_EMPTY) - if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) - goto normal_char; - else - return REG_ERPAREN; - - /* Since we just checked for an empty stack above, this - ``can't happen''. */ - - { - /* We don't just want to restore into `regnum', because - later groups should continue to be numbered higher, - as in `(ab)c(de)' -- the second group is #2. */ - regnum_t this_group_regnum; - struct rexp_node ** inner = top_expression; - - compile_stack.avail--; - top_expression = COMPILE_STACK_TOP.top_expression; - last_expression = COMPILE_STACK_TOP.last_expression; - this_group_regnum = COMPILE_STACK_TOP.regnum; - { - int left_se = paramc; - int right_se = paramc + 1; - - params = (params - ? ((struct re_se_params *) - realloc (params, - (paramc + 2) * sizeof (params[0]))) - : ((struct re_se_params *) - malloc (2 * sizeof (params[0])))); - if (!params) - return REG_ESPACE; - paramc += 2; - - params[left_se].se = re_se_lparen; - params[left_se].op1 = this_group_regnum; - params[right_se].se = re_se_rparen; - params[right_se].op1 = this_group_regnum; - { - struct rexp_node * left - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)(long)left_se); - struct rexp_node * right - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)(long)right_se); - struct rexp_node * c1 - = (*inner - ? rx_mk_r_concat (&rxb->rx, left, *inner) : left); - struct rexp_node * c2 - = rx_mk_r_concat (&rxb->rx, c1, right); - if (!(left && right && c1 && c2)) - return REG_ESPACE; - *inner = c2; - } - } - break; - } - - case '|': /* `\|'. */ - if ((syntax & RE_LIMITED_OPS) || (syntax & RE_NO_BK_VBAR)) - goto normal_backslash; - handle_alt: - if (syntax & RE_LIMITED_OPS) - goto normal_char; - - { - struct rexp_node * alt - = rx_mk_r_alternate (&rxb->rx, *top_expression, 0); - if (!alt) - return REG_ESPACE; - *top_expression = alt; - last_expression = &alt->params.pair.right; - { - int sync_se = paramc; - - params = (params - ? ((struct re_se_params *) - realloc (params, - (paramc + 1) * sizeof (params[0]))) - : ((struct re_se_params *) - malloc (sizeof (params[0])))); - if (!params) - return REG_ESPACE; - ++paramc; - - params[sync_se].se = re_se_tv; - { - struct rexp_node * sync - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)(long)sync_se); - struct rexp_node * conc - = rx_mk_r_concat (&rxb->rx, sync, 0); - - if (!sync || !conc) - return REG_ESPACE; - - *last_expression = conc; - last_expression = &conc->params.pair.right; - } - } - } - break; - - - case '{': - /* If \{ is a literal. */ - if (!(syntax & RE_INTERVALS) - /* If we're at `\{' and it's not the open-interval - operator. */ - || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - || (p - 2 == pattern && p == pend)) - goto normal_backslash; - - handle_interval: - { - /* If got here, then the syntax allows intervals. */ - - /* At least (most) this many matches must be made. */ - int lower_bound = -1, upper_bound = -1; - - beg_interval = p - 1; - - if (p == pend) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_EBRACE; - } - - GET_UNSIGNED_NUMBER (lower_bound); - - if (c == ',') - { - GET_UNSIGNED_NUMBER (upper_bound); - if (upper_bound < 0) upper_bound = RE_DUP_MAX; - } - else - /* Interval such as `{1}' => match exactly once. */ - upper_bound = lower_bound; - - if (lower_bound < 0 || upper_bound > RE_DUP_MAX - || lower_bound > upper_bound) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_BADBR; - } - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (c != '\\') return REG_EBRACE; - PATFETCH (c); - } - - if (c != '}') - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_BADBR; - } - - /* We just parsed a valid interval. */ - - /* If it's invalid to have no preceding re. */ - if (pointless_if_repeated (*last_expression, params)) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - return REG_BADRPT; - else if (!(syntax & RE_CONTEXT_INDEP_OPS)) - goto unfetch_interval; - /* was: else laststart = b; */ - } - - /* If the upper bound is zero, don't want to iterate - * at all. - */ - if (upper_bound == 0) - { - if (*last_expression) - { - rx_free_rexp (&rxb->rx, *last_expression); - *last_expression = 0; - } - } - else - /* Otherwise, we have a nontrivial interval. */ - { - int iter_se = paramc; - int end_se = paramc + 1; - params = (params - ? ((struct re_se_params *) - realloc (params, - sizeof (*params) * (2 + paramc))) - : ((struct re_se_params *) - malloc (2 * sizeof (*params)))); - if (!params) - return REG_ESPACE; - paramc += 2; - params [iter_se].se = re_se_iter; - params [iter_se].op1 = lower_bound; - params[iter_se].op2 = upper_bound; - - params[end_se].se = re_se_end_iter; - params[end_se].op1 = lower_bound; - params[end_se].op2 = upper_bound; - { - struct rexp_node * push0 - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_push0); - struct rexp_node * start_one_iter - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)(long)iter_se); - struct rexp_node * phase1 - = rx_mk_r_concat (&rxb->rx, start_one_iter, - *last_expression); - struct rexp_node * pushback - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)re_se_pushback); - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * lit_t - = rx_mk_r_cset (&rxb->rx, cs); - struct rexp_node * phase2 - = rx_mk_r_concat (&rxb->rx, pushback, lit_t); - struct rexp_node * loop - = rx_mk_r_2phase_star (&rxb->rx, phase1, phase2); - struct rexp_node * push_n_loop - = rx_mk_r_concat (&rxb->rx, push0, loop); - struct rexp_node * final_test - = rx_mk_r_side_effect (&rxb->rx, - (rx_side_effect)(long)end_se); - struct rexp_node * full_exp - = rx_mk_r_concat (&rxb->rx, push_n_loop, final_test); - - if (!(push0 && start_one_iter && phase1 - && pushback && lit_t && phase2 - && loop && push_n_loop && final_test && full_exp)) - return REG_ESPACE; - - RX_bitset_enjoin(cs, 't'); - - *last_expression = full_exp; - } - } - beg_interval = 0; - } - break; - - unfetch_interval: - /* If an invalid interval, match the characters as literals. */ - p = beg_interval; - beg_interval = 0; - - /* normal_char and normal_backslash need `c'. */ - PATFETCH (c); - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (p > pattern && p[-1] == '\\') - goto normal_backslash; - } - goto normal_char; - -#ifdef emacs - /* There is no way to specify the before_dot and after_dot - operators. rms says this is ok. --karl */ - case '=': - side = (rx_side_effect)rx_se_at_dot; - goto add_side_effect; - break; - - case 's': - case 'S': - { - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * set = rx_mk_r_cset (&rxb->rx, cs); - if (!(cs && set)) - return REG_ESPACE; - if (c == 'S') - rx_bitset_universe (rxb->rx.local_cset_size, cs); - - PATFETCH (c); - { - int x; - enum syntaxcode code = syntax_spec_code [c]; - for (x = 0; x < 256; ++x) - { - - if (SYNTAX (x) == code) - { - rx_Bitset it = - inverse_translation (rxb, validate_inv_tr, - inverse_translate, - translate, x); - rx_bitset_xor (rxb->rx.local_cset_size, cs, it); - } - } - } - append = set; - goto append_node; - } - break; -#endif /* emacs */ - - - case 'w': - case 'W': - { - rx_Bitset cs = rx_cset (&rxb->rx); - struct rexp_node * n = (cs ? rx_mk_r_cset (&rxb->rx, cs) : 0); - if (!(cs && n)) - return REG_ESPACE; - if (c == 'W') - rx_bitset_universe (rxb->rx.local_cset_size ,cs); - { - int x; - for (x = rxb->rx.local_cset_size - 1; x > 0; --x) - if (SYNTAX(x) & Sword) - RX_bitset_toggle (cs, x); - } - append = n; - goto append_node; - } - break; - -/* With a little extra work, some of these side effects could be optimized - * away (basicly by looking at what we already know about the surrounding - * chars). - */ - case '<': - side = (rx_side_effect)re_se_wordbeg; - goto add_side_effect; - break; - - case '>': - side = (rx_side_effect)re_se_wordend; - goto add_side_effect; - break; - - case 'b': - side = (rx_side_effect)re_se_wordbound; - goto add_side_effect; - break; - - case 'B': - side = (rx_side_effect)re_se_notwordbound; - goto add_side_effect; - break; - - case '`': - side = (rx_side_effect)re_se_begbuf; - goto add_side_effect; - break; - - case '\'': - side = (rx_side_effect)re_se_endbuf; - goto add_side_effect; - break; - - add_side_effect: - { - struct rexp_node * se - = rx_mk_r_side_effect (&rxb->rx, side); - if (!se) - return REG_ESPACE; - append = se; - goto append_node; - } - break; - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - if (syntax & RE_NO_BK_REFS) - goto normal_char; - - c1 = c - '0'; - - if (c1 > regnum) - return REG_ESUBREG; - - /* Can't back reference to a subexpression if inside of it. */ - if (group_in_compile_stack (compile_stack, c1)) - return REG_ESUBREG; - - { - int backref_se = paramc; - params = (params - ? ((struct re_se_params *) - realloc (params, - sizeof (*params) * (1 + paramc))) - : ((struct re_se_params *) - malloc (sizeof (*params)))); - if (!params) - return REG_ESPACE; - ++paramc; - params[backref_se].se = re_se_backref; - params[backref_se].op1 = c1; - side = (rx_side_effect)(long)backref_se; - goto add_side_effect; - } - break; - - case '+': - case '?': - if (syntax & RE_BK_PLUS_QM) - goto handle_plus; - else - goto normal_backslash; - - default: - normal_backslash: - /* You might think it would be useful for \ to mean - not to translate; but if we don't translate it - it will never match anything. */ - c = TRANSLATE (c); - goto normal_char; - } - break; - - - default: - /* Expects the character in `c'. */ - normal_char: - { - rx_Bitset cs = rx_cset(&rxb->rx); - struct rexp_node * match = rx_mk_r_cset (&rxb->rx, cs); - rx_Bitset it; - if (!(cs && match)) - return REG_ESPACE; - it = inverse_translation (rxb, validate_inv_tr, - inverse_translate, translate, c); - rx_bitset_union (CHAR_SET_SIZE, cs, it); - append = match; - - append_node: - /* This genericly appends the rexp APPEND to *LAST_EXPRESSION - * and then parses the next character normally. - */ - if (*last_expression) - { - struct rexp_node * concat - = rx_mk_r_concat (&rxb->rx, *last_expression, append); - if (!concat) - return REG_ESPACE; - *last_expression = concat; - last_expression = &concat->params.pair.right; - } - else - *last_expression = append; - } - } /* switch (c) */ - } /* while p != pend */ - - - { - int win_se = paramc; - params = (params - ? ((struct re_se_params *) - realloc (params, - sizeof (*params) * (1 + paramc))) - : ((struct re_se_params *) - malloc (sizeof (*params)))); - if (!params) - return REG_ESPACE; - ++paramc; - params[win_se].se = re_se_win; - { - struct rexp_node * se - = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)(long)win_se); - struct rexp_node * concat - = rx_mk_r_concat (&rxb->rx, rexp, se); - if (!(se && concat)) - return REG_ESPACE; - rexp = concat; - } - } - - - /* Through the pattern now. */ - - if (!COMPILE_STACK_EMPTY) - return REG_EPAREN; - - free (compile_stack.stack); - - orig_rexp = rexp; -#ifdef RX_DEBUG - if (rx_debug_compile) - { - dbug_rxb = rxb; - fputs ("\n\nCompiling ", stdout); - fwrite (pattern, 1, size, stdout); - fputs (":\n", stdout); - rxb->se_params = params; - print_rexp (&rxb->rx, orig_rexp, 2, re_seprint, stdout); - } -#endif - { - rx_Bitset cs = rx_cset(&rxb->rx); - rx_Bitset cs2 = rx_cset(&rxb->rx); - char * se_map = (char *) alloca (paramc); - struct rexp_node * new_rexp = 0; - - - bzero (se_map, paramc); - find_backrefs (se_map, rexp, params); - fewer_side_effects = - remove_unecessary_side_effects (&rxb->rx, se_map, - rx_copy_rexp (&rxb->rx, rexp), params); - - speed_up_alt (&rxb->rx, rexp, 0); - speed_up_alt (&rxb->rx, fewer_side_effects, 1); - - { - char * syntax_parens = rxb->syntax_parens; - if (syntax_parens == (char *)0x1) - rexp = remove_unecessary_side_effects - (&rxb->rx, se_map, rexp, params); - else if (syntax_parens) - { - int x; - for (x = 0; x < paramc; ++x) - if (( (params[x].se == re_se_lparen) - || (params[x].se == re_se_rparen)) - && (!syntax_parens [params[x].op1])) - se_map [x] = 1; - rexp = remove_unecessary_side_effects - (&rxb->rx, se_map, rexp, params); - } - } - - /* At least one more optimization would be nice to have here but i ran out - * of time. The idea would be to delay side effects. - * For examle, `(abc)' is the same thing as `abc()' except that the - * left paren is offset by 3 (which we know at compile time). - * (In this comment, write that second pattern `abc(:3:)' - * where `(:3:' is a syntactic unit.) - * - * Trickier: `(abc|defg)' is the same as `(abc(:3:|defg(:4:))' - * (The paren nesting may be hard to follow -- that's an alternation - * of `abc(:3:' and `defg(:4:' inside (purely syntactic) parens - * followed by the closing paren from the original expression.) - * - * Neither the expression tree representation nor the the nfa make - * this very easy to write. :( - */ - - /* What we compile is different than what the parser returns. - * Suppose the parser returns expression R. - * Let R' be R with unnecessary register assignments removed - * (see REMOVE_UNECESSARY_SIDE_EFFECTS, above). - * - * What we will compile is the expression: - * - * m{try}R{win}\|s{try}R'{win} - * - * {try} and {win} denote side effect epsilons (see EXPLORE_FUTURE). - * - * When trying a match, we insert an `m' at the beginning of the - * string if the user wants registers to be filled, `s' if not. - */ - new_rexp = - rx_mk_r_alternate - (&rxb->rx, - rx_mk_r_concat (&rxb->rx, rx_mk_r_cset (&rxb->rx, cs2), rexp), - rx_mk_r_concat (&rxb->rx, - rx_mk_r_cset (&rxb->rx, cs), fewer_side_effects)); - - if (!(new_rexp && cs && cs2)) - return REG_ESPACE; - RX_bitset_enjoin (cs2, '\0'); /* prefixed to the rexp used for matching. */ - RX_bitset_enjoin (cs, '\1'); /* prefixed to the rexp used for searching. */ - rexp = new_rexp; - } - -#ifdef RX_DEBUG - if (rx_debug_compile) - { - fputs ("\n...which is compiled as:\n", stdout); - print_rexp (&rxb->rx, rexp, 2, re_seprint, stdout); - } -#endif - { - struct rx_nfa_state *start = 0; - struct rx_nfa_state *end = 0; - - if (!rx_build_nfa (&rxb->rx, rexp, &start, &end)) - return REG_ESPACE; /* */ - else - { - void * mem = (void *)rxb->buffer; - unsigned long size = rxb->allocated; - int start_id; - char * perm_mem; - int iterator_size = paramc * sizeof (params[0]); - - end->is_final = 1; - start->is_start = 1; - rx_name_nfa_states (&rxb->rx); - start_id = start->id; -#ifdef RX_DEBUG - if (rx_debug_compile) - { - fputs ("...giving the NFA: \n", stdout); - dbug_rxb = rxb; - print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout); - } -#endif - if (!rx_eclose_nfa (&rxb->rx)) - return REG_ESPACE; - else - { - rx_delete_epsilon_transitions (&rxb->rx); - - /* For compatability reasons, we need to shove the - * compiled nfa into one chunk of malloced memory. - */ - rxb->rx.reserved = ( sizeof (params[0]) * paramc - + rx_sizeof_bitset (rxb->rx.local_cset_size)); -#ifdef RX_DEBUG - if (rx_debug_compile) - { - dbug_rxb = rxb; - fputs ("...which cooks down (uncompactified) to: \n", stdout); - print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout); - } -#endif - if (!rx_compactify_nfa (&rxb->rx, &mem, &size)) - return REG_ESPACE; - rxb->buffer = mem; - rxb->allocated = size; - rxb->rx.buffer = mem; - rxb->rx.allocated = size; - perm_mem = ((char *)rxb->rx.buffer - + rxb->rx.allocated - rxb->rx.reserved); - rxb->se_params = ((struct re_se_params *)perm_mem); - bcopy (params, rxb->se_params, iterator_size); - perm_mem += iterator_size; - rxb->fastset = (rx_Bitset) perm_mem; - rxb->start = rx_id_to_nfa_state (&rxb->rx, start_id); - } - rx_bitset_null (rxb->rx.local_cset_size, rxb->fastset); - rxb->can_match_empty = compute_fastset (rxb, orig_rexp); - rxb->match_regs_on_stack = - registers_on_stack (rxb, orig_rexp, 0, params); - rxb->search_regs_on_stack = - registers_on_stack (rxb, fewer_side_effects, 0, params); - if (rxb->can_match_empty) - rx_bitset_universe (rxb->rx.local_cset_size, rxb->fastset); - rxb->is_anchored = is_anchored (orig_rexp, (rx_side_effect) re_se_hat); - rxb->begbuf_only = is_anchored (orig_rexp, - (rx_side_effect) re_se_begbuf); - } - rx_free_rexp (&rxb->rx, rexp); - if (params) - free (params); -#ifdef RX_DEBUG - if (rx_debug_compile) - { - dbug_rxb = rxb; - fputs ("...which cooks down to: \n", stdout); - print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout); - } -#endif - } - return REG_NOERROR; -} - - - -/* This table gives an error message for each of the error codes listed - in regex.h. Obviously the order here has to be same as there. */ - -__const__ char * rx_error_msg[] = -{ 0, /* REG_NOERROR */ - "No match", /* REG_NOMATCH */ - "Invalid regular expression", /* REG_BADPAT */ - "Invalid collation character", /* REG_ECOLLATE */ - "Invalid character class name", /* REG_ECTYPE */ - "Trailing backslash", /* REG_EESCAPE */ - "Invalid back reference", /* REG_ESUBREG */ - "Unmatched [ or [^", /* REG_EBRACK */ - "Unmatched ( or \\(", /* REG_EPAREN */ - "Unmatched \\{", /* REG_EBRACE */ - "Invalid content of \\{\\}", /* REG_BADBR */ - "Invalid range end", /* REG_ERANGE */ - "Memory exhausted", /* REG_ESPACE */ - "Invalid preceding regular expression", /* REG_BADRPT */ - "Premature end of regular expression", /* REG_EEND */ - "Regular expression too big", /* REG_ESIZE */ - "Unmatched ) or \\)", /* REG_ERPAREN */ -}; - - - - -char rx_slowmap [256] = -{ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -#ifdef __STDC__ -RX_DECL void -rx_blow_up_fastmap (struct re_pattern_buffer * rxb) -#else -RX_DECL void -rx_blow_up_fastmap (rxb) - struct re_pattern_buffer * rxb; -#endif -{ - int x; - for (x = 0; x < 256; ++x) /* &&&& 3.6 % */ - rxb->fastmap [x] = !!RX_bitset_member (rxb->fastset, x); - rxb->fastmap_accurate = 1; -} - - - - -#if !defined(REGEX_MALLOC) && !defined(__GNUC__) -#define RE_SEARCH_2_FN inner_re_search_2 -#define RE_S2_QUAL static -#else -#define RE_SEARCH_2_FN re_search_2 -#define RE_S2_QUAL -#endif - -struct re_search_2_closure -{ - __const__ char * string1; - int size1; - __const__ char * string2; - int size2; -}; - - -static __inline__ enum rx_get_burst_return -re_search_2_get_burst (pos, vclosure, stop) - struct rx_string_position * pos; - void * vclosure; - int stop; -{ - struct re_search_2_closure * closure; - closure = (struct re_search_2_closure *)vclosure; - if (!closure->string2) - { - int inset; - - inset = pos->pos - pos->string; - if ((inset < -1) || (inset > closure->size1)) - return rx_get_burst_no_more; - else - { - pos->pos = (__const__ unsigned char *) closure->string1 + inset; - pos->string = (__const__ unsigned char *) closure->string1; - pos->size = closure->size1; - pos->end = ((__const__ unsigned char *) - MIN(closure->string1 + closure->size1, - closure->string1 + stop)); - pos->offset = 0; - return ((pos->pos < pos->end) - ? rx_get_burst_ok - : rx_get_burst_no_more); - } - } - else if (!closure->string1) - { - int inset; - - inset = pos->pos - pos->string; - pos->pos = (__const__ unsigned char *) closure->string2 + inset; - pos->string = (__const__ unsigned char *) closure->string2; - pos->size = closure->size2; - pos->end = ((__const__ unsigned char *) - MIN(closure->string2 + closure->size2, - closure->string2 + stop)); - pos->offset = 0; - return ((pos->pos < pos->end) - ? rx_get_burst_ok - : rx_get_burst_no_more); - } - else - { - int inset; - - inset = pos->pos - pos->string + pos->offset; - if (inset < closure->size1) - { - pos->pos = (__const__ unsigned char *) closure->string1 + inset; - pos->string = (__const__ unsigned char *) closure->string1; - pos->size = closure->size1; - pos->end = ((__const__ unsigned char *) - MIN(closure->string1 + closure->size1, - closure->string1 + stop)); - pos->offset = 0; - return rx_get_burst_ok; - } - else - { - pos->pos = ((__const__ unsigned char *) - closure->string2 + inset - closure->size1); - pos->string = (__const__ unsigned char *) closure->string2; - pos->size = closure->size2; - pos->end = ((__const__ unsigned char *) - MIN(closure->string2 + closure->size2, - closure->string2 + stop - closure->size1)); - pos->offset = closure->size1; - return ((pos->pos < pos->end) - ? rx_get_burst_ok - : rx_get_burst_no_more); - } - } -} - - -static __inline__ enum rx_back_check_return -re_search_2_back_check (pos, lparen, rparen, translate, vclosure, stop) - struct rx_string_position * pos; - int lparen; - int rparen; - unsigned char * translate; - void * vclosure; - int stop; -{ - struct rx_string_position there; - struct rx_string_position past; - - there = *pos; - there.pos = there.string + lparen - there.offset; - re_search_2_get_burst (&there, vclosure, stop); - - past = *pos; - past.pos = past.string + rparen - there.offset; - re_search_2_get_burst (&past, vclosure, stop); - - ++pos->pos; - re_search_2_get_burst (pos, vclosure, stop); - - while ( (there.pos != past.pos) - && (pos->pos != pos->end)) - if (TRANSLATE(*there.pos) != TRANSLATE(*pos->pos)) - return rx_back_check_fail; - else - { - ++there.pos; - ++pos->pos; - if (there.pos == there.end) - re_search_2_get_burst (&there, vclosure, stop); - if (pos->pos == pos->end) - re_search_2_get_burst (pos, vclosure, stop); - } - - if (there.pos != past.pos) - return rx_back_check_fail; - --pos->pos; - re_search_2_get_burst (pos, vclosure, stop); - return rx_back_check_pass; -} - -static __inline__ int -re_search_2_fetch_char (pos, offset, app_closure, stop) - struct rx_string_position * pos; - int offset; - void * app_closure; - int stop; -{ - struct re_search_2_closure * closure; - closure = (struct re_search_2_closure *)app_closure; - if (offset == 0) - { - if (pos->pos >= pos->string) - return *pos->pos; - else - { - if ( (pos->string == (__const__ unsigned char *) closure->string2) - && (closure->string1) - && (closure->size1)) - return closure->string1[closure->size1 - 1]; - else - return 0; /* sure, why not. */ - } - } - if (pos->pos == pos->end) - return *closure->string2; - else - return pos->pos[1]; -} - - -#ifdef __STDC__ -RE_S2_QUAL int -RE_SEARCH_2_FN (struct re_pattern_buffer *rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int startpos, int range, - struct re_registers *regs, - int stop) -#else -RE_S2_QUAL int -RE_SEARCH_2_FN (rxb, - string1, size1, string2, size2, startpos, range, regs, stop) - struct re_pattern_buffer *rxb; - __const__ char * string1; - int size1; - __const__ char * string2; - int size2; - int startpos; - int range; - struct re_registers *regs; - int stop; -#endif -{ - int answer; - struct re_search_2_closure closure; - closure.string1 = string1; - closure.size1 = size1; - closure.string2 = string2; - closure.size2 = size2; - answer = rx_search (rxb, startpos, range, stop, size1 + size2, - re_search_2_get_burst, - re_search_2_back_check, - re_search_2_fetch_char, - (void *)&closure, - regs, - 0, - 0); - switch (answer) - { - case rx_search_continuation: - abort (); - case rx_search_error: - return -2; - case rx_search_soft_fail: - case rx_search_fail: - return -1; - default: - return answer; - } -} - -/* Export rx_search to callers outside this file. */ - -int -re_rx_search (rxb, startpos, range, stop, total_size, - get_burst, back_check, fetch_char, - app_closure, regs, resume_state, save_state) - struct re_pattern_buffer * rxb; - int startpos; - int range; - int stop; - int total_size; - rx_get_burst_fn get_burst; - rx_back_check_fn back_check; - rx_fetch_char_fn fetch_char; - void * app_closure; - struct re_registers * regs; - struct rx_search_state * resume_state; - struct rx_search_state * save_state; -{ - return rx_search (rxb, startpos, range, stop, total_size, - get_burst, back_check, fetch_char, app_closure, - regs, resume_state, save_state); -} - -#if !defined(REGEX_MALLOC) && !defined(__GNUC__) -#ifdef __STDC__ -int -re_search_2 (struct re_pattern_buffer *rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int startpos, int range, - struct re_registers *regs, - int stop) -#else -int -re_search_2 (rxb, string1, size1, string2, size2, startpos, range, regs, stop) - struct re_pattern_buffer *rxb; - __const__ char * string1; - int size1; - __const__ char * string2; - int size2; - int startpos; - int range; - struct re_registers *regs; - int stop; -#endif -{ - int ret; - ret = inner_re_search_2 (rxb, string1, size1, string2, size2, startpos, - range, regs, stop); - alloca (0); - return ret; -} -#endif - - -/* Like re_search_2, above, but only one string is specified, and - * doesn't let you say where to stop matching. - */ - -#ifdef __STDC__ -int -re_search (struct re_pattern_buffer * rxb, __const__ char *string, - int size, int startpos, int range, - struct re_registers *regs) -#else -int -re_search (rxb, string, size, startpos, range, regs) - struct re_pattern_buffer * rxb; - __const__ char * string; - int size; - int startpos; - int range; - struct re_registers *regs; -#endif -{ - return re_search_2 (rxb, 0, 0, string, size, startpos, range, regs, size); -} - -#ifdef __STDC__ -int -re_match_2 (struct re_pattern_buffer * rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int pos, struct re_registers *regs, int stop) -#else -int -re_match_2 (rxb, string1, size1, string2, size2, pos, regs, stop) - struct re_pattern_buffer * rxb; - __const__ char * string1; - int size1; - __const__ char * string2; - int size2; - int pos; - struct re_registers *regs; - int stop; -#endif -{ - struct re_registers some_regs; - regoff_t start; - regoff_t end; - int srch; - int save = rxb->regs_allocated; - struct re_registers * regs_to_pass = regs; - - if (!regs) - { - some_regs.start = &start; - some_regs.end = &end; - some_regs.num_regs = 1; - regs_to_pass = &some_regs; - rxb->regs_allocated = REGS_FIXED; - } - - srch = re_search_2 (rxb, string1, size1, string2, size2, - pos, 1, regs_to_pass, stop); - if (regs_to_pass != regs) - rxb->regs_allocated = save; - if (srch < 0) - return srch; - return regs_to_pass->end[0] - regs_to_pass->start[0]; -} - -/* re_match is like re_match_2 except it takes only a single string. */ - -#ifdef __STDC__ -int -re_match (struct re_pattern_buffer * rxb, - __const__ char * string, - int size, int pos, - struct re_registers *regs) -#else -int -re_match (rxb, string, size, pos, regs) - struct re_pattern_buffer * rxb; - __const__ char *string; - int size; - int pos; - struct re_registers *regs; -#endif -{ - return re_match_2 (rxb, string, size, 0, 0, pos, regs, size); -} - - - -/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can - also be assigned to arbitrarily: each pattern buffer stores its own - syntax, so it can be changed between regex compilations. */ -reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS; - - -/* Specify the precise syntax of regexps for compilation. This provides - for compatibility for various utilities which historically have - different, incompatible syntaxes. - - The argument SYNTAX is a bit mask comprised of the various bits - defined in regex.h. We return the old syntax. */ - -#ifdef __STDC__ -reg_syntax_t -re_set_syntax (reg_syntax_t syntax) -#else -reg_syntax_t -re_set_syntax (syntax) - reg_syntax_t syntax; -#endif -{ - reg_syntax_t ret = re_syntax_options; - - re_syntax_options = syntax; - return ret; -} - - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use - this memory for recording register information. STARTS and ENDS - must be allocated using the malloc library routine, and must each - be at least NUM_REGS * sizeof (regoff_t) bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ - -#ifdef __STDC__ -void -re_set_registers (struct re_pattern_buffer *bufp, - struct re_registers *regs, - unsigned num_regs, - regoff_t * starts, regoff_t * ends) -#else -void -re_set_registers (bufp, regs, num_regs, starts, ends) - struct re_pattern_buffer *bufp; - struct re_registers *regs; - unsigned num_regs; - regoff_t * starts; - regoff_t * ends; -#endif -{ - if (num_regs) - { - bufp->regs_allocated = REGS_REALLOCATE; - regs->num_regs = num_regs; - regs->start = starts; - regs->end = ends; - } - else - { - bufp->regs_allocated = REGS_UNALLOCATED; - regs->num_regs = 0; - regs->start = regs->end = (regoff_t) 0; - } -} - - - - -#ifdef __STDC__ -static int -cplx_se_sublist_len (struct rx_se_list * list) -#else -static int -cplx_se_sublist_len (list) - struct rx_se_list * list; -#endif -{ - int x = 0; - while (list) - { - if ((long)list->car >= 0) - ++x; - list = list->cdr; - } - return x; -} - - -/* For rx->se_list_cmp */ - -#ifdef __STDC__ -static int -posix_se_list_order (struct rx * rx, - struct rx_se_list * a, struct rx_se_list * b) -#else -static int -posix_se_list_order (rx, a, b) - struct rx * rx; - struct rx_se_list * a; - struct rx_se_list * b; -#endif -{ - int al = cplx_se_sublist_len (a); - int bl = cplx_se_sublist_len (b); - - if (!al && !bl) - return ((a == b) - ? 0 - : ((a < b) ? -1 : 1)); - - else if (!al) - return -1; - - else if (!bl) - return 1; - - else - { - rx_side_effect * av = ((rx_side_effect *) - alloca (sizeof (rx_side_effect) * (al + 1))); - rx_side_effect * bv = ((rx_side_effect *) - alloca (sizeof (rx_side_effect) * (bl + 1))); - struct rx_se_list * ap = a; - struct rx_se_list * bp = b; - int ai, bi; - - for (ai = al - 1; ai >= 0; --ai) - { - while ((long)ap->car < 0) - ap = ap->cdr; - av[ai] = ap->car; - ap = ap->cdr; - } - av[al] = (rx_side_effect)-2; - for (bi = bl - 1; bi >= 0; --bi) - { - while ((long)bp->car < 0) - bp = bp->cdr; - bv[bi] = bp->car; - bp = bp->cdr; - } - bv[bl] = (rx_side_effect)-1; - - { - int ret; - int x = 0; - while (av[x] == bv[x]) - ++x; - ret = (((unsigned *)(av[x]) < (unsigned *)(bv[x])) ? -1 : 1); - return ret; - } - } -} - - - - -/* re_compile_pattern is the GNU regular expression compiler: it - compiles PATTERN (of length SIZE) and puts the result in RXB. - Returns 0 if the pattern was valid, otherwise an error string. - - Assumes the `allocated' (and perhaps `buffer') and `translate' fields - are set in RXB on entry. - - We call rx_compile to do the actual compilation. */ - -#ifdef __STDC__ -__const__ char * -re_compile_pattern (__const__ char *pattern, - int length, - struct re_pattern_buffer * rxb) -#else -__const__ char * -re_compile_pattern (pattern, length, rxb) - __const__ char *pattern; - int length; - struct re_pattern_buffer * rxb; -#endif -{ - reg_errcode_t ret; - - /* GNU code is written to assume at least RE_NREGS registers will be set - (and at least one extra will be -1). */ - rxb->regs_allocated = REGS_UNALLOCATED; - - /* And GNU code determines whether or not to get register information - by passing null for the REGS argument to re_match, etc., not by - setting no_sub. */ - rxb->no_sub = 0; - - rxb->rx.local_cset_size = 256; - - /* Match anchors at newline. */ - rxb->newline_anchor = 1; - - rxb->re_nsub = 0; - rxb->start = 0; - rxb->se_params = 0; - rxb->rx.nodec = 0; - rxb->rx.epsnodec = 0; - rxb->rx.instruction_table = 0; - rxb->rx.nfa_states = 0; - rxb->rx.se_list_cmp = posix_se_list_order; - rxb->rx.start_set = 0; - - ret = rx_compile (pattern, length, re_syntax_options, rxb); - alloca (0); - return rx_error_msg[(int) ret]; -} - - - -#ifdef __STDC__ -int -re_compile_fastmap (struct re_pattern_buffer * rxb) -#else -int -re_compile_fastmap (rxb) - struct re_pattern_buffer * rxb; -#endif -{ - rx_blow_up_fastmap (rxb); - return 0; -} - - - - -/* Entry points compatible with 4.2 BSD regex library. We don't define - them if this is an Emacs or POSIX compilation. */ - -/* Don't build them for libg++ either. This is a temporary measure - * until the functions are moved to another file and reconditionalized. - */ -#if 0 -/* #if (!defined (emacs) && !defined (_POSIX_SOURCE)) || defined(USE_BSD_REGEX) */ - -/* BSD has one and only one pattern buffer. */ -static struct re_pattern_buffer rx_comp_buf; - -#ifdef __STDC__ -char * -re_comp (__const__ char *s) -#else -char * -re_comp (s) - __const__ char *s; -#endif -{ - reg_errcode_t ret; - - if (!s || (*s == '\0')) - { - if (!rx_comp_buf.buffer) - return "No previous regular expression"; - return 0; - } - - if (!rx_comp_buf.fastmap) - { - rx_comp_buf.fastmap = (char *) malloc (1 << CHARBITS); - if (!rx_comp_buf.fastmap) - return "Memory exhausted"; - } - - /* Since `rx_exec' always passes NULL for the `regs' argument, we - don't need to initialize the pattern buffer fields which affect it. */ - - /* Match anchors at newlines. */ - rx_comp_buf.newline_anchor = 1; - - rx_comp_buf.fastmap_accurate = 0; - rx_comp_buf.re_nsub = 0; - rx_comp_buf.start = 0; - rx_comp_buf.se_params = 0; - rx_comp_buf.rx.nodec = 0; - rx_comp_buf.rx.epsnodec = 0; - rx_comp_buf.rx.instruction_table = 0; - rx_comp_buf.rx.nfa_states = 0; - rx_comp_buf.rx.start = 0; - rx_comp_buf.rx.se_list_cmp = posix_se_list_order; - rx_comp_buf.rx.start_set = 0; - rx_comp_buf.rx.local_cset_size = 256; - - ret = rx_compile (s, strlen (s), re_syntax_options, &rx_comp_buf); - alloca (0); - - /* Yes, we're discarding `__const__' here. */ - return (char *) rx_error_msg[(int) ret]; -} - - -#ifdef __STDC__ -int -re_exec (__const__ char *s) -#else -int -re_exec (s) - __const__ char *s; -#endif -{ - __const__ int len = strlen (s); - return - 0 <= re_search (&rx_comp_buf, s, len, 0, len, (struct re_registers *) 0); -} -#endif /* not emacs and not _POSIX_SOURCE */ - - - -/* POSIX.2 functions. Don't define these for Emacs. */ - -/* For now we leave these out, because regex_t is not binary - compatible with the implementation in other systems. */ -#if 0 /*!defined(emacs)*/ - -/* regcomp takes a regular expression as a string and compiles it. - - PREG is a regex_t *. We do not expect any fields to be initialized, - since POSIX says we shouldn't. Thus, we set - - `buffer' to the compiled pattern; - `used' to the length of the compiled pattern; - `syntax' to RE_SYNTAX_POSIX_EXTENDED if the - REG_EXTENDED bit in CFLAGS is set; otherwise, to - RE_SYNTAX_POSIX_BASIC; - `newline_anchor' to REG_NEWLINE being set in CFLAGS; - `fastmap' and `fastmap_accurate' to zero; - `re_nsub' to the number of subexpressions in PATTERN. - - PATTERN is the address of the pattern string. - - CFLAGS is a series of bits which affect compilation. - - If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we - use POSIX basic syntax. - - If REG_NEWLINE is set, then . and [^...] don't match newline. - Also, regexec will try a match beginning after every newline. - - If REG_ICASE is set, then we considers upper- and lowercase - versions of letters to be equivalent when matching. - - If REG_NOSUB is set, then when PREG is passed to regexec, that - routine will report only success or failure, and nothing about the - registers. - - It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for - the return codes and their meanings.) */ - - -#ifdef __STDC__ -int -regcomp (regex_t * preg, __const__ char * pattern, int cflags) -#else -int -regcomp (preg, pattern, cflags) - regex_t * preg; - __const__ char * pattern; - int cflags; -#endif -{ - reg_errcode_t ret; - unsigned syntax - = cflags & REG_EXTENDED ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; - - /* regex_compile will allocate the space for the compiled pattern. */ - preg->buffer = 0; - preg->allocated = 0; - preg->fastmap = malloc (256); - if (!preg->fastmap) - return REG_ESPACE; - preg->fastmap_accurate = 0; - - if (cflags & REG_ICASE) - { - unsigned i; - - preg->translate = (unsigned char *) malloc (256); - if (!preg->translate) - return (int) REG_ESPACE; - - /* Map uppercase characters to corresponding lowercase ones. */ - for (i = 0; i < CHAR_SET_SIZE; i++) - preg->translate[i] = isupper (i) ? tolower (i) : i; - } - else - preg->translate = 0; - - /* If REG_NEWLINE is set, newlines are treated differently. */ - if (cflags & REG_NEWLINE) - { /* REG_NEWLINE implies neither . nor [^...] match newline. */ - syntax &= ~RE_DOT_NEWLINE; - syntax |= RE_HAT_LISTS_NOT_NEWLINE; - /* It also changes the matching behavior. */ - preg->newline_anchor = 1; - } - else - preg->newline_anchor = 0; - - preg->no_sub = !!(cflags & REG_NOSUB); - - /* POSIX says a null character in the pattern terminates it, so we - can use strlen here in compiling the pattern. */ - preg->re_nsub = 0; - preg->start = 0; - preg->se_params = 0; - preg->syntax_parens = 0; - preg->rx.nodec = 0; - preg->rx.epsnodec = 0; - preg->rx.instruction_table = 0; - preg->rx.nfa_states = 0; - preg->rx.local_cset_size = 256; - preg->rx.start = 0; - preg->rx.se_list_cmp = posix_se_list_order; - preg->rx.start_set = 0; - ret = rx_compile (pattern, strlen (pattern), syntax, preg); - alloca (0); - - /* POSIX doesn't distinguish between an unmatched open-group and an - unmatched close-group: both are REG_EPAREN. */ - if (ret == REG_ERPAREN) ret = REG_EPAREN; - - return (int) ret; -} - - -/* regexec searches for a given pattern, specified by PREG, in the - string STRING. - - If NMATCH is zero or REG_NOSUB was set in the cflags argument to - `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at - least NMATCH elements, and we set them to the offsets of the - corresponding matched substrings. - - EFLAGS specifies `execution flags' which affect matching: if - REG_NOTBOL is set, then ^ does not match at the beginning of the - string; if REG_NOTEOL is set, then $ does not match at the end. - - We return 0 if we find a match and REG_NOMATCH if not. */ - -#ifdef __STDC__ -int -regexec (__const__ regex_t *preg, __const__ char *string, - size_t nmatch, regmatch_t pmatch[], - int eflags) -#else -int -regexec (preg, string, nmatch, pmatch, eflags) - __const__ regex_t *preg; - __const__ char *string; - size_t nmatch; - regmatch_t pmatch[]; - int eflags; -#endif -{ - int ret; - struct re_registers regs; - regex_t private_preg; - int len = strlen (string); - boolean want_reg_info = !preg->no_sub && nmatch > 0; - - private_preg = *preg; - - private_preg.not_bol = !!(eflags & REG_NOTBOL); - private_preg.not_eol = !!(eflags & REG_NOTEOL); - - /* The user has told us exactly how many registers to return - * information about, via `nmatch'. We have to pass that on to the - * matching routines. - */ - private_preg.regs_allocated = REGS_FIXED; - - if (want_reg_info) - { - regs.num_regs = nmatch; - regs.start = (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t))); - regs.end = (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t))); - if (regs.start == 0 || regs.end == 0) - return (int) REG_NOMATCH; - } - - /* Perform the searching operation. */ - ret = re_search (&private_preg, - string, len, - /* start: */ 0, - /* range: */ len, - want_reg_info ? ®s : (struct re_registers *) 0); - - /* Copy the register information to the POSIX structure. */ - if (want_reg_info) - { - if (ret >= 0) - { - unsigned r; - - for (r = 0; r < nmatch; r++) - { - pmatch[r].rm_so = regs.start[r]; - pmatch[r].rm_eo = regs.end[r]; - } - } - - /* If we needed the temporary register info, free the space now. */ - free (regs.start); - free (regs.end); - } - - /* We want zero return to mean success, unlike `re_search'. */ - return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; -} - - -/* Returns a message corresponding to an error code, ERRCODE, returned - from either regcomp or regexec. */ - -#ifdef __STDC__ -size_t -regerror (int errcode, __const__ regex_t *preg, - char *errbuf, size_t errbuf_size) -#else -size_t -regerror (errcode, preg, errbuf, errbuf_size) - int errcode; - __const__ regex_t *preg; - char *errbuf; - size_t errbuf_size; -#endif -{ - __const__ char *msg - = rx_error_msg[errcode] == 0 ? "Success" : rx_error_msg[errcode]; - size_t msg_size = strlen (msg) + 1; /* Includes the 0. */ - - if (errbuf_size != 0) - { - if (msg_size > errbuf_size) - { - strncpy (errbuf, msg, errbuf_size - 1); - errbuf[errbuf_size - 1] = 0; - } - else - strcpy (errbuf, msg); - } - - return msg_size; -} - - -/* Free dynamically allocated space used by PREG. */ - -#ifdef __STDC__ -void -regfree (regex_t *preg) -#else -void -regfree (preg) - regex_t *preg; -#endif -{ - if (preg->buffer != 0) - free (preg->buffer); - preg->buffer = 0; - preg->allocated = 0; - - if (preg->fastmap != 0) - free (preg->fastmap); - preg->fastmap = 0; - preg->fastmap_accurate = 0; - - if (preg->translate != 0) - free (preg->translate); - preg->translate = 0; -} - -#endif /* not emacs */ diff --git a/gnu/lib/libg++/librx/rx.h b/gnu/lib/libg++/librx/rx.h deleted file mode 100644 index 41ebb753277..00000000000 --- a/gnu/lib/libg++/librx/rx.h +++ /dev/null @@ -1,3732 +0,0 @@ -#if !defined(RXH) || defined(RX_WANT_SE_DEFS) -#define RXH - -/* Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -This file is part of the librx library. - -Librx is free software; you can redistribute it and/or modify it under -the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -Librx is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU Library General Public -License along with this software; see the file COPYING.LIB. If not, -write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA -02139, USA. */ -/* t. lord Wed Sep 23 18:20:57 1992 */ - - - - - - - - -#ifndef RX_WANT_SE_DEFS - -/* This page: Bitsets */ - -#ifndef RX_subset -typedef unsigned int RX_subset; -#define RX_subset_bits (32) -#define RX_subset_mask (RX_subset_bits - 1) -#endif - -typedef RX_subset * rx_Bitset; - -#ifdef __STDC__ -typedef void (*rx_bitset_iterator) (void *, int member_index); -#else -typedef void (*rx_bitset_iterator) (); -#endif - -#define rx_bitset_subset(N) ((N) / RX_subset_bits) -#define rx_bitset_subset_val(B,N) ((B)[rx_bitset_subset(N)]) -#define RX_bitset_access(B,N,OP) \ - ((B)[rx_bitset_subset(N)] OP rx_subset_singletons[(N) & RX_subset_mask]) -#define RX_bitset_member(B,N) RX_bitset_access(B, N, &) -#define RX_bitset_enjoin(B,N) RX_bitset_access(B, N, |=) -#define RX_bitset_remove(B,N) RX_bitset_access(B, N, &= ~) -#define RX_bitset_toggle(B,N) RX_bitset_access(B, N, ^= ) -#define rx_bitset_numb_subsets(N) (((N) + RX_subset_bits - 1) / RX_subset_bits) -#define rx_sizeof_bitset(N) (rx_bitset_numb_subsets(N) * sizeof(RX_subset)) - - - -/* This page: Splay trees. */ - -#ifdef __STDC__ -typedef int (*rx_sp_comparer) (void * a, void * b); -#else -typedef int (*rx_sp_comparer) (); -#endif - -struct rx_sp_node -{ - void * key; - void * data; - struct rx_sp_node * kids[2]; -}; - -#ifdef __STDC__ -typedef void (*rx_sp_key_data_freer) (struct rx_sp_node *); -#else -typedef void (*rx_sp_key_data_freer) (); -#endif - - -/* giant inflatable hash trees */ - -struct rx_hash_item -{ - struct rx_hash_item * next_same_hash; - struct rx_hash * table; - unsigned long hash; - void * data; - void * binding; -}; - -struct rx_hash -{ - struct rx_hash * parent; - int refs; - struct rx_hash * children[13]; - struct rx_hash_item * buckets [13]; - int bucket_size [13]; -}; - -struct rx_hash_rules; - -#ifdef __STDC__ -/* should return like == */ -typedef int (*rx_hash_eq)(void *, void *); -typedef struct rx_hash * (*rx_alloc_hash)(struct rx_hash_rules *); -typedef void (*rx_free_hash)(struct rx_hash *, - struct rx_hash_rules *); -typedef struct rx_hash_item * (*rx_alloc_hash_item)(struct rx_hash_rules *, - void *); -typedef void (*rx_free_hash_item)(struct rx_hash_item *, - struct rx_hash_rules *); -#else -typedef int (*rx_hash_eq)(); -typedef struct rx_hash * (*rx_alloc_hash)(); -typedef void (*rx_free_hash)(); -typedef struct rx_hash_item * (*rx_alloc_hash_item)(); -typedef void (*rx_free_hash_item)(); -#endif - -struct rx_hash_rules -{ - rx_hash_eq eq; - rx_alloc_hash hash_alloc; - rx_free_hash free_hash; - rx_alloc_hash_item hash_item_alloc; - rx_free_hash_item free_hash_item; -}; - - -/* Forward declarations */ - -struct rx_cache; -struct rx_superset; -struct rx; -struct rx_se_list; - - - -/* - * GLOSSARY - * - * regexp - * regular expression - * expression - * pattern - a `regular' expression. The expression - * need not be formally regular -- it can contain - * constructs that don't correspond to purely regular - * expressions. - * - * buffer - * string - the string (or strings) being searched or matched. - * - * pattern buffer - a structure of type `struct re_pattern_buffer' - * This in turn contains a `struct rx', which holds the - * NFA compiled from a pattern, as well as some of the state - * of a matcher using the pattern. - * - * NFA - nondeterministic finite automata. Some people - * use this term to a member of the class of - * regular automata (those corresponding to a regular - * language). However, in this code, the meaning is - * more general. The automata used by Rx are comperable - * in power to what are usually called `push down automata'. - * - * Two NFA are built by rx for every pattern. One is built - * by the compiler. The other is built from the first, on - * the fly, by the matcher. The latter is called the `superstate - * NFA' because its states correspond to sets of states from - * the first NFA. (Joe Keane gets credit for the name - * `superstate NFA'). - * - * NFA edges - * epsilon edges - * side-effect edges - The NFA compiled from a pattern can have three - * kinds of edges. Epsilon edges can be taken freely anytime - * their source state is reached. Character set edges can be - * taken when their source state is reached and when the next - * character in the buffer is a member of the set. Side effect - * edges imply a transition that can only be taken after the - * indicated side effect has been successfully accomplished. - * Some examples of side effects are: - * - * Storing the current match position to record the - * location of a parentesized subexpression. - * - * Advancing the matcher over N characters if they - * match the N characters previously matched by a - * parentesized subexpression. - * - * Both of those kinds of edges occur in the NFA generated - * by the pattern: \(.\)\1 - * - * Epsilon and side effect edges are similar. Unfortunately, - * some of the code uses the name `epsilon edge' to mean - * both epsilon and side effect edges. For example, the - * function has_non_idempotent_epsilon_path computes the existance - * of a non-trivial path containing only a mix of epsilon and - * side effect edges. In that case `nonidempotent epsilon' is being - * used to mean `side effect'. - */ - - - - - -/* LOW LEVEL PATTERN BUFFERS */ - -/* Suppose that from some NFA state, more than one path through - * side-effect edges is possible. In what order should the paths - * be tried? A function of type rx_se_list_order answers that - * question. It compares two lists of side effects, and says - * which list comes first. - */ - -#ifdef __STDC__ -typedef int (*rx_se_list_order) (struct rx *, - struct rx_se_list *, - struct rx_se_list *); -#else -typedef int (*rx_se_list_order) (); -#endif - - - -/* Struct RX holds a compiled regular expression - that is, an nfa - * ready to be converted on demand to a more efficient superstate nfa. - * This is for the low level interface. The high-level interfaces enclose - * this in a `struct re_pattern_buffer'. - */ -struct rx -{ - /* The compiler assigns a unique id to every pattern. - * Like sequence numbers in X, there is a subtle bug here - * if you use Rx in a system that runs for a long time. - * But, because of the way the caches work out, it is almost - * impossible to trigger the Rx version of this bug. - * - * The id is used to validate superstates found in a cache - * of superstates. It isn't sufficient to let a superstate - * point back to the rx for which it was compiled -- the caller - * may be re-using a `struct rx' in which case the superstate - * is not really valid. So instead, superstates are validated - * by checking the sequence number of the pattern for which - * they were built. - */ - int rx_id; - - /* This is memory mgt. state for superstates. This may be - * shared by more than one struct rx. - */ - struct rx_cache * cache; - - /* Every regex defines the size of its own character set. - * A superstate has an array of this size, with each element - * a `struct rx_inx'. So, don't make this number too large. - * In particular, don't make it 2^16. - */ - int local_cset_size; - - /* After the NFA is built, it is copied into a contiguous region - * of memory (mostly for compatability with GNU regex). - * Here is that region, and it's size: - */ - void * buffer; - unsigned long allocated; - - /* Clients of RX can ask for some extra storage in the space pointed - * to by BUFFER. The field RESERVED is an input parameter to the - * compiler. After compilation, this much space will be available - * at (buffer + allocated - reserved) - */ - unsigned long reserved; - - /* --------- The remaining fields are for internal use only. --------- */ - /* --------- But! they must be initialized to 0. --------- */ - - /* NODEC is the number of nodes in the NFA with non-epsilon - * transitions. - */ - int nodec; - - /* EPSNODEC is the number of nodes with only epsilon transitions. */ - int epsnodec; - - /* The sum (NODEC + EPSNODEC) is the total number of states in the - * compiled NFA. - */ - - /* Lists of side effects as stored in the NFA are `hash consed'..meaning - * that lists with the same elements are ==. During compilation, - * this table facilitates hash-consing. - */ - struct rx_hash se_list_memo; - - /* Lists of NFA states are also hashed. - */ - struct rx_hash set_list_memo; - - - - - /* The compiler and matcher must build a number of instruction frames. - * The format of these frames is fixed (c.f. struct rx_inx). The values - * of the instructions is not fixed. - * - * An enumerated type (enum rx_opcode) defines the set of instructions - * that the compiler or matcher might generate. When filling an instruction - * frame, the INX field is found by indexing this instruction table - * with an opcode: - */ - void ** instruction_table; - - /* The list of all states in an NFA. - * During compilation, the NEXT field of NFA states links this list. - * After compilation, all the states are compacted into an array, - * ordered by state id numbers. At that time, this points to the base - * of that array. - */ - struct rx_nfa_state *nfa_states; - - /* Every nfa begins with one distinguished starting state: - */ - struct rx_nfa_state *start; - - /* This orders the search through super-nfa paths. - * See the comment near the typedef of rx_se_list_order. - */ - rx_se_list_order se_list_cmp; - - struct rx_superset * start_set; -}; - - - - -/* SYNTAX TREES */ - -/* Compilation is in stages. - * - * In the first stage, a pattern specified by a string is - * translated into a syntax tree. Later stages will convert - * the syntax tree into an NFA optimized for conversion to a - * superstate-NFA. - * - * This page is about syntax trees. - */ - -enum rexp_node_type -{ - r_cset, /* Match from a character set. `a' or `[a-z]'*/ - r_concat, /* Concat two subexpressions. `ab' */ - r_alternate, /* Choose one of two subexpressions. `a\|b' */ - r_opt, /* Optional subexpression. `a?' */ - r_star, /* Repeated subexpression. `a*' */ - - - /* A 2phase-star is a variation on a repeated subexpression. - * In this case, there are two subexpressions. The first, if matched, - * begins a repitition (otherwise, the whole expression is matches the - * empth string). - * - * After matching the first subexpression, a 2phase star either finishes, - * or matches the second subexpression. If the second subexpression is - * matched, then the whole construct repeats. - * - * 2phase stars are used in two circumstances. First, they - * are used as part of the implementation of POSIX intervals (counted - * repititions). Second, they are used to implement proper star - * semantics when the repeated subexpression contains paths of - * only side effects. See rx_compile for more information. - */ - r_2phase_star, - - - /* c.f. "typedef void * rx_side_effect" */ - r_side_effect, - - /* This is an extension type: It is for transient use in source->source - * transformations (implemented over syntax trees). - */ - r_data -}; - -/* A side effect is a matcher-specific action associated with - * transitions in the NFA. The details of side effects are up - * to the matcher. To the compiler and superstate constructors - * side effects are opaque: - */ - -typedef void * rx_side_effect; - -/* Nodes in a syntax tree are of this type: - */ -struct rexp_node -{ - enum rexp_node_type type; - union - { - rx_Bitset cset; - rx_side_effect side_effect; - struct - { - struct rexp_node *left; - struct rexp_node *right; - } pair; - void * data; - } params; -}; - - - -/* NFA - * - * A syntax tree is compiled into an NFA. This page defines the structure - * of that NFA. - */ - -struct rx_nfa_state -{ - /* These are kept in a list as the NFA is being built. */ - struct rx_nfa_state *next; - - /* After the NFA is built, states are given integer id's. - * States whose outgoing transitions are all either epsilon or - * side effect edges are given ids less than 0. Other states - * are given successive non-negative ids starting from 0. - */ - int id; - - /* The list of NFA edges that go from this state to some other. */ - struct rx_nfa_edge *edges; - - /* If you land in this state, then you implicitly land - * in all other states reachable by only epsilon translations. - * Call the set of maximal paths to such states the epsilon closure - * of this state. - * - * There may be other states that are reachable by a mixture of - * epsilon and side effect edges. Consider the set of maximal paths - * of that sort from this state. Call it the epsilon-side-effect - * closure of the state. - * - * The epsilon closure of the state is a subset of the epsilon-side- - * effect closure. It consists of all the paths that contain - * no side effects -- only epsilon edges. - * - * The paths in the epsilon-side-effect closure can be partitioned - * into equivalance sets. Two paths are equivalant if they have the - * same set of side effects, in the same order. The epsilon-closure - * is one of these equivalance sets. Let's call these equivalance - * sets: observably equivalant path sets. That name is chosen - * because equivalance of two paths means they cause the same side - * effects -- so they lead to the same subsequent observations other - * than that they may wind up in different target states. - * - * The superstate nfa, which is derived from this nfa, is based on - * the observation that all of the paths in an observably equivalant - * path set can be explored at the same time, provided that the - * matcher keeps track not of a single nfa state, but of a set of - * states. In particular, after following all the paths in an - * observably equivalant set, you wind up at a set of target states. - * That set of target states corresponds to one state in the - * superstate NFA. - * - * Staticly, before matching begins, it is convenient to analyze the - * nfa. Each state is labeled with a list of the observably - * equivalant path sets who's union covers all the - * epsilon-side-effect paths beginning in this state. This list is - * called the possible futures of the state. - * - * A trivial example is this NFA: - * s1 - * A ---> B - * - * s2 - * ---> C - * - * epsilon s1 - * ---------> D ------> E - * - * - * In this example, A has two possible futures. - * One invokes the side effect `s1' and contains two paths, - * one ending in state B, the other in state E. - * The other invokes the side effect `s2' and contains only - * one path, landing in state C. - */ - struct rx_possible_future *futures; - - - /* There are exactly two distinguished states in every NFA: */ - unsigned int is_final:1; - unsigned int is_start:1; - - /* These are used during NFA construction... */ - unsigned int eclosure_needed:1; - unsigned int mark:1; -}; - - -/* An edge in an NFA is typed: */ -enum rx_nfa_etype -{ - /* A cset edge is labled with a set of characters one of which - * must be matched for the edge to be taken. - */ - ne_cset, - - /* An epsilon edge is taken whenever its starting state is - * reached. - */ - ne_epsilon, - - /* A side effect edge is taken whenever its starting state is - * reached. Side effects may cause the match to fail or the - * position of the matcher to advance. - */ - ne_side_effect /* A special kind of epsilon. */ -}; - -struct rx_nfa_edge -{ - struct rx_nfa_edge *next; - enum rx_nfa_etype type; - struct rx_nfa_state *dest; - union - { - rx_Bitset cset; - rx_side_effect side_effect; - } params; -}; - - - -/* A possible future consists of a list of side effects - * and a set of destination states. Below are their - * representations. These structures are hash-consed which - * means that lists with the same elements share a representation - * (their addresses are ==). - */ - -struct rx_nfa_state_set -{ - struct rx_nfa_state * car; - struct rx_nfa_state_set * cdr; -}; - -struct rx_se_list -{ - rx_side_effect car; - struct rx_se_list * cdr; -}; - -struct rx_possible_future -{ - struct rx_possible_future *next; - struct rx_se_list * effects; - struct rx_nfa_state_set * destset; -}; - - - -/* This begins the description of the superstate NFA. - * - * The superstate NFA corresponds to the NFA in these ways: - * - * Every superstate NFA states SUPER correspond to sets of NFA states, - * nfa_states(SUPER). - * - * Superstate edges correspond to NFA paths. - * - * The superstate has no epsilon transitions; - * every edge has a character label, and a (possibly empty) side - * effect label. The side effect label corresponds to a list of - * side effects that occur in the NFA. These parts are referred - * to as: superedge_character(EDGE) and superedge_sides(EDGE). - * - * For a superstate edge EDGE starting in some superstate SUPER, - * the following is true (in pseudo-notation :-): - * - * exists DEST in nfa_states s.t. - * exists nfaEDGE in nfa_edges s.t. - * origin (nfaEDGE) == DEST - * && origin (nfaEDGE) is a member of nfa_states(SUPER) - * && exists PF in possible_futures(dest(nfaEDGE)) s.t. - * sides_of_possible_future (PF) == superedge_sides (EDGE) - * - * also: - * - * let SUPER2 := superedge_destination(EDGE) - * nfa_states(SUPER2) - * == union of all nfa state sets S s.t. - * exists PF in possible_futures(dest(nfaEDGE)) s.t. - * sides_of_possible_future (PF) == superedge_sides (EDGE) - * && S == dests_of_possible_future (PF) } - * - * Or in english, every superstate is a set of nfa states. A given - * character and a superstate implies many transitions in the NFA -- - * those that begin with an edge labeled with that character from a - * state in the set corresponding to the superstate. - * - * The destinations of those transitions each have a set of possible - * futures. A possible future is a list of side effects and a set of - * destination NFA states. Two sets of possible futures can be - * `merged' by combining all pairs of possible futures that have the - * same side effects. A pair is combined by creating a new future - * with the same side effect but the union of the two destination sets. - * In this way, all the possible futures suggested by a superstate - * and a character can be merged into a set of possible futures where - * no two elements of the set have the same set of side effects. - * - * The destination of a possible future, being a set of NFA states, - * corresponds to a supernfa state. So, the merged set of possible - * futures we just created can serve as a set of edges in the - * supernfa. - * - * The representation of the superstate nfa and the nfa is critical. - * The nfa has to be compact, but has to facilitate the rapid - * computation of missing superstates. The superstate nfa has to - * be fast to interpret, lazilly constructed, and bounded in space. - * - * To facilitate interpretation, the superstate data structures are - * peppered with `instruction frames'. There is an instruction set - * defined below which matchers using the supernfa must be able to - * interpret. - * - * We'd like to make it possible but not mandatory to use code - * addresses to represent instructions (c.f. gcc's computed goto). - * Therefore, we define an enumerated type of opcodes, and when - * writing one of these instructions into a data structure, use - * the opcode as an index into a table of instruction values. - * - * Here are the opcodes that occur in the superstate nfa: - */ - - -/* Every superstate contains a table of instruction frames indexed - * by characters. A normal `move' in a matcher is to fetch the next - * character and use it as an index into a superstates transition - * table. - * - * In the fasted case, only one edge follows from that character. - * In other cases there is more work to do. - * - * The descriptions of the opcodes refer to data structures that are - * described further below. - */ - -enum rx_opcode -{ - /* - * BACKTRACK_POINT is invoked when a character transition in - * a superstate leads to more than one edge. In that case, - * the edges have to be explored independently using a backtracking - * strategy. - * - * A BACKTRACK_POINT instruction is stored in a superstate's - * transition table for some character when it is known that that - * character crosses more than one edge. On encountering this - * instruction, the matcher saves enough state to backtrack to this - * point in the match later. - */ - rx_backtrack_point = 0, /* data is (struct transition_class *) */ - - /* - * RX_DO_SIDE_EFFECTS evaluates the side effects of an epsilon path. - * There is one occurence of this instruction per rx_distinct_future. - * This instruction is skipped if a rx_distinct_future has no side effects. - */ - rx_do_side_effects = rx_backtrack_point + 1, - - /* data is (struct rx_distinct_future *) */ - - /* - * RX_CACHE_MISS instructions are stored in rx_distinct_futures whose - * destination superstate has been reclaimed (or was never built). - * It recomputes the destination superstate. - * RX_CACHE_MISS is also stored in a superstate transition table before - * any of its edges have been built. - */ - rx_cache_miss = rx_do_side_effects + 1, - /* data is (struct rx_distinct_future *) */ - - /* - * RX_NEXT_CHAR is called to consume the next character and take the - * corresponding transition. This is the only instruction that uses - * the DATA field of the instruction frame instead of DATA_2. - * (see EXPLORE_FUTURE in regex.c). - */ - rx_next_char = rx_cache_miss + 1, /* data is (struct superstate *) */ - - /* RX_BACKTRACK indicates that a transition fails. - */ - rx_backtrack = rx_next_char + 1, /* no data */ - - /* - * RX_ERROR_INX is stored only in places that should never be executed. - */ - rx_error_inx = rx_backtrack + 1, /* Not supposed to occur. */ - - rx_num_instructions = rx_error_inx + 1 -}; - -/* An id_instruction_table holds the values stored in instruction - * frames. The table is indexed by the enums declared above. - */ -extern void * rx_id_instruction_table[rx_num_instructions]; - -/* The heart of the matcher is a `word-code-interpreter' - * (like a byte-code interpreter, except that instructions - * are a full word wide). - * - * Instructions are not stored in a vector of code, instead, - * they are scattered throughout the data structures built - * by the regexp compiler and the matcher. One word-code instruction, - * together with the arguments to that instruction, constitute - * an instruction frame (struct rx_inx). - * - * This structure type is padded by hand to a power of 2 because - * in one of the dominant cases, we dispatch by indexing a table - * of instruction frames. If that indexing can be accomplished - * by just a shift of the index, we're happy. - * - * Instructions take at most one argument, but there are two - * slots in an instruction frame that might hold that argument. - * These are called data and data_2. The data slot is only - * used for one instruction (RX_NEXT_CHAR). For all other - * instructions, data should be set to 0. - * - * RX_NEXT_CHAR is the most important instruction by far. - * By reserving the data field for its exclusive use, - * instruction dispatch is sped up in that case. There is - * no need to fetch both the instruction and the data, - * only the data is needed. In other words, a `cycle' begins - * by fetching the field data. If that is non-0, then it must - * be the destination state of a next_char transition, so - * make that value the current state, advance the match position - * by one character, and start a new cycle. On the other hand, - * if data is 0, fetch the instruction and do a more complicated - * dispatch on that. - */ - -struct rx_inx -{ - void * data; - void * data_2; - void * inx; - void * fnord; -}; - -#ifndef RX_TAIL_ARRAY -#define RX_TAIL_ARRAY 1 -#endif - -/* A superstate corresponds to a set of nfa states. Those sets are - * represented by STRUCT RX_SUPERSET. The constructors - * guarantee that only one (shared) structure is created for a given set. - */ -struct rx_superset -{ - int refs; /* This is a reference counted structure. */ - - /* We keep these sets in a cache because (in an unpredictable way), - * the same set is often created again and again. But that is also - * problematic -- compatibility with POSIX and GNU regex requires - * that we not be able to tell when a program discards a particular - * NFA (thus invalidating the supersets created from it). - * - * But when a cache hit appears to occur, we will have in hand the - * nfa for which it may have happened. That is why every nfa is given - * its own sequence number. On a cache hit, the cache is validated - * by comparing the nfa sequence number to this field: - */ - int id; - - struct rx_nfa_state * car; /* May or may not be a valid addr. */ - struct rx_superset * cdr; - - /* If the corresponding superstate exists: */ - struct rx_superstate * superstate; - - - /* There is another bookkeeping problem. It is expensive to - * compute the starting nfa state set for an nfa. So, once computed, - * it is cached in the `struct rx'. - * - * But, the state set can be flushed from the superstate cache. - * When that happens, we can't know if the corresponding `struct rx' - * is still alive or if it has been freed or re-used by the program. - * So, the cached pointer to this set in a struct rx might be invalid - * and we need a way to validate it. - * - * Fortunately, even if this set is flushed from the cache, it is - * not freed. It just goes on the free-list of supersets. - * So we can still examine it. - * - * So to validate a starting set memo, check to see if the - * starts_for field still points back to the struct rx in question, - * and if the ID matches the rx sequence number. - */ - struct rx * starts_for; - - /* This is used to link into a hash bucket so these objects can - * be `hash-consed'. - */ - struct rx_hash_item hash_item; -}; - -#define rx_protect_superset(RX,CON) (++(CON)->refs) - -/* The terminology may be confusing (rename this structure?). - * Every character occurs in at most one rx_super_edge per super-state. - * But, that structure might have more than one option, indicating a point - * of non-determinism. - * - * In other words, this structure holds a list of superstate edges - * sharing a common starting state and character label. The edges - * are in the field OPTIONS. All superstate edges sharing the same - * starting state and character are in this list. - */ -struct rx_super_edge -{ - struct rx_super_edge *next; - struct rx_inx rx_backtrack_frame; - int cset_size; - rx_Bitset cset; - struct rx_distinct_future *options; -}; - -/* A superstate is a set of nfa states (RX_SUPERSET) along - * with a transition table. Superstates are built on demand and reclaimed - * without warning. To protect a superstate from this ghastly fate, - * use LOCK_SUPERSTATE. - */ -struct rx_superstate -{ - int rx_id; /* c.f. the id field of rx_superset */ - int locks; /* protection from reclamation */ - - /* Within a superstate cache, all the superstates are kept in a big - * queue. The tail of the queue is the state most likely to be - * reclaimed. The *recyclable fields hold the queue position of - * this state. - */ - struct rx_superstate * next_recyclable; - struct rx_superstate * prev_recyclable; - - /* The supernfa edges that exist in the cache and that have - * this state as their destination are kept in this list: - */ - struct rx_distinct_future * transition_refs; - - /* The list of nfa states corresponding to this superstate: */ - struct rx_superset * contents; - - /* The list of edges in the cache beginning from this state. */ - struct rx_super_edge * edges; - - /* A tail of the recyclable queue is marked as semifree. A semifree - * state has no incoming next_char transitions -- any transition - * into a semifree state causes a complex dispatch with the side - * effect of rescuing the state from its semifree state. - * - * An alternative to this might be to make next_char more expensive, - * and to move a state to the head of the recyclable queue whenever - * it is entered. That way, popular states would never be recycled. - * - * But unilaterally making next_char more expensive actually loses. - * So, incoming transitions are only made expensive for states near - * the tail of the recyclable queue. The more cache contention - * there is, the more frequently a state will have to prove itself - * and be moved back to the front of the queue. If there is less - * contention, then popular states just aggregate in the front of - * the queue and stay there. - */ - int is_semifree; - - - /* This keeps track of the size of the transition table for this - * state. There is a half-hearted attempt to support variable sized - * superstates. - */ - int trans_size; - - /* Indexed by characters... */ - struct rx_inx transitions[RX_TAIL_ARRAY]; -}; - - -/* A list of distinct futures define the edges that leave from a - * given superstate on a given character. c.f. rx_super_edge. - */ - -struct rx_distinct_future -{ - struct rx_distinct_future * next_same_super_edge[2]; - struct rx_distinct_future * next_same_dest; - struct rx_distinct_future * prev_same_dest; - struct rx_superstate * present; /* source state */ - struct rx_superstate * future; /* destination state */ - struct rx_super_edge * edge; - - - /* The future_frame holds the instruction that should be executed - * after all the side effects are done, when it is time to complete - * the transition to the next state. - * - * Normally this is a next_char instruction, but it may be a - * cache_miss instruction as well, depending on whether or not - * the superstate is in the cache and semifree. - * - * If this is the only future for a given superstate/char, and - * if there are no side effects to be performed, this frame is - * not used (directly) at all. Instead, its contents are copied - * into the transition table of the starting state of this dist. future. - */ - struct rx_inx future_frame; - - struct rx_inx side_effects_frame; - struct rx_se_list * effects; -}; - -#define rx_lock_superstate(R,S) ((S)->locks++) -#define rx_unlock_superstate(R,S) (--(S)->locks) - - -/* This page destined for rx.h */ - -struct rx_blocklist -{ - struct rx_blocklist * next; - int bytes; -}; - -struct rx_freelist -{ - struct rx_freelist * next; -}; - -struct rx_cache; - -#ifdef __STDC__ -typedef void (*rx_morecore_fn)(struct rx_cache *); -#else -typedef void (*rx_morecore_fn)(); -#endif - -/* You use this to control the allocation of superstate data - * during matching. Most of it should be initialized to 0. - * - * A MORECORE function is necessary. It should allocate - * a new block of memory or return 0. - * A default that uses malloc is called `rx_morecore'. - * - * The number of SUPERSTATES_ALLOWED indirectly limits how much memory - * the system will try to allocate. The default is 128. Batch style - * applications that are very regexp intensive should use as high a number - * as possible without thrashing. - * - * The LOCAL_CSET_SIZE is the number of characters in a character set. - * It is therefore the number of entries in a superstate transition table. - * Generally, it should be 256. If your character set has 16 bits, - * it is better to translate your regexps into equivalent 8 bit patterns. - */ - -struct rx_cache -{ - struct rx_hash_rules superset_hash_rules; - - /* Objects are allocated by incrementing a pointer that - * scans across rx_blocklists. - */ - struct rx_blocklist * memory; - struct rx_blocklist * memory_pos; - int bytes_left; - char * memory_addr; - rx_morecore_fn morecore; - - /* Freelists. */ - struct rx_freelist * free_superstates; - struct rx_freelist * free_transition_classes; - struct rx_freelist * free_discernable_futures; - struct rx_freelist * free_supersets; - struct rx_freelist * free_hash; - - /* Two sets of superstates -- those that are semifreed, and those - * that are being used. - */ - struct rx_superstate * lru_superstate; - struct rx_superstate * semifree_superstate; - - struct rx_superset * empty_superset; - - int superstates; - int semifree_superstates; - int hits; - int misses; - int superstates_allowed; - - int local_cset_size; - void ** instruction_table; - - struct rx_hash superset_table; -}; - - - -/* The lowest-level search function supports arbitrarily fragmented - * strings and (optionally) suspendable/resumable searches. - * - * Callers have to provide a few hooks. - */ - -#ifndef __GNUC__ -#ifdef __STDC__ -#define __const__ const -#else -#define __const__ -#endif -#endif - -/* This holds a matcher position */ -struct rx_string_position -{ - __const__ unsigned char * pos; /* The current pos. */ - __const__ unsigned char * string; /* The current string burst. */ - __const__ unsigned char * end; /* First invalid position >= POS. */ - int offset; /* Integer address of the current burst. */ - int size; /* Current string's size. */ - int search_direction; /* 1 or -1 */ - int search_end; /* First position to not try. */ -}; - - -enum rx_get_burst_return -{ - rx_get_burst_continuation, - rx_get_burst_error, - rx_get_burst_ok, - rx_get_burst_no_more -}; - - -/* A call to get burst should make POS valid. It might be invalid - * if the STRING field doesn't point to a burst that actually - * contains POS. - * - * GET_BURST should take a clue from SEARCH_DIRECTION (1 or -1) as to - * whether or not to pad to the left. Padding to the right is always - * appropriate, but need not go past the point indicated by STOP. - * - * If a continuation is returned, then the reentering call to - * a search function will retry the get_burst. - */ - -#ifdef __STDC__ -typedef enum rx_get_burst_return - (*rx_get_burst_fn) (struct rx_string_position * pos, - void * app_closure, - int stop); - -#else -typedef enum rx_get_burst_return (*rx_get_burst_fn) (); -#endif - - -enum rx_back_check_return -{ - rx_back_check_continuation, - rx_back_check_error, - rx_back_check_pass, - rx_back_check_fail -}; - -/* Back_check should advance the position it is passed - * over rparen - lparen characters and return pass iff - * the characters starting at POS match those indexed - * by [LPAREN..RPAREN]. - * - * If a continuation is returned, then the reentering call to - * a search function will retry the back_check. - */ - -#ifdef __STDC__ -typedef enum rx_back_check_return - (*rx_back_check_fn) (struct rx_string_position * pos, - int lparen, - int rparen, - unsigned char * translate, - void * app_closure, - int stop); - -#else -typedef enum rx_back_check_return (*rx_back_check_fn) (); -#endif - - - - -/* A call to fetch_char should return the character at POS or POS + 1. - * Returning continuations here isn't supported. OFFSET is either 0 or 1 - * and indicates which characters is desired. - */ - -#ifdef __STDC__ -typedef int (*rx_fetch_char_fn) (struct rx_string_position * pos, - int offset, - void * app_closure, - int stop); -#else -typedef int (*rx_fetch_char_fn) (); -#endif - - -enum rx_search_return -{ - rx_search_continuation = -4, - rx_search_error = -3, - rx_search_soft_fail = -2, /* failed by running out of string */ - rx_search_fail = -1 /* failed only by reaching failure states */ - /* return values >= 0 indicate the position of a successful match */ -}; - - - - - - -/* regex.h - * - * The remaining declarations replace regex.h. - */ - -/* This is an array of error messages corresponding to the error codes. - */ -extern __const__ char *re_error_msg[]; - -/* If any error codes are removed, changed, or added, update the - `re_error_msg' table in regex.c. */ -typedef enum -{ - REG_NOERROR = 0, /* Success. */ - REG_NOMATCH, /* Didn't find a match (for regexec). */ - - /* POSIX regcomp return error codes. (In the order listed in the - standard.) */ - REG_BADPAT, /* Invalid pattern. */ - REG_ECOLLATE, /* Not implemented. */ - REG_ECTYPE, /* Invalid character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ - REG_EBRACE, /* Unmatched \{. */ - REG_BADBR, /* Invalid contents of \{\}. */ - REG_ERANGE, /* Invalid range end. */ - REG_ESPACE, /* Ran out of memory. */ - REG_BADRPT, /* No preceding re for repetition op. */ - - /* Error codes we've added. */ - REG_EEND, /* Premature end. */ - REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ - REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ -} reg_errcode_t; - -/* The regex.c support, as a client of rx, defines a set of possible - * side effects that can be added to the edge lables of nfa edges. - * Here is the list of sidef effects in use. - */ - -enum re_side_effects -{ -#define RX_WANT_SE_DEFS 1 -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#define RX_DEF_SE(IDEM, NAME, VALUE) NAME VALUE, -#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE) NAME VALUE, -#include "rx.h" -#undef RX_DEF_SE -#undef RX_DEF_CPLX_SE -#undef RX_WANT_SE_DEFS - re_floogle_flap = 65533 -}; - -/* These hold paramaters for the kinds of side effects that are possible - * in the supported pattern languages. These include things like the - * numeric bounds of {} operators and the index of paren registers for - * subexpression measurement or backreferencing. - */ -struct re_se_params -{ - enum re_side_effects se; - int op1; - int op2; -}; - -typedef unsigned reg_syntax_t; - -struct re_pattern_buffer -{ - struct rx rx; - reg_syntax_t syntax; /* See below for syntax bit definitions. */ - - unsigned int no_sub:1; /* If set, don't return register offsets. */ - unsigned int not_bol:1; /* If set, the anchors ('^' and '$') don't */ - unsigned int not_eol:1; /* match at the ends of the string. */ - unsigned int newline_anchor:1;/* If true, an anchor at a newline matches.*/ - unsigned int least_subs:1; /* If set, and returning registers, return - * as few values as possible. Only - * backreferenced groups and group 0 (the whole - * match) will be returned. - */ - - /* If true, this says that the matcher should keep registers on its - * backtracking stack. For many patterns, we can easily determine that - * this isn't necessary. - */ - unsigned int match_regs_on_stack:1; - unsigned int search_regs_on_stack:1; - - /* is_anchored and begbuf_only are filled in by rx_compile. */ - unsigned int is_anchored:1; /* Anchorded by ^? */ - unsigned int begbuf_only:1; /* Anchored to char position 0? */ - - - /* If REGS_UNALLOCATED, allocate space in the `regs' structure - * for `max (RE_NREGS, re_nsub + 1)' groups. - * If REGS_REALLOCATE, reallocate space if necessary. - * If REGS_FIXED, use what's there. - */ -#define REGS_UNALLOCATED 0 -#define REGS_REALLOCATE 1 -#define REGS_FIXED 2 - unsigned int regs_allocated:2; - - - /* Either a translate table to apply to all characters before - * comparing them, or zero for no translation. The translation - * is applied to a pattern when it is compiled and to a string - * when it is matched. - */ - unsigned char * translate; - - /* If this is a valid pointer, it tells rx not to store the extents of - * certain subexpressions (those corresponding to non-zero entries). - * Passing 0x1 is the same as passing an array of all ones. Passing 0x0 - * is the same as passing an array of all zeros. - * The array should contain as many entries as their are subexps in the - * regexp. - * - * For POSIX compatability, when using regcomp and regexec this field - * is zeroed and ignored. - */ - char * syntax_parens; - - /* Number of subexpressions found by the compiler. */ - size_t re_nsub; - - void * buffer; /* Malloced memory for the nfa. */ - unsigned long allocated; /* Size of that memory. */ - - /* Pointer to a fastmap, if any, otherwise zero. re_search uses - * the fastmap, if there is one, to skip over impossible - * starting points for matches. */ - char *fastmap; - - unsigned int fastmap_accurate:1; /* These three are internal. */ - unsigned int can_match_empty:1; - struct rx_nfa_state * start; /* The nfa starting state. */ - - /* This is the list of iterator bounds for {lo,hi} constructs. - * The memory pointed to is part of the rx->buffer. - */ - struct re_se_params *se_params; - - /* This is a bitset representation of the fastmap. - * This is a true fastmap that already takes the translate - * table into account. - */ - rx_Bitset fastset; -}; - -/* Type for byte offsets within the string. POSIX mandates this. */ -typedef int regoff_t; - -/* This is the structure we store register match data in. See - regex.texinfo for a full description of what registers match. */ -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - -typedef struct re_pattern_buffer regex_t; - -/* POSIX specification for registers. Aside from the different names than - `re_registers', POSIX uses an array of structures, instead of a - structure of arrays. */ -typedef struct -{ - regoff_t rm_so; /* Byte offset from string's start to substring's start. */ - regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ -} regmatch_t; - - -/* The following bits are used to determine the regexp syntax we - recognize. The set/not-set meanings are chosen so that Emacs syntax - remains the value 0. The bits are given in alphabetical order, and - the definitions shifted by one from the previous bit; thus, when we - add or remove a bit, only one other definition need change. */ - -/* If this bit is not set, then \ inside a bracket expression is literal. - If set, then such a \ quotes the following character. */ -#define RE_BACKSLASH_ESCAPE_IN_LISTS (1) - -/* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. - If set, then \+ and \? are operators and + and ? are literals. */ -#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) - -/* If this bit is set, then character classes are supported. They are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) - -/* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions, of course). - If this bit is not set, then it depends: - ^ is an anchor if it is at the beginning of a regular - expression or after an open-group or an alternation operator; - $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. - - This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX draft 11.2 says that * etc. in leading positions is undefined. - We already implemented a previous draft which made those constructs - invalid, though, so we haven't changed the code back. */ -#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) - -/* If this bit is set, then special characters are always special - regardless of where they are in the pattern. - If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, - * + ? and intervals are only special when not after the beginning, - open-group, or alternation operator. */ -#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) - -/* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. */ -#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) - -/* If this bit is set, then . matches newline. - If not set, then it doesn't. */ -#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) - -/* If this bit is set, then . doesn't match NUL. - If not set, then it does. */ -#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) - -/* If this bit is set, nonmatching lists [^...] do not match newline. - If not set, they do. */ -#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) - -/* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. - If not set, \{, \}, {, and } are literals. */ -#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) - -/* If this bit is set, +, ? and | aren't recognized as operators. - If not set, they are. */ -#define RE_LIMITED_OPS (RE_INTERVALS << 1) - -/* If this bit is set, newline is an alternation operator. - If not set, newline is literal. */ -#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) - -/* If this bit is set, then `{...}' defines an interval, and \{ and \} - are literals. - If not set, then `\{...\}' defines an interval. */ -#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) - -/* If this bit is set, (...) defines a group, and \( and \) are literals. - If not set, \(...\) defines a group, and ( and ) are literals. */ -#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) - -/* If this bit is set, then \<digit> matches <digit>. - If not set, then \<digit> is a back-reference. */ -#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) - -/* If this bit is set, then | is an alternation operator, and \| is literal. - If not set, then \| is an alternation operator, and | is literal. */ -#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) - -/* If this bit is set, then an ending range point collating higher - than the starting range point, as in [z-a], is invalid. - If not set, then when ending range point collates higher than the - starting range point, the range is ignored. */ -#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then an unmatched ) is ordinary. - If not set, then an unmatched ) is invalid. */ -#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) - -/* This global variable defines the particular regexp syntax to use (for - some interfaces). When a regexp is compiled, the syntax used is - stored in the pattern buffer, so changing this does not affect - already-compiled regexps. */ -extern reg_syntax_t re_syntax_options; - -/* Define combinations of the above bits for the standard possibilities. - (The [[[ comments delimit what gets put into the Texinfo file, so - don't delete them!) */ -/* [[[begin syntaxes]]] */ -#define RE_SYNTAX_EMACS 0 - -#define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -#define RE_SYNTAX_POSIX_AWK \ - (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) - -#define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ - | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ - | RE_NEWLINE_ALT) - -#define RE_SYNTAX_EGREP \ - (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - -#define RE_SYNTAX_POSIX_EGREP \ - (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) - -#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC - -/* Syntax bits common to both basic and extended POSIX regex syntax. */ -#define _RE_SYNTAX_POSIX_COMMON \ - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -#define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) - -/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this - isn't minimal, since other operators, such as \`, aren't disabled. */ -#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) - -#define RE_SYNTAX_POSIX_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS - replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ -#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) -/* [[[end syntaxes]]] */ - -/* Maximum number of duplicates an interval can allow. Some systems - (erroneously) define this in other header files, but we want our - value, so remove any previous define. */ -#ifdef RE_DUP_MAX -#undef RE_DUP_MAX -#endif -#define RE_DUP_MAX ((1 << 15) - 1) - - - -/* POSIX `cflags' bits (i.e., information for `regcomp'). */ - -/* If this bit is set, then use extended regular expression syntax. - If not set, then use basic regular expression syntax. */ -#define REG_EXTENDED 1 - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -#define REG_ICASE (REG_EXTENDED << 1) - -/* If this bit is set, then anchors do not match at newline - characters in the string. - If not set, then anchors do match at newlines. */ -#define REG_NEWLINE (REG_ICASE << 1) - -/* If this bit is set, then report only success or fail in regexec. - If not set, then returns differ between not matching and errors. */ -#define REG_NOSUB (REG_NEWLINE << 1) - - -/* POSIX `eflags' bits (i.e., information for regexec). */ - -/* If this bit is set, then the beginning-of-line operator doesn't match - the beginning of the string (presumably because it's not the - beginning of a line). - If not set, then the beginning-of-line operator does match the - beginning of the string. */ -#define REG_NOTBOL 1 - -/* Like REG_NOTBOL, except for the end-of-line. */ -#define REG_NOTEOL (1 << 1) - -/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, - * `re_match_2' returns information about at least this many registers - * the first time a `regs' structure is passed. - * - * Also, this is the greatest number of backreferenced subexpressions - * allowed in a pattern being matched without caller-supplied registers. - */ -#ifndef RE_NREGS -#define RE_NREGS 30 -#endif - -extern int rx_cache_bound; -extern char rx_version_string[]; - - - -#ifdef RX_WANT_RX_DEFS - -/* This is decls to the interesting subsystems and lower layers - * of rx. Everything which doesn't have a public counterpart in - * regex.c is declared here. - */ - - -#ifdef __STDC__ -typedef void (*rx_hash_freefn) (struct rx_hash_item * it); -#else /* ndef __STDC__ */ -typedef void (*rx_hash_freefn) (); -#endif /* ndef __STDC__ */ - - - - -#ifdef __STDC__ -RX_DECL int rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b); -RX_DECL int rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b); -RX_DECL int rx_bitset_empty (int size, rx_Bitset set); -RX_DECL void rx_bitset_null (int size, rx_Bitset b); -RX_DECL void rx_bitset_universe (int size, rx_Bitset b); -RX_DECL void rx_bitset_complement (int size, rx_Bitset b); -RX_DECL void rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_union (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_intersection (int size, - rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_revdifference (int size, - rx_Bitset a, rx_Bitset b); -RX_DECL void rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b); -RX_DECL unsigned long rx_bitset_hash (int size, rx_Bitset b); -RX_DECL struct rx_hash_item * rx_hash_find (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules); -RX_DECL struct rx_hash_item * rx_hash_store (struct rx_hash * table, - unsigned long hash, - void * value, - struct rx_hash_rules * rules); -RX_DECL void rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules); -RX_DECL void rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn, - struct rx_hash_rules * rules); -RX_DECL rx_Bitset rx_cset (struct rx *rx); -RX_DECL rx_Bitset rx_copy_cset (struct rx *rx, rx_Bitset a); -RX_DECL void rx_free_cset (struct rx * rx, rx_Bitset c); -RX_DECL struct rexp_node * rexp_node (struct rx *rx, - enum rexp_node_type type); -RX_DECL struct rexp_node * rx_mk_r_cset (struct rx * rx, - rx_Bitset b); -RX_DECL struct rexp_node * rx_mk_r_concat (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_alternate (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_opt (struct rx * rx, - struct rexp_node * a); -RX_DECL struct rexp_node * rx_mk_r_star (struct rx * rx, - struct rexp_node * a); -RX_DECL struct rexp_node * rx_mk_r_2phase_star (struct rx * rx, - struct rexp_node * a, - struct rexp_node * b); -RX_DECL struct rexp_node * rx_mk_r_side_effect (struct rx * rx, - rx_side_effect a); -RX_DECL struct rexp_node * rx_mk_r_data (struct rx * rx, - void * a); -RX_DECL void rx_free_rexp (struct rx * rx, struct rexp_node * node); -RX_DECL struct rexp_node * rx_copy_rexp (struct rx *rx, - struct rexp_node *node); -RX_DECL struct rx_nfa_state * rx_nfa_state (struct rx *rx); -RX_DECL void rx_free_nfa_state (struct rx_nfa_state * n); -RX_DECL struct rx_nfa_state * rx_id_to_nfa_state (struct rx * rx, - int id); -RX_DECL struct rx_nfa_edge * rx_nfa_edge (struct rx *rx, - enum rx_nfa_etype type, - struct rx_nfa_state *start, - struct rx_nfa_state *dest); -RX_DECL void rx_free_nfa_edge (struct rx_nfa_edge * e); -RX_DECL void rx_free_nfa (struct rx *rx); -RX_DECL int rx_build_nfa (struct rx *rx, - struct rexp_node *rexp, - struct rx_nfa_state **start, - struct rx_nfa_state **end); -RX_DECL void rx_name_nfa_states (struct rx *rx); -RX_DECL int rx_eclose_nfa (struct rx *rx); -RX_DECL void rx_delete_epsilon_transitions (struct rx *rx); -RX_DECL int rx_compactify_nfa (struct rx *rx, - void **mem, unsigned long *size); -RX_DECL void rx_release_superset (struct rx *rx, - struct rx_superset *set); -RX_DECL struct rx_superset * rx_superset_cons (struct rx * rx, - struct rx_nfa_state *car, struct rx_superset *cdr); -RX_DECL struct rx_superset * rx_superstate_eclosure_union - (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl); -RX_DECL struct rx_superstate * rx_superstate (struct rx *rx, - struct rx_superset *set); -RX_DECL struct rx_inx * rx_handle_cache_miss - (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data); -RX_DECL reg_errcode_t rx_compile (__const__ char *pattern, int size, - reg_syntax_t syntax, - struct re_pattern_buffer * rxb); -RX_DECL void rx_blow_up_fastmap (struct re_pattern_buffer * rxb); -#else /* STDC */ -RX_DECL int rx_bitset_is_equal (); -RX_DECL int rx_bitset_is_subset (); -RX_DECL int rx_bitset_empty (); -RX_DECL void rx_bitset_null (); -RX_DECL void rx_bitset_universe (); -RX_DECL void rx_bitset_complement (); -RX_DECL void rx_bitset_assign (); -RX_DECL void rx_bitset_union (); -RX_DECL void rx_bitset_intersection (); -RX_DECL void rx_bitset_difference (); -RX_DECL void rx_bitset_revdifference (); -RX_DECL void rx_bitset_xor (); -RX_DECL unsigned long rx_bitset_hash (); -RX_DECL struct rx_hash_item * rx_hash_find (); -RX_DECL struct rx_hash_item * rx_hash_store (); -RX_DECL void rx_hash_free (); -RX_DECL void rx_free_hash_table (); -RX_DECL rx_Bitset rx_cset (); -RX_DECL rx_Bitset rx_copy_cset (); -RX_DECL void rx_free_cset (); -RX_DECL struct rexp_node * rexp_node (); -RX_DECL struct rexp_node * rx_mk_r_cset (); -RX_DECL struct rexp_node * rx_mk_r_concat (); -RX_DECL struct rexp_node * rx_mk_r_alternate (); -RX_DECL struct rexp_node * rx_mk_r_opt (); -RX_DECL struct rexp_node * rx_mk_r_star (); -RX_DECL struct rexp_node * rx_mk_r_2phase_star (); -RX_DECL struct rexp_node * rx_mk_r_side_effect (); -RX_DECL struct rexp_node * rx_mk_r_data (); -RX_DECL void rx_free_rexp (); -RX_DECL struct rexp_node * rx_copy_rexp (); -RX_DECL struct rx_nfa_state * rx_nfa_state (); -RX_DECL void rx_free_nfa_state (); -RX_DECL struct rx_nfa_state * rx_id_to_nfa_state (); -RX_DECL struct rx_nfa_edge * rx_nfa_edge (); -RX_DECL void rx_free_nfa_edge (); -RX_DECL void rx_free_nfa (); -RX_DECL int rx_build_nfa (); -RX_DECL void rx_name_nfa_states (); -RX_DECL int rx_eclose_nfa (); -RX_DECL void rx_delete_epsilon_transitions (); -RX_DECL int rx_compactify_nfa (); -RX_DECL void rx_release_superset (); -RX_DECL struct rx_superset * rx_superset_cons (); -RX_DECL struct rx_superset * rx_superstate_eclosure_union (); -RX_DECL struct rx_superstate * rx_superstate (); -RX_DECL struct rx_inx * rx_handle_cache_miss (); -RX_DECL reg_errcode_t rx_compile (); -RX_DECL void rx_blow_up_fastmap (); -#endif /* STDC */ - - -#endif /* RX_WANT_RX_DEFS */ - - - -#ifdef __STDC__ -extern int re_search_2 (struct re_pattern_buffer *rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int startpos, int range, - struct re_registers *regs, - int stop); -extern int re_search (struct re_pattern_buffer * rxb, __const__ char *string, - int size, int startpos, int range, - struct re_registers *regs); -extern int re_match_2 (struct re_pattern_buffer * rxb, - __const__ char * string1, int size1, - __const__ char * string2, int size2, - int pos, struct re_registers *regs, int stop); -extern int re_match (struct re_pattern_buffer * rxb, - __const__ char * string, - int size, int pos, - struct re_registers *regs); -extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); -extern void re_set_registers (struct re_pattern_buffer *bufp, - struct re_registers *regs, - unsigned num_regs, - regoff_t * starts, regoff_t * ends); -extern __const__ char * re_compile_pattern (__const__ char *pattern, - int length, - struct re_pattern_buffer * rxb); -extern int re_compile_fastmap (struct re_pattern_buffer * rxb); -extern char * re_comp (__const__ char *s); -extern int re_exec (__const__ char *s); -extern int regcomp (regex_t * preg, __const__ char * pattern, int cflags); -extern int regexec (__const__ regex_t *preg, __const__ char *string, - size_t nmatch, regmatch_t pmatch[], - int eflags); -extern size_t regerror (int errcode, __const__ regex_t *preg, - char *errbuf, size_t errbuf_size); -extern void regfree (regex_t *preg); - -#else /* STDC */ -extern int re_search_2 (); -extern int re_search (); -extern int re_match_2 (); -extern int re_match (); -extern reg_syntax_t re_set_syntax (); -extern void re_set_registers (); -extern __const__ char * re_compile_pattern (); -extern int re_compile_fastmap (); -extern char * re_comp (); -extern int re_exec (); -extern int regcomp (); -extern int regexec (); -extern size_t regerror (); -extern void regfree (); - -#endif /* STDC */ - - - -#ifdef RX_WANT_RX_DEFS - -struct rx_counter_frame -{ - int tag; - int val; - struct rx_counter_frame * inherited_from; /* If this is a copy. */ - struct rx_counter_frame * cdr; -}; - -struct rx_backtrack_frame -{ - char * counter_stack_sp; - - /* A frame is used to save the matchers state when it crosses a - * backtracking point. The `stk_' fields correspond to variables - * in re_search_2 (just strip off thes `stk_'). They are documented - * tere. - */ - struct rx_superstate * stk_super; - unsigned int stk_c; - struct rx_string_position stk_test_pos; - int stk_last_l; - int stk_last_r; - int stk_test_ret; - - /* This is the list of options left to explore at the backtrack - * point for which this frame was created. - */ - struct rx_distinct_future * df; - struct rx_distinct_future * first_df; - -#ifdef RX_DEBUG - int stk_line_no; -#endif -}; - -struct rx_stack_chunk -{ - struct rx_stack_chunk * next_chunk; - int bytes_left; - char * sp; -}; - -enum rx_outer_entry -{ - rx_outer_start, - rx_outer_fastmap, - rx_outer_test, - rx_outer_restore_pos -}; - -enum rx_fastmap_return -{ - rx_fastmap_continuation, - rx_fastmap_error, - rx_fastmap_ok, - rx_fastmap_fail -}; - -enum rx_fastmap_entry -{ - rx_fastmap_start, - rx_fastmap_string_break -}; - -enum rx_test_return -{ - rx_test_continuation, - rx_test_error, - rx_test_fail, - rx_test_ok -}; - -enum rx_test_internal_return -{ - rx_test_internal_error, - rx_test_found_first, - rx_test_line_finished -}; - -enum rx_test_match_entry -{ - rx_test_start, - rx_test_cache_hit_loop, - rx_test_backreference_check, - rx_test_backtrack_return -}; - -struct rx_search_state -{ - /* Two groups of registers are kept. The group with the register state - * of the current test match, and the group that holds the state at the end - * of the best known match, if any. - * - * For some patterns, there may also be registers saved on the stack. - */ - unsigned num_regs; /* Includes an element for register zero. */ - regoff_t * lparen; /* scratch space for register returns */ - regoff_t * rparen; - regoff_t * best_lpspace; /* in case the user doesn't want these */ - regoff_t * best_rpspace; /* values, we still need space to store - * them. Normally, this memoryis unused - * and the space pointed to by REGS is - * used instead. - */ - - int last_l; /* Highest index of a valid lparen. */ - int last_r; /* It's dual. */ - - int * best_lparen; /* This contains the best known register */ - int * best_rparen; /* assignments. - * This may point to the same mem as - * best_lpspace, or it might point to memory - * passed by the caller. - */ - int best_last_l; /* best_last_l:best_lparen::last_l:lparen */ - int best_last_r; - - - unsigned char * translate; - - struct rx_string_position outer_pos; - - struct rx_superstate * start_super; - int nfa_choice; - int first_found; /* If true, return after finding any match. */ - int ret_val; - - /* For continuations... */ - enum rx_outer_entry outer_search_resume_pt; - struct re_pattern_buffer * saved_rxb; - int saved_startpos; - int saved_range; - int saved_stop; - int saved_total_size; - rx_get_burst_fn saved_get_burst; - rx_back_check_fn saved_back_check; - struct re_registers * saved_regs; - - /** - ** state for fastmap - **/ - char * fastmap; - int fastmap_chr; - int fastmap_val; - - /* for continuations in the fastmap procedure: */ - enum rx_fastmap_entry fastmap_resume_pt; - - /** - ** state for test_match - **/ - - /* The current superNFA position of the matcher. */ - struct rx_superstate * super; - - /* The matcher interprets a series of instruction frames. - * This is the `instruction counter' for the interpretation. - */ - struct rx_inx * ifr; - - /* We insert a ghost character in the string to prime - * the nfa. test_pos.pos, test_pos.str_half, and test_pos.end_half - * keep track of the test-match position and string-half. - */ - unsigned char c; - - /* Position within the string. */ - struct rx_string_position test_pos; - - struct rx_stack_chunk * counter_stack; - struct rx_stack_chunk * backtrack_stack; - int backtrack_frame_bytes; - int chunk_bytes; - struct rx_stack_chunk * free_chunks; - - /* To return from this function, set test_ret and - * `goto test_do_return'. - * - * Possible return values are: - * 1 --- end of string while the superNFA is still going - * 0 --- internal error (out of memory) - * -1 --- search completed by reaching the superNFA fail state - * -2 --- a match was found, maybe not the longest. - * - * When the search is complete (-1), best_last_r indicates whether - * a match was found. - * - * -2 is return only if search_state.first_found is non-zero. - * - * if search_state.first_found is non-zero, a return of -1 indicates no match, - * otherwise, best_last_r has to be checked. - */ - int test_ret; - - int could_have_continued; - -#ifdef RX_DEBUG - int backtrack_depth; - /* There is a search tree with every node as set of deterministic - * transitions in the super nfa. For every branch of a - * backtrack point is an edge in the tree. - * This counts up a pre-order of nodes in that tree. - * It's saved on the search stack and printed when debugging. - */ - int line_no; - int lines_found; -#endif - - - /* For continuations within the match tester */ - enum rx_test_match_entry test_match_resume_pt; - struct rx_inx * saved_next_tr_table; - struct rx_inx * saved_this_tr_table; - int saved_reg; - struct rx_backtrack_frame * saved_bf; - -}; - - -extern char rx_slowmap[]; -extern unsigned char rx_id_translation[]; - -static __inline__ void -init_fastmap (rxb, search_state) - struct re_pattern_buffer * rxb; - struct rx_search_state * search_state; -{ - search_state->fastmap = (rxb->fastmap - ? (char *)rxb->fastmap - : (char *)rx_slowmap); - /* Update the fastmap now if not correct already. - * When the regexp was compiled, the fastmap was computed - * and stored in a bitset. This expands the bitset into a - * character array containing 1s and 0s. - */ - if ((search_state->fastmap == rxb->fastmap) && !rxb->fastmap_accurate) - rx_blow_up_fastmap (rxb); - search_state->fastmap_chr = -1; - search_state->fastmap_val = 0; - search_state->fastmap_resume_pt = rx_fastmap_start; -} - -static __inline__ void -uninit_fastmap (rxb, search_state) - struct re_pattern_buffer * rxb; - struct rx_search_state * search_state; -{ - /* Unset the fastmap sentinel */ - if (search_state->fastmap_chr >= 0) - search_state->fastmap[search_state->fastmap_chr] - = search_state->fastmap_val; -} - -static __inline__ int -fastmap_search (rxb, stop, get_burst, app_closure, search_state) - struct re_pattern_buffer * rxb; - int stop; - rx_get_burst_fn get_burst; - void * app_closure; - struct rx_search_state * search_state; -{ - enum rx_fastmap_entry pc; - - if (0) - { - return_continuation: - search_state->fastmap_resume_pt = pc; - return rx_fastmap_continuation; - } - - pc = search_state->fastmap_resume_pt; - - switch (pc) - { - default: - return rx_fastmap_error; - case rx_fastmap_start: - init_fastmap_sentinal: - /* For the sake of fast fastmapping, set a sentinal in the fastmap. - * This sentinal will trap the fastmap loop when it reaches the last - * valid character in a string half. - * - * This must be reset when the fastmap/search loop crosses a string - * boundry, and before returning to the caller. So sometimes, - * the fastmap loop is restarted with `continue', othertimes by - * `goto init_fastmap_sentinal'. - */ - if (search_state->outer_pos.size) - { - search_state->fastmap_chr = ((search_state->outer_pos.search_direction == 1) - ? *(search_state->outer_pos.end - 1) - : *search_state->outer_pos.string); - search_state->fastmap_val - = search_state->fastmap[search_state->fastmap_chr]; - search_state->fastmap[search_state->fastmap_chr] = 1; - } - else - { - search_state->fastmap_chr = -1; - search_state->fastmap_val = 0; - } - - if (search_state->outer_pos.pos >= search_state->outer_pos.end) - goto fastmap_hit_bound; - else - { - if (search_state->outer_pos.search_direction == 1) - { - if (search_state->fastmap_val) - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - ++search_state->outer_pos.pos; - return rx_fastmap_ok; - } - } - else - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - ++search_state->outer_pos.pos; - if (*search_state->outer_pos.pos != search_state->fastmap_chr) - return rx_fastmap_ok; - else - { - ++search_state->outer_pos.pos; - if (search_state->outer_pos.pos == search_state->outer_pos.end) - goto fastmap_hit_bound; - } - } - } - } - else - { - __const__ unsigned char * bound; - bound = search_state->outer_pos.string - 1; - if (search_state->fastmap_val) - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - --search_state->outer_pos.pos; - return rx_fastmap_ok; - } - } - else - { - for (;;) - { - while (!search_state->fastmap[*search_state->outer_pos.pos]) - --search_state->outer_pos.pos; - if ((*search_state->outer_pos.pos != search_state->fastmap_chr) || search_state->fastmap_val) - return rx_fastmap_ok; - else - { - --search_state->outer_pos.pos; - if (search_state->outer_pos.pos == bound) - goto fastmap_hit_bound; - } - } - } - } - } - - case rx_fastmap_string_break: - fastmap_hit_bound: - { - /* If we hit a bound, it may be time to fetch another burst - * of string, or it may be time to return a continuation to - * the caller, or it might be time to fail. - */ - - int burst_state; - burst_state = get_burst (&search_state->outer_pos, app_closure, stop); - switch (burst_state) - { - default: - case rx_get_burst_error: - return rx_fastmap_error; - case rx_get_burst_continuation: - { - pc = rx_fastmap_string_break; - goto return_continuation; - } - case rx_get_burst_ok: - goto init_fastmap_sentinal; - case rx_get_burst_no_more: - /* ...not a string split, simply no more string. - * - * When searching backward, running out of string - * is reason to quit. - * - * When searching forward, we allow the possibility - * of an (empty) match after the last character in the - * virtual string. So, fall through to the matcher - */ - return ( (search_state->outer_pos.search_direction == 1) - ? rx_fastmap_ok - : rx_fastmap_fail); - } - } - } - -} - - - -#ifdef emacs -/* The `emacs' switch turns on certain matching commands - * that make sense only in Emacs. - */ -#include "config.h" -#include "lisp.h" -#include "buffer.h" -#include "syntax.h" -#endif /* emacs */ - -/* Setting RX_MEMDBUG is useful if you have dbmalloc. Maybe with similar - * packages too. - */ -#ifdef RX_MEMDBUG -#include <malloc.h> -#endif /* RX_RX_MEMDBUG */ - -/* We used to test for `BSTRING' here, but only GCC and Emacs define - * `BSTRING', as far as I know, and neither of them use this code. - */ -#if HAVE_STRING_H || STDC_HEADERS -#include <string.h> - -#ifndef bcmp -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#endif - -#ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif - -#ifndef bzero -#define bzero(s, n) memset ((s), 0, (n)) -#endif - -#else /* HAVE_STRING_H || STDC_HEADERS */ -#include <strings.h> -#endif /* not (HAVE_STRING_H || STDC_HEADERS) */ - -#ifdef STDC_HEADERS -#include <stdlib.h> -#else /* not STDC_HEADERS */ -char *malloc (); -char *realloc (); -#endif /* not STDC_HEADERS */ - - - - -/* How many characters in the character set. */ -#define CHAR_SET_SIZE (1 << CHARBITS) - -#ifndef emacs -/* Define the syntax basics for \<, \>, etc. - * This must be nonzero for the wordchar and notwordchar pattern - * commands in re_match_2. - */ -#ifndef Sword -#define Sword 1 -#endif -#define SYNTAX(c) re_syntax_table[c] -RX_DECL char re_syntax_table[CHAR_SET_SIZE]; -#endif /* not emacs */ - - -/* Test if at very beginning or at very end of the virtual concatenation - * of `string1' and `string2'. If only one string, it's `string2'. - */ - -#define AT_STRINGS_BEG() \ - ( -1 \ - == ((search_state.test_pos.pos - search_state.test_pos.string) \ - + search_state.test_pos.offset)) - -#define AT_STRINGS_END() \ - ( (total_size - 1) \ - == ((search_state.test_pos.pos - search_state.test_pos.string) \ - + search_state.test_pos.offset)) - - -/* Test if POS + 1 points to a character which is word-constituent. We have - * two special cases to check for: if past the end of string1, look at - * the first character in string2; and if before the beginning of - * string2, look at the last character in string1. - * - * Assumes `string1' exists, so use in conjunction with AT_STRINGS_BEG (). - */ -#define LETTER_P(POS,OFF) \ - ( SYNTAX (fetch_char(POS, OFF, app_closure, stop)) \ - == Sword) - -/* Test if the character at D and the one after D differ with respect - * to being word-constituent. - */ -#define AT_WORD_BOUNDARY(d) \ - (AT_STRINGS_BEG () || AT_STRINGS_END () || LETTER_P (d,0) != LETTER_P (d, 1)) - - -#ifdef RX_SUPPORT_CONTINUATIONS -#define RX_STACK_ALLOC(BYTES) malloc(BYTES) -#define RX_STACK_FREE(MEM) free(MEM) -#else -#define RX_STACK_ALLOC(BYTES) alloca(BYTES) -#define RX_STACK_FREE(MEM) \ - ((struct rx_stack_chunk *)MEM)->next_chunk = search_state.free_chunks; \ - search_state.free_chunks = ((struct rx_stack_chunk *)MEM); - -#endif - -#define PUSH(CHUNK_VAR,BYTES) \ - if (!CHUNK_VAR || (CHUNK_VAR->bytes_left < (BYTES))) \ - { \ - struct rx_stack_chunk * new_chunk; \ - if (search_state.free_chunks) \ - { \ - new_chunk = search_state.free_chunks; \ - search_state.free_chunks = search_state.free_chunks->next_chunk; \ - } \ - else \ - { \ - new_chunk = (struct rx_stack_chunk *)RX_STACK_ALLOC(search_state.chunk_bytes); \ - if (!new_chunk) \ - { \ - search_state.ret_val = 0; \ - goto test_do_return; \ - } \ - } \ - new_chunk->sp = (char *)new_chunk + sizeof (struct rx_stack_chunk); \ - new_chunk->bytes_left = (search_state.chunk_bytes \ - - (BYTES) \ - - sizeof (struct rx_stack_chunk)); \ - new_chunk->next_chunk = CHUNK_VAR; \ - CHUNK_VAR = new_chunk; \ - } \ - else \ - (CHUNK_VAR->sp += (BYTES)), (CHUNK_VAR->bytes_left -= (BYTES)) - -#define POP(CHUNK_VAR,BYTES) \ - if (CHUNK_VAR->sp == ((char *)CHUNK_VAR + sizeof(*CHUNK_VAR))) \ - { \ - struct rx_stack_chunk * new_chunk = CHUNK_VAR->next_chunk; \ - RX_STACK_FREE(CHUNK_VAR); \ - CHUNK_VAR = new_chunk; \ - } \ - else \ - (CHUNK_VAR->sp -= BYTES), (CHUNK_VAR->bytes_left += BYTES) - - - -#define SRCH_TRANSLATE(C) search_state.translate[(unsigned char) (C)] - - - - -#ifdef __STDC__ -RX_DECL __inline__ int -rx_search (struct re_pattern_buffer * rxb, - int startpos, - int range, - int stop, - int total_size, - rx_get_burst_fn get_burst, - rx_back_check_fn back_check, - rx_fetch_char_fn fetch_char, - void * app_closure, - struct re_registers * regs, - struct rx_search_state * resume_state, - struct rx_search_state * save_state) -#else -RX_DECL __inline__ int -rx_search (rxb, startpos, range, stop, total_size, - get_burst, back_check, fetch_char, - app_closure, regs, resume_state, save_state) - struct re_pattern_buffer * rxb; - int startpos; - int range; - int stop; - int total_size; - rx_get_burst_fn get_burst; - rx_back_check_fn back_check; - rx_fetch_char_fn fetch_char; - void * app_closure; - struct re_registers * regs; - struct rx_search_state * resume_state; - struct rx_search_state * save_state; -#endif -{ - int pc; - int test_state; - struct rx_search_state search_state; - - search_state.free_chunks = 0; - if (!resume_state) - pc = rx_outer_start; - else - { - search_state = *resume_state; - regs = search_state.saved_regs; - rxb = search_state.saved_rxb; - startpos = search_state.saved_startpos; - range = search_state.saved_range; - stop = search_state.saved_stop; - total_size = search_state.saved_total_size; - get_burst = search_state.saved_get_burst; - back_check = search_state.saved_back_check; - pc = search_state.outer_search_resume_pt; - if (0) - { - return_continuation: - if (save_state) - { - *save_state = search_state; - save_state->saved_regs = regs; - save_state->saved_rxb = rxb; - save_state->saved_startpos = startpos; - save_state->saved_range = range; - save_state->saved_stop = stop; - save_state->saved_total_size = total_size; - save_state->saved_get_burst = get_burst; - save_state->saved_back_check = back_check; - save_state->outer_search_resume_pt = pc; - } - return rx_search_continuation; - } - } - - switch (pc) - { - case rx_outer_start: - search_state.ret_val = rx_search_fail; - ( search_state.lparen - = search_state.rparen - = search_state.best_lpspace - = search_state.best_rpspace - = 0); - - /* figure the number of registers we may need for use in backreferences. - * the number here includes an element for register zero. - */ - search_state.num_regs = rxb->re_nsub + 1; - - - /* check for out-of-range startpos. */ - if ((startpos < 0) || (startpos > total_size)) - return rx_search_fail; - - /* fix up range if it might eventually take us outside the string. */ - { - int endpos; - endpos = startpos + range; - if (endpos < -1) - range = (-1 - startpos); - else if (endpos > (total_size + 1)) - range = total_size - startpos; - } - - /* if the search isn't to be a backwards one, don't waste time in a - * long search for a pattern that says it is anchored. - */ - if (rxb->begbuf_only && (range > 0)) - { - if (startpos > 0) - return rx_search_fail; - else - range = 1; - } - - /* decide whether to use internal or user-provided reg buffers. */ - if (!regs || rxb->no_sub) - { - search_state.best_lpspace = - (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.best_rpspace = - (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.best_lparen = search_state.best_lpspace; - search_state.best_rparen = search_state.best_rpspace; - } - else - { - /* have the register data arrays been allocated? */ - if (rxb->regs_allocated == REGS_UNALLOCATED) - { /* no. so allocate them with malloc. we need one - extra element beyond `search_state.num_regs' for the `-1' marker - gnu code uses. */ - regs->num_regs = MAX (RE_NREGS, rxb->re_nsub + 1); - regs->start = ((regoff_t *) - malloc (regs->num_regs * sizeof ( regoff_t))); - regs->end = ((regoff_t *) - malloc (regs->num_regs * sizeof ( regoff_t))); - if (regs->start == 0 || regs->end == 0) - return rx_search_error; - rxb->regs_allocated = REGS_REALLOCATE; - } - else if (rxb->regs_allocated == REGS_REALLOCATE) - { /* yes. if we need more elements than were already - allocated, reallocate them. if we need fewer, just - leave it alone. */ - if (regs->num_regs < search_state.num_regs + 1) - { - regs->num_regs = search_state.num_regs + 1; - regs->start = ((regoff_t *) - realloc (regs->start, - regs->num_regs * sizeof (regoff_t))); - regs->end = ((regoff_t *) - realloc (regs->end, - regs->num_regs * sizeof ( regoff_t))); - if (regs->start == 0 || regs->end == 0) - return rx_search_error; - } - } - else if (rxb->regs_allocated != REGS_FIXED) - return rx_search_error; - - if (regs->num_regs < search_state.num_regs + 1) - { - search_state.best_lpspace = - ((regoff_t *) - REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t))); - search_state.best_rpspace = - ((regoff_t *) - REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t))); - search_state.best_lparen = search_state.best_lpspace; - search_state.best_rparen = search_state.best_rpspace; - } - else - { - search_state.best_lparen = regs->start; - search_state.best_rparen = regs->end; - } - } - - search_state.lparen = - (regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - search_state.rparen = - (regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); - - if (! ( search_state.best_rparen - && search_state.best_lparen - && search_state.lparen && search_state.rparen)) - return rx_search_error; - - search_state.best_last_l = search_state.best_last_r = -1; - - search_state.translate = (rxb->translate - ? rxb->translate - : rx_id_translation); - - - - /* - * two nfa's were compiled. - * `0' is complete. - * `1' faster but gets registers wrong and ends too soon. - */ - search_state.nfa_choice = (regs && !rxb->least_subs) ? '\0' : '\1'; - - /* we have the option to look for the best match or the first - * one we can find. if the user isn't asking for register information, - * we don't need to find the best match. - */ - search_state.first_found = !regs; - - if (range >= 0) - { - search_state.outer_pos.search_end = startpos + range; - search_state.outer_pos.search_direction = 1; - } - else - { - search_state.outer_pos.search_end = startpos + range; - search_state.outer_pos.search_direction = -1; - } - - /* the vacuous search always turns up nothing. */ - if ((search_state.outer_pos.search_direction == 1) - ? (startpos > search_state.outer_pos.search_end) - : (startpos < search_state.outer_pos.search_end)) - return rx_search_fail; - - /* now we build the starting state of the supernfa. */ - { - struct rx_superset * start_contents; - struct rx_nfa_state_set * start_nfa_set; - - /* we presume here that the nfa start state has only one - * possible future with no side effects. - */ - start_nfa_set = rxb->start->futures->destset; - if ( rxb->rx.start_set - && (rxb->rx.start_set->starts_for == &rxb->rx)) - start_contents = rxb->rx.start_set; - else - { - start_contents = - rx_superstate_eclosure_union (&rxb->rx, - rx_superset_cons (&rxb->rx, 0, 0), - start_nfa_set); - - if (!start_contents) - return rx_search_fail; - - start_contents->starts_for = &rxb->rx; - rxb->rx.start_set = start_contents; - } - if ( start_contents->superstate - && (start_contents->superstate->rx_id == rxb->rx.rx_id)) - { - search_state.start_super = start_contents->superstate; - rx_lock_superstate (&rxb->rx, search_state.start_super); - } - else - { - rx_protect_superset (&rxb->rx, start_contents); - - search_state.start_super = rx_superstate (&rxb->rx, start_contents); - if (!search_state.start_super) - return rx_search_fail; - rx_lock_superstate (&rxb->rx, search_state.start_super); - rx_release_superset (&rxb->rx, start_contents); - } - } - - - /* The outer_pos tracks the position within the strings - * as seen by loop that calls fastmap_search. - * - * The caller supplied get_burst function actually - * gives us pointers to chars. - * - * Communication with the get_burst function is through an - * rx_string_position structure. Here, the structure for - * outer_pos is initialized. It is set to point to the - * NULL string, at an offset of STARTPOS. STARTPOS is out - * of range of the NULL string, so the first call to - * getburst will patch up the rx_string_position to point - * to valid characters. - */ - - ( search_state.outer_pos.string - = search_state.outer_pos.end - = 0); - - search_state.outer_pos.offset = 0; - search_state.outer_pos.size = 0; - search_state.outer_pos.pos = (unsigned char *)(long)startpos; - init_fastmap (rxb, &search_state); - - search_state.fastmap_resume_pt = rx_fastmap_start; - case rx_outer_fastmap: - /* do { */ - pseudo_do: - { - { - int fastmap_state; - fastmap_state = fastmap_search (rxb, stop, get_burst, app_closure, - &search_state); - switch (fastmap_state) - { - case rx_fastmap_continuation: - pc = rx_outer_fastmap; - goto return_continuation; - case rx_fastmap_fail: - goto finish; - case rx_fastmap_ok: - break; - } - } - - /* now the fastmap loop has brought us to a plausible - * starting point for a match. so, it's time to run the - * nfa and see if a match occured. - */ - startpos = ( search_state.outer_pos.pos - - search_state.outer_pos.string - + search_state.outer_pos.offset); -#if 0 -/*|*/ if ((range > 0) && (startpos == search_state.outer_pos.search_end)) -/*|*/ goto finish; -#endif - } - - search_state.test_match_resume_pt = rx_test_start; - /* do interrupted for entry point... */ - case rx_outer_test: - /* ...do continued */ - { - goto test_match; - test_returns_to_search: - switch (test_state) - { - case rx_test_continuation: - pc = rx_outer_test; - goto return_continuation; - case rx_test_error: - search_state.ret_val = rx_search_error; - goto finish; - case rx_test_fail: - break; - case rx_test_ok: - goto finish; - } - search_state.outer_pos.pos += search_state.outer_pos.search_direction; - startpos += search_state.outer_pos.search_direction; -#if 0 -/*|*/ if (search_state.test_pos.pos < search_state.test_pos.end) -/*|*/ break; -#endif - } - /* do interrupted for entry point... */ - case rx_outer_restore_pos: - { - int x; - x = get_burst (&search_state.outer_pos, app_closure, stop); - switch (x) - { - case rx_get_burst_continuation: - pc = rx_outer_restore_pos; - goto return_continuation; - case rx_get_burst_error: - search_state.ret_val = rx_search_error; - goto finish; - case rx_get_burst_no_more: - if (rxb->can_match_empty) - break; - goto finish; - case rx_get_burst_ok: - break; - } - } /* } while (...see below...) */ - - if ((search_state.outer_pos.search_direction == 1) - ? (startpos <= search_state.outer_pos.search_end) - : (startpos > search_state.outer_pos.search_end)) - goto pseudo_do; - - - finish: - uninit_fastmap (rxb, &search_state); - if (search_state.start_super) - rx_unlock_superstate (&rxb->rx, search_state.start_super); - -#ifdef regex_malloc - if (search_state.lparen) free (search_state.lparen); - if (search_state.rparen) free (search_state.rparen); - if (search_state.best_lpspace) free (search_state.best_lpspace); - if (search_state.best_rpspace) free (search_state.best_rpspace); -#endif - return search_state.ret_val; - } - - - test_match: - { - enum rx_test_match_entry test_pc; - int inx; - test_pc = search_state.test_match_resume_pt; - if (test_pc == rx_test_start) - { -#ifdef RX_DEBUG - search_state.backtrack_depth = 0; -#endif - search_state.last_l = search_state.last_r = 0; - search_state.lparen[0] = startpos; - search_state.super = search_state.start_super; - search_state.c = search_state.nfa_choice; - search_state.test_pos.pos = search_state.outer_pos.pos - 1; - search_state.test_pos.string = search_state.outer_pos.string; - search_state.test_pos.end = search_state.outer_pos.end; - search_state.test_pos.offset = search_state.outer_pos.offset; - search_state.test_pos.size = search_state.outer_pos.size; - search_state.test_pos.search_direction = 1; - search_state.counter_stack = 0; - search_state.backtrack_stack = 0; - search_state.backtrack_frame_bytes = - (sizeof (struct rx_backtrack_frame) - + (rxb->match_regs_on_stack - ? sizeof (regoff_t) * (search_state.num_regs + 1) * 2 - : 0)); - search_state.chunk_bytes = search_state.backtrack_frame_bytes * 64; - search_state.test_ret = rx_test_line_finished; - search_state.could_have_continued = 0; - } - /* This is while (1)...except that the body of the loop is interrupted - * by some alternative entry points. - */ - pseudo_while_1: - switch (test_pc) - { - case rx_test_cache_hit_loop: - goto resume_continuation_1; - case rx_test_backreference_check: - goto resume_continuation_2; - case rx_test_backtrack_return: - goto resume_continuation_3; - case rx_test_start: -#ifdef RX_DEBUG - /* There is a search tree with every node as set of deterministic - * transitions in the super nfa. For every branch of a - * backtrack point is an edge in the tree. - * This counts up a pre-order of nodes in that tree. - * It's saved on the search stack and printed when debugging. - */ - search_state.line_no = 0; - search_state.lines_found = 0; -#endif - - top_of_cycle: - /* A superstate is basicly a transition table, indexed by - * characters from the string being tested, and containing - * RX_INX (`instruction frame') structures. - */ - search_state.ifr = &search_state.super->transitions [search_state.c]; - - recurse_test_match: - /* This is the point to which control is sent when the - * test matcher `recurses'. Before jumping here, some variables - * need to be saved on the stack and the next instruction frame - * has to be computed. - */ - - restart: - /* Some instructions don't advance the matcher, but just - * carry out some side effects and fetch a new instruction. - * To dispatch that new instruction, `goto restart'. - */ - - { - struct rx_inx * next_tr_table; - struct rx_inx * this_tr_table; - /* The fastest route through the loop is when the instruction - * is RX_NEXT_CHAR. This case is detected when SEARCH_STATE.IFR->DATA - * is non-zero. In that case, it points to the next - * superstate. - * - * This allows us to not bother fetching the bytecode. - */ - next_tr_table = (struct rx_inx *)search_state.ifr->data; - this_tr_table = search_state.super->transitions; - while (next_tr_table) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp; - - fprintf (stderr, "%d %d>> re_next_char @ %d (%d)", - search_state.line_no, - search_state.backtrack_depth, - (search_state.test_pos.pos - search_state.test_pos.string - + search_state.test_pos.offset), search_state.c); - - search_state.super = - ((struct rx_superstate *) - ((char *)this_tr_table - - ((unsigned long) - ((struct rx_superstate *)0)->transitions))); - - setp = search_state.super->contents; - fprintf (stderr, " superstet (rx=%d, &=%x: ", - rxb->rx.rx_id, setp); - while (setp) - { - fprintf (stderr, "%d ", setp->id); - setp = setp->cdr; - } - fprintf (stderr, "\n"); - } -#endif - this_tr_table = next_tr_table; - ++search_state.test_pos.pos; - if (search_state.test_pos.pos == search_state.test_pos.end) - { - int burst_state; - try_burst_1: - burst_state = get_burst (&search_state.test_pos, - app_closure, stop); - switch (burst_state) - { - case rx_get_burst_continuation: - search_state.saved_this_tr_table = this_tr_table; - search_state.saved_next_tr_table = next_tr_table; - test_pc = rx_test_cache_hit_loop; - goto test_return_continuation; - - resume_continuation_1: - /* Continuation one jumps here to do its work: */ - search_state.saved_this_tr_table = this_tr_table; - search_state.saved_next_tr_table = next_tr_table; - goto try_burst_1; - - case rx_get_burst_ok: - /* get_burst succeeded...keep going */ - break; - - case rx_get_burst_no_more: - search_state.test_ret = rx_test_line_finished; - search_state.could_have_continued = 1; - goto test_do_return; - - case rx_get_burst_error: - /* An error... */ - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - } - search_state.c = *search_state.test_pos.pos; - search_state.ifr = this_tr_table + search_state.c; - next_tr_table = (struct rx_inx *)search_state.ifr->data; - } /* Fast loop through cached transition tables */ - - /* Here when we ran out of cached next-char transitions. - * So, it will be necessary to do a more expensive - * dispatch on the current instruction. The superstate - * pointer is allowed to become invalid during next-char - * transitions -- now we must bring it up to date. - */ - search_state.super = - ((struct rx_superstate *) - ((char *)this_tr_table - - ((unsigned long) - ((struct rx_superstate *)0)->transitions))); - } - - /* We've encountered an instruction other than next-char. - * Dispatch that instruction: - */ - inx = (long)search_state.ifr->inx; -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp = search_state.super->contents; - - fprintf (stderr, "%d %d>> %s @ %d (%d)", search_state.line_no, - search_state.backtrack_depth, - inx_names[inx], - (search_state.test_pos.pos - search_state.test_pos.string - + (test_pos.half == 0 ? 0 : size1)), search_state.c); - - fprintf (stderr, " superstet (rx=%d, &=%x: ", - rxb->rx.rx_id, setp); - while (setp) - { - fprintf (stderr, "%d ", setp->id); - setp = setp->cdr; - } - fprintf (stderr, "\n"); - } -#endif - switch ((enum rx_opcode)inx) - { - case rx_do_side_effects: - - /* RX_DO_SIDE_EFFECTS occurs when we cross epsilon - * edges associated with parentheses, backreferencing, etc. - */ - { - struct rx_distinct_future * df = - (struct rx_distinct_future *)search_state.ifr->data_2; - struct rx_se_list * el = df->effects; - /* Side effects come in lists. This walks down - * a list, dispatching. - */ - while (el) - { - long effect; - effect = (long)el->car; - if (effect < 0) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - { - struct rx_superset * setp = search_state.super->contents; - - fprintf (stderr, "....%d %d>> %s\n", search_state.line_no, - search_state.backtrack_depth, - efnames[-effect]); - } -#endif - switch ((enum re_side_effects) effect) - - { - case re_se_pushback: - search_state.ifr = &df->future_frame; - if (!search_state.ifr->data) - { - struct rx_superstate * sup; - sup = search_state.super; - rx_lock_superstate (rx, sup); - if (!rx_handle_cache_miss (&rxb->rx, - search_state.super, - search_state.c, - (search_state.ifr - ->data_2))) - { - rx_unlock_superstate (rx, sup); - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - rx_unlock_superstate (rx, sup); - } - /* --search_state.test_pos.pos; */ - search_state.c = 't'; - search_state.super - = ((struct rx_superstate *) - ((char *)search_state.ifr->data - - (long)(((struct rx_superstate *)0) - ->transitions))); - goto top_of_cycle; - break; - case re_se_push0: - { - struct rx_counter_frame * old_cf - = (search_state.counter_stack - ? ((struct rx_counter_frame *) - search_state.counter_stack->sp) - : 0); - struct rx_counter_frame * cf; - PUSH (search_state.counter_stack, - sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - cf->tag = re_se_iter; - cf->val = 0; - cf->inherited_from = 0; - cf->cdr = old_cf; - break; - } - case re_se_fail: - goto test_do_return; - case re_se_begbuf: - if (!AT_STRINGS_BEG ()) - goto test_do_return; - break; - case re_se_endbuf: - if (!AT_STRINGS_END ()) - goto test_do_return; - break; - case re_se_wordbeg: - if ( LETTER_P (&search_state.test_pos, 1) - && ( AT_STRINGS_BEG() - || !LETTER_P (&search_state.test_pos, 0))) - break; - else - goto test_do_return; - case re_se_wordend: - if ( !AT_STRINGS_BEG () - && LETTER_P (&search_state.test_pos, 0) - && (AT_STRINGS_END () - || !LETTER_P (&search_state.test_pos, 1))) - break; - else - goto test_do_return; - case re_se_wordbound: - if (AT_WORD_BOUNDARY (&search_state.test_pos)) - break; - else - goto test_do_return; - case re_se_notwordbound: - if (!AT_WORD_BOUNDARY (&search_state.test_pos)) - break; - else - goto test_do_return; - case re_se_hat: - if (AT_STRINGS_BEG ()) - { - if (rxb->not_bol) - goto test_do_return; - else - break; - } - else - { - char pos_c = *search_state.test_pos.pos; - if ( (SRCH_TRANSLATE (pos_c) - == SRCH_TRANSLATE('\n')) - && rxb->newline_anchor) - break; - else - goto test_do_return; - } - case re_se_dollar: - if (AT_STRINGS_END ()) - { - if (rxb->not_eol) - goto test_do_return; - else - break; - } - else - { - if ( ( SRCH_TRANSLATE (fetch_char - (&search_state.test_pos, 1, - app_closure, stop)) - == SRCH_TRANSLATE ('\n')) - && rxb->newline_anchor) - break; - else - goto test_do_return; - } - - case re_se_try: - /* This is the first side effect in every - * expression. - * - * FOR NO GOOD REASON...get rid of it... - */ - break; - - case re_se_pushpos: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - struct rx_counter_frame * old_cf - = (search_state.counter_stack - ? ((struct rx_counter_frame *) - search_state.counter_stack->sp) - : 0); - struct rx_counter_frame * cf; - PUSH(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - cf->tag = re_se_pushpos; - cf->val = urhere; - cf->inherited_from = 0; - cf->cdr = old_cf; - break; - } - - case re_se_chkpos: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - struct rx_counter_frame * cf - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (cf->val == urhere) - goto test_do_return; - cf->val = urhere; - break; - } - break; - - case re_se_poppos: - POP(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - break; - - - case re_se_at_dot: - case re_se_syntax: - case re_se_not_syntax: -#ifdef emacs - /* - * this release lacks emacs support - */ -#endif - break; - case re_se_win: - case re_se_lparen: - case re_se_rparen: - case re_se_backref: - case re_se_iter: - case re_se_end_iter: - case re_se_tv: - case re_floogle_flap: - search_state.ret_val = 0; - goto test_do_return; - } - } - else - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "....%d %d>> %s %d %d\n", search_state.line_no, - search_state.backtrack_depth, - efnames2[rxb->se_params [effect].se], - rxb->se_params [effect].op1, - rxb->se_params [effect].op2); -#endif - switch (rxb->se_params [effect].se) - { - case re_se_win: - /* This side effect indicates that we've - * found a match, though not necessarily the - * best match. This is a fancy assignment to - * register 0 unless the caller didn't - * care about registers. In which case, - * this stops the match. - */ - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - - if ( (search_state.best_last_r < 0) - || (urhere + 1 > search_state.best_rparen[0])) - { - /* Record the best known and keep - * looking. - */ - int x; - for (x = 0; x <= search_state.last_l; ++x) - search_state.best_lparen[x] = search_state.lparen[x]; - search_state.best_last_l = search_state.last_l; - for (x = 0; x <= search_state.last_r; ++x) - search_state.best_rparen[x] = search_state.rparen[x]; - search_state.best_rparen[0] = urhere + 1; - search_state.best_last_r = search_state.last_r; - } - /* If we're not reporting the match-length - * or other register info, we need look no - * further. - */ - if (search_state.first_found) - { - search_state.test_ret = rx_test_found_first; - goto test_do_return; - } - } - break; - case re_se_lparen: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - - int reg = rxb->se_params [effect].op1; -#if 0 - if (reg > search_state.last_l) -#endif - { - search_state.lparen[reg] = urhere + 1; - /* In addition to making this assignment, - * we now know that lower numbered regs - * that haven't already been assigned, - * won't be. We make sure they're - * filled with -1, so they can be - * recognized as unassigned. - */ - if (search_state.last_l < reg) - while (++search_state.last_l < reg) - search_state.lparen[search_state.last_l] = -1; - } - break; - } - - case re_se_rparen: - { - int urhere = - ((int)(search_state.test_pos.pos - - search_state.test_pos.string) - + search_state.test_pos.offset); - int reg = rxb->se_params [effect].op1; - search_state.rparen[reg] = urhere + 1; - if (search_state.last_r < reg) - { - while (++search_state.last_r < reg) - search_state.rparen[search_state.last_r] - = -1; - } - break; - } - - case re_se_backref: - { - int reg = rxb->se_params [effect].op1; - if ( reg > search_state.last_r - || search_state.rparen[reg] < 0) - goto test_do_return; - - { - int backref_status; - check_backreference: - backref_status - = back_check (&search_state.test_pos, - search_state.lparen[reg], - search_state.rparen[reg], - search_state.translate, - app_closure, - stop); - switch (backref_status) - { - case rx_back_check_continuation: - search_state.saved_reg = reg; - test_pc = rx_test_backreference_check; - goto test_return_continuation; - resume_continuation_2: - reg = search_state.saved_reg; - goto check_backreference; - case rx_back_check_fail: - /* Fail */ - goto test_do_return; - case rx_back_check_pass: - /* pass -- - * test_pos now advanced to last - * char matched by backref - */ - break; - } - } - break; - } - case re_se_iter: - { - struct rx_counter_frame * csp - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (csp->val == rxb->se_params[effect].op2) - goto test_do_return; - else - ++csp->val; - break; - } - case re_se_end_iter: - { - struct rx_counter_frame * csp - = ((struct rx_counter_frame *) - search_state.counter_stack->sp); - if (csp->val < rxb->se_params[effect].op1) - goto test_do_return; - else - { - struct rx_counter_frame * source = csp; - while (source->inherited_from) - source = source->inherited_from; - if (!source || !source->cdr) - { - POP(search_state.counter_stack, - sizeof(struct rx_counter_frame)); - } - else - { - source = source->cdr; - csp->val = source->val; - csp->tag = source->tag; - csp->cdr = 0; - csp->inherited_from = source; - } - } - break; - } - case re_se_tv: - /* is a noop */ - break; - case re_se_try: - case re_se_pushback: - case re_se_push0: - case re_se_pushpos: - case re_se_chkpos: - case re_se_poppos: - case re_se_at_dot: - case re_se_syntax: - case re_se_not_syntax: - case re_se_begbuf: - case re_se_hat: - case re_se_wordbeg: - case re_se_wordbound: - case re_se_notwordbound: - case re_se_wordend: - case re_se_endbuf: - case re_se_dollar: - case re_se_fail: - case re_floogle_flap: - search_state.ret_val = 0; - goto test_do_return; - } - } - el = el->cdr; - } - /* Now the side effects are done, - * so get the next instruction. - * and move on. - */ - search_state.ifr = &df->future_frame; - goto restart; - } - - case rx_backtrack_point: - { - /* A backtrack point indicates that we've reached a - * non-determinism in the superstate NFA. This is a - * loop that exhaustively searches the possibilities. - * - * A backtracking strategy is used. We keep track of what - * registers are valid so we can erase side effects. - * - * First, make sure there is some stack space to hold - * our state. - */ - - struct rx_backtrack_frame * bf; - - PUSH(search_state.backtrack_stack, - search_state.backtrack_frame_bytes); -#ifdef RX_DEBUG_0 - ++search_state.backtrack_depth; -#endif - - bf = ((struct rx_backtrack_frame *) - search_state.backtrack_stack->sp); - { - bf->stk_super = search_state.super; - /* We prevent the current superstate from being - * deleted from the superstate cache. - */ - rx_lock_superstate (&rxb->rx, search_state.super); -#ifdef RX_DEBUG_0 - bf->stk_search_state.line_no = search_state.line_no; -#endif - bf->stk_c = search_state.c; - bf->stk_test_pos = search_state.test_pos; - bf->stk_last_l = search_state.last_l; - bf->stk_last_r = search_state.last_r; - bf->df = ((struct rx_super_edge *) - search_state.ifr->data_2)->options; - bf->first_df = bf->df; - bf->counter_stack_sp = (search_state.counter_stack - ? search_state.counter_stack->sp - : 0); - bf->stk_test_ret = search_state.test_ret; - if (rxb->match_regs_on_stack) - { - int x; - regoff_t * stk = - (regoff_t *)((char *)bf + sizeof (*bf)); - for (x = 0; x <= search_state.last_l; ++x) - stk[x] = search_state.lparen[x]; - stk += x; - for (x = 0; x <= search_state.last_r; ++x) - stk[x] = search_state.rparen[x]; - } - } - - /* Here is a while loop whose body is mainly a function - * call and some code to handle a return from that - * function. - * - * From here on for the rest of `case backtrack_point' it - * is unsafe to assume that the search_state copies of - * variables saved on the backtracking stack are valid - * -- so read their values from the backtracking stack. - * - * This lets us use one generation fewer stack saves in - * the call-graph of a search. - */ - - while_non_det_options: -#ifdef RX_DEBUG_0 - ++search_state.lines_found; - if (rx_debug_trace) - fprintf (stderr, "@@@ %d calls %d @@@\n", - search_state.line_no, search_state.lines_found); - - search_state.line_no = search_state.lines_found; -#endif - - if (bf->df->next_same_super_edge[0] == bf->first_df) - { - /* This is a tail-call optimization -- we don't recurse - * for the last of the possible futures. - */ - search_state.ifr = (bf->df->effects - ? &bf->df->side_effects_frame - : &bf->df->future_frame); - - rx_unlock_superstate (&rxb->rx, search_state.super); - POP(search_state.backtrack_stack, - search_state.backtrack_frame_bytes); -#ifdef RX_DEBUG - --search_state.backtrack_depth; -#endif - goto restart; - } - else - { - if (search_state.counter_stack) - { - struct rx_counter_frame * old_cf - = ((struct rx_counter_frame *)search_state.counter_stack->sp); - struct rx_counter_frame * cf; - PUSH(search_state.counter_stack, sizeof (struct rx_counter_frame)); - cf = ((struct rx_counter_frame *)search_state.counter_stack->sp); - cf->tag = old_cf->tag; - cf->val = old_cf->val; - cf->inherited_from = old_cf; - cf->cdr = 0; - } - /* `Call' this test-match block */ - search_state.ifr = (bf->df->effects - ? &bf->df->side_effects_frame - : &bf->df->future_frame); - goto recurse_test_match; - } - - /* Returns in this block are accomplished by - * goto test_do_return. There are two cases. - * If there is some search-stack left, - * then it is a return from a `recursive' call. - * If there is no search-stack left, then - * we should return to the fastmap/search loop. - */ - - test_do_return: - - if (!search_state.backtrack_stack) - { -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "!!! %d bails returning %d !!!\n", - search_state.line_no, search_state.test_ret); -#endif - - /* No more search-stack -- this test is done. */ - if (search_state.test_ret != rx_test_internal_error) - goto return_from_test_match; - else - goto error_in_testing_match; - } - - /* Returning from a recursive call to - * the test match block: - */ - - bf = ((struct rx_backtrack_frame *) - search_state.backtrack_stack->sp); -#ifdef RX_DEBUG_0 - if (rx_debug_trace) - fprintf (stderr, "+++ %d returns %d (to %d)+++\n", - search_state.line_no, - search_state.test_ret, - bf->stk_search_state.line_no); -#endif - - while (search_state.counter_stack - && (!bf->counter_stack_sp - || (bf->counter_stack_sp - != search_state.counter_stack->sp))) - { - POP(search_state.counter_stack, - sizeof (struct rx_counter_frame)); - } - - if (search_state.test_ret == rx_test_internal_error) - { - POP (search_state.backtrack_stack, - search_state.backtrack_frame_bytes); - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - - /* If a non-longest match was found and that is good - * enough, return immediately. - */ - if ( (search_state.test_ret == rx_test_found_first) - && search_state.first_found) - { - rx_unlock_superstate (&rxb->rx, bf->stk_super); - POP (search_state.backtrack_stack, - search_state.backtrack_frame_bytes); - goto test_do_return; - } - - search_state.test_ret = bf->stk_test_ret; - search_state.last_l = bf->stk_last_l; - search_state.last_r = bf->stk_last_r; - bf->df = bf->df->next_same_super_edge[0]; - search_state.super = bf->stk_super; - search_state.c = bf->stk_c; -#ifdef RX_DEBUG_0 - search_state.line_no = bf->stk_search_state.line_no; -#endif - - if (rxb->match_regs_on_stack) - { - int x; - regoff_t * stk = - (regoff_t *)((char *)bf + sizeof (*bf)); - for (x = 0; x <= search_state.last_l; ++x) - search_state.lparen[x] = stk[x]; - stk += x; - for (x = 0; x <= search_state.last_r; ++x) - search_state.rparen[x] = stk[x]; - } - - { - int x; - try_burst_2: - x = get_burst (&bf->stk_test_pos, app_closure, stop); - switch (x) - { - case rx_get_burst_continuation: - search_state.saved_bf = bf; - test_pc = rx_test_backtrack_return; - goto test_return_continuation; - resume_continuation_3: - bf = search_state.saved_bf; - goto try_burst_2; - case rx_get_burst_no_more: - /* Since we've been here before, it is some kind of - * error that we can't return. - */ - case rx_get_burst_error: - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - case rx_get_burst_ok: - break; - } - } - search_state.test_pos = bf->stk_test_pos; - goto while_non_det_options; - } - - - case rx_cache_miss: - /* Because the superstate NFA is lazily constructed, - * and in fact may erode from underneath us, we sometimes - * have to construct the next instruction from the hard way. - * This invokes one step in the lazy-conversion. - */ - search_state.ifr = rx_handle_cache_miss (&rxb->rx, - search_state.super, - search_state.c, - search_state.ifr->data_2); - if (!search_state.ifr) - { - search_state.test_ret = rx_test_internal_error; - goto test_do_return; - } - goto restart; - - case rx_backtrack: - /* RX_BACKTRACK means that we've reached the empty - * superstate, indicating that match can't succeed - * from this point. - */ - goto test_do_return; - - case rx_next_char: - case rx_error_inx: - case rx_num_instructions: - search_state.ret_val = 0; - goto test_do_return; - } - goto pseudo_while_1; - } - - /* Healthy exits from the test-match loop do a - * `goto return_from_test_match' On the other hand, - * we might end up here. - */ - error_in_testing_match: - test_state = rx_test_error; - goto test_returns_to_search; - - /***** fastmap/search loop body - * considering the results testing for a match - */ - - return_from_test_match: - - if (search_state.best_last_l >= 0) - { - if (regs && (regs->start != search_state.best_lparen)) - { - bcopy (search_state.best_lparen, regs->start, - regs->num_regs * sizeof (int)); - bcopy (search_state.best_rparen, regs->end, - regs->num_regs * sizeof (int)); - } - if (regs && !rxb->no_sub) - { - int q; - int bound = (regs->num_regs > search_state.num_regs - ? regs->num_regs - : search_state.num_regs); - regoff_t * s = regs->start; - regoff_t * e = regs->end; - for (q = search_state.best_last_l + 1; q < bound; ++q) - s[q] = e[q] = -1; - } - search_state.ret_val = search_state.best_lparen[0]; - test_state = rx_test_ok; - goto test_returns_to_search; - } - else - { - test_state = rx_test_fail; - goto test_returns_to_search; - } - - test_return_continuation: - search_state.test_match_resume_pt = test_pc; - test_state = rx_test_continuation; - goto test_returns_to_search; - } -} - - - -#endif /* RX_WANT_RX_DEFS */ - - - -#else /* RX_WANT_SE_DEFS */ - /* Integers are used to represent side effects. - * - * Simple side effects are given negative integer names by these enums. - * - * Non-negative names are reserved for complex effects. - * - * Complex effects are those that take arguments. For example, - * a register assignment associated with a group is complex because - * it requires an argument to tell which group is being matched. - * - * The integer name of a complex effect is an index into rxb->se_params. - */ - - RX_DEF_SE(1, re_se_try, = -1) /* Epsilon from start state */ - - RX_DEF_SE(0, re_se_pushback, = re_se_try - 1) - RX_DEF_SE(0, re_se_push0, = re_se_pushback -1) - RX_DEF_SE(0, re_se_pushpos, = re_se_push0 - 1) - RX_DEF_SE(0, re_se_chkpos, = re_se_pushpos -1) - RX_DEF_SE(0, re_se_poppos, = re_se_chkpos - 1) - - RX_DEF_SE(1, re_se_at_dot, = re_se_poppos - 1) /* Emacs only */ - RX_DEF_SE(0, re_se_syntax, = re_se_at_dot - 1) /* Emacs only */ - RX_DEF_SE(0, re_se_not_syntax, = re_se_syntax - 1) /* Emacs only */ - - RX_DEF_SE(1, re_se_begbuf, = re_se_not_syntax - 1) /* match beginning of buffer */ - RX_DEF_SE(1, re_se_hat, = re_se_begbuf - 1) /* match beginning of line */ - - RX_DEF_SE(1, re_se_wordbeg, = re_se_hat - 1) - RX_DEF_SE(1, re_se_wordbound, = re_se_wordbeg - 1) - RX_DEF_SE(1, re_se_notwordbound, = re_se_wordbound - 1) - - RX_DEF_SE(1, re_se_wordend, = re_se_notwordbound - 1) - RX_DEF_SE(1, re_se_endbuf, = re_se_wordend - 1) - - /* This fails except at the end of a line. - * It deserves to go here since it is typicly one of the last steps - * in a match. - */ - RX_DEF_SE(1, re_se_dollar, = re_se_endbuf - 1) - - /* Simple effects: */ - RX_DEF_SE(1, re_se_fail, = re_se_dollar - 1) - - /* Complex effects. These are used in the 'se' field of - * a struct re_se_params. Indexes into the se array - * are stored as instructions on nfa edges. - */ - RX_DEF_CPLX_SE(1, re_se_win, = 0) - RX_DEF_CPLX_SE(1, re_se_lparen, = re_se_win + 1) - RX_DEF_CPLX_SE(1, re_se_rparen, = re_se_lparen + 1) - RX_DEF_CPLX_SE(0, re_se_backref, = re_se_rparen + 1) - RX_DEF_CPLX_SE(0, re_se_iter, = re_se_backref + 1) - RX_DEF_CPLX_SE(0, re_se_end_iter, = re_se_iter + 1) - RX_DEF_CPLX_SE(0, re_se_tv, = re_se_end_iter + 1) - -#endif - -#endif diff --git a/gnu/lib/libg++/libstdc++/Makefile b/gnu/lib/libg++/libstdc++/Makefile index f483ed4aa6b..af4fb7ac386 100644 --- a/gnu/lib/libg++/libstdc++/Makefile +++ b/gnu/lib/libg++/libstdc++/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.10 1998/02/19 02:17:06 cgd Exp $ +# $NetBSD: Makefile,v 1.11 1998/09/13 22:23:17 tv Exp $ LIB= stdc++ @@ -13,14 +13,14 @@ ioprims.c ioprintf.c ioseekoff.c ioseekpos.c iostrerror.c ioungetc.c \ iovfprintf.c iovfscanf.c outfloat.c strops.c cmathi.cc cstdlibi.cc \ cstringi.cc exceptioni.cc newi.cc stddefi.cc stdexcepti.cc typeinfoi.cc \ cstrmain.cc cstrio.cc fcomplex.cc fcomio.cc dcomplex.cc dcomio.cc \ -ldcomplex.cc ldcomio.cc random.cc tempbuf.cc tree.cc rx.c \ +ldcomplex.cc ldcomio.cc random.cc tempbuf.cc tree.cc CXXFLAGS+= -nostdinc++ CPPFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../libio -I$(.CURDIR)/stl NOMAN= noman NOLINT= nolint (c++) -.PATH: $(.CURDIR)/../libio $(.CURDIR)/stl $(.CURDIR)/../librx +.PATH: $(.CURDIR)/../libio $(.CURDIR)/stl .if (${MACHINE} != "alpha") LDADD= ${DESTDIR}/usr/lib/c++rt0.o diff --git a/gnu/lib/libg++/libstdc++/shlib_version b/gnu/lib/libg++/libstdc++/shlib_version index 3d7c908e43d..1edea46de91 100644 --- a/gnu/lib/libg++/libstdc++/shlib_version +++ b/gnu/lib/libg++/libstdc++/shlib_version @@ -1,2 +1,2 @@ -major=0 -minor=1 +major=1 +minor=0 |
