diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-10-06 14:00:40 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-10-06 14:00:40 +0200 | 
| commit | 6e9c41a892ed0e0da326e0278b3221ce3f5713b8 (patch) | |
| tree | 2e301d871bbeeb44aa57ff9cc070fcf3be484487 /lib | |
Initial import of sane-backends version 1.0.24-1.2
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Makefile.am | 14 | ||||
| -rw-r--r-- | lib/Makefile.in | 659 | ||||
| -rw-r--r-- | lib/alloca.c | 495 | ||||
| -rw-r--r-- | lib/getenv.c | 18 | ||||
| -rw-r--r-- | lib/getopt.c | 1282 | ||||
| -rw-r--r-- | lib/getopt1.c | 199 | ||||
| -rw-r--r-- | lib/inet_ntop.c | 40 | ||||
| -rw-r--r-- | lib/inet_pton.c | 57 | ||||
| -rw-r--r-- | lib/isfdtype.c | 25 | ||||
| -rw-r--r-- | lib/md5.c | 457 | ||||
| -rw-r--r-- | lib/sigprocmask.c | 53 | ||||
| -rw-r--r-- | lib/sleep.c | 30 | ||||
| -rw-r--r-- | lib/snprintf.c | 532 | ||||
| -rwxr-xr-x | lib/strcasestr.c | 120 | ||||
| -rw-r--r-- | lib/strdup.c | 38 | ||||
| -rw-r--r-- | lib/strndup.c | 39 | ||||
| -rw-r--r-- | lib/strsep.c | 49 | ||||
| -rw-r--r-- | lib/syslog.c | 13 | ||||
| -rw-r--r-- | lib/usleep.c | 60 | ||||
| -rw-r--r-- | lib/vsyslog.c | 15 | 
20 files changed, 4195 insertions, 0 deletions
| diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..d6e2135 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,14 @@ +##  Makefile.am -- an automake template for Makefile.in file +##  Copyright (C) 2009 Chris Bagwell and Sane Developers. +## +##  This file is part of the "Sane" build infra-structure.  See +##  included LICENSE file for license information. +AM_CPPFLAGS = -I. -I$(top_builddir)/include -I$(top_srcdir)/include + +noinst_LTLIBRARIES = liblib.la libfelib.la + +libfelib_la_SOURCES = getopt.c getopt1.c md5.c syslog.c vsyslog.c + +liblib_la_SOURCES = alloca.c getenv.c inet_ntop.c inet_pton.c \ +	isfdtype.c sigprocmask.c sleep.c snprintf.c strcasestr.c \ +	strdup.c strndup.c strsep.c usleep.c diff --git a/lib/Makefile.in b/lib/Makefile.in new file mode 100644 index 0000000..ee46c65 --- /dev/null +++ b/lib/Makefile.in @@ -0,0 +1,659 @@ +# Makefile.in generated by automake 1.13.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ +  case $${target_option-} in \ +      ?) ;; \ +      *) echo "am__make_running_with_option: internal error: invalid" \ +              "target option '$${target_option-}' specified" >&2; \ +         exit 1;; \ +  esac; \ +  has_opt=no; \ +  sane_makeflags=$$MAKEFLAGS; \ +  if $(am__is_gnu_make); then \ +    sane_makeflags=$$MFLAGS; \ +  else \ +    case $$MAKEFLAGS in \ +      *\\[\ \	]*) \ +        bs=\\; \ +        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ +          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \ +    esac; \ +  fi; \ +  skip_next=no; \ +  strip_trailopt () \ +  { \ +    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ +  }; \ +  for flg in $$sane_makeflags; do \ +    test $$skip_next = yes && { skip_next=no; continue; }; \ +    case $$flg in \ +      *=*|--*) continue;; \ +        -*I) strip_trailopt 'I'; skip_next=yes;; \ +      -*I?*) strip_trailopt 'I';; \ +        -*O) strip_trailopt 'O'; skip_next=yes;; \ +      -*O?*) strip_trailopt 'O';; \ +        -*l) strip_trailopt 'l'; skip_next=yes;; \ +      -*l?*) strip_trailopt 'l';; \ +      -[dEDm]) skip_next=yes;; \ +      -[JT]) skip_next=yes;; \ +    esac; \ +    case $$flg in \ +      *$$target_option*) has_opt=yes; break;; \ +    esac; \ +  done; \ +  test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = lib +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ +	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ltoptions.m4 \ +	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ +	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ +	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/byteorder.m4 \ +	$(top_srcdir)/m4/stdint.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +	$(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/sane/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libfelib_la_LIBADD = +am_libfelib_la_OBJECTS = getopt.lo getopt1.lo md5.lo syslog.lo \ +	vsyslog.lo +libfelib_la_OBJECTS = $(am_libfelib_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 =  +liblib_la_LIBADD = +am_liblib_la_OBJECTS = alloca.lo getenv.lo inet_ntop.lo inet_pton.lo \ +	isfdtype.lo sigprocmask.lo sleep.lo snprintf.lo strcasestr.lo \ +	strdup.lo strndup.lo strsep.lo usleep.lo +liblib_la_OBJECTS = $(am_liblib_la_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo "  GEN     " $@; +am__v_GEN_1 =  +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 =  +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include/sane +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ +	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +	$(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo "  CC      " $@; +am__v_CC_1 =  +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +	$(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo "  CCLD    " $@; +am__v_CCLD_1 =  +SOURCES = $(libfelib_la_SOURCES) $(liblib_la_SOURCES) +DIST_SOURCES = $(libfelib_la_SOURCES) $(liblib_la_SOURCES) +am__can_run_installinfo = \ +  case $$AM_UPDATE_INFO_DIR in \ +    n|no|NO) false;; \ +    *) (install-info --version) >/dev/null 2>&1;; \ +  esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates.  Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ +  BEGIN { nonempty = 0; } \ +  { items[$$0] = 1; nonempty = 1; } \ +  END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique.  This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ +  list='$(am__tagged_files)'; \ +  unique=`for i in $$list; do \ +    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +  done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVAHI_CFLAGS = @AVAHI_CFLAGS@ +AVAHI_LIBS = @AVAHI_LIBS@ +AWK = @AWK@ +BACKENDS = @BACKENDS@ +BACKEND_CONFS_ENABLED = @BACKEND_CONFS_ENABLED@ +BACKEND_LIBS_ENABLED = @BACKEND_LIBS_ENABLED@ +BACKEND_MANS_ENABLED = @BACKEND_MANS_ENABLED@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCLEAN_FILES = @DISTCLEAN_FILES@ +DLLTOOL = @DLLTOOL@ +DL_LIBS = @DL_LIBS@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DVIPS = @DVIPS@ +DYNAMIC_FLAG = @DYNAMIC_FLAG@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GPHOTO2_CPPFLAGS = @GPHOTO2_CPPFLAGS@ +GPHOTO2_LDFLAGS = @GPHOTO2_LDFLAGS@ +GPHOTO2_LIBS = @GPHOTO2_LIBS@ +GREP = @GREP@ +HAVE_GPHOTO2 = @HAVE_GPHOTO2@ +IEEE1284_LIBS = @IEEE1284_LIBS@ +INCLUDES = @INCLUDES@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_LOCKPATH = @INSTALL_LOCKPATH@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEG_LIBS = @JPEG_LIBS@ +LATEX = @LATEX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUSB_1_0_CFLAGS = @LIBUSB_1_0_CFLAGS@ +LIBUSB_1_0_LIBS = @LIBUSB_1_0_LIBS@ +LIBV4L_CFLAGS = @LIBV4L_CFLAGS@ +LIBV4L_LIBS = @LIBV4L_LIBS@ +LINKER_RPATH = @LINKER_RPATH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCKPATH_GROUP = @LOCKPATH_GROUP@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINDEX = @MAKEINDEX@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MATH_LIB = @MATH_LIB@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NUMBER_VERSION = @NUMBER_VERSION@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@ +PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +RESMGR_LIBS = @RESMGR_LIBS@ +SANEI_SANEI_JPEG_LO = @SANEI_SANEI_JPEG_LO@ +SANE_CONFIG_PATH = @SANE_CONFIG_PATH@ +SCSI_LIBS = @SCSI_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@ +SOCKET_LIBS = @SOCKET_LIBS@ +STRICT_LDFLAGS = @STRICT_LDFLAGS@ +STRIP = @STRIP@ +SYSLOG_LIBS = @SYSLOG_LIBS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ +TIFF_LIBS = @TIFF_LIBS@ +USB_LIBS = @USB_LIBS@ +VERSION = @VERSION@ +V_MAJOR = @V_MAJOR@ +V_MINOR = @V_MINOR@ +V_REV = @V_REV@ +XGETTEXT = @XGETTEXT@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +configdir = @configdir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +effective_target = @effective_target@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +locksanedir = @locksanedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I. -I$(top_builddir)/include -I$(top_srcdir)/include +noinst_LTLIBRARIES = liblib.la libfelib.la +libfelib_la_SOURCES = getopt.c getopt1.c md5.c syslog.c vsyslog.c +liblib_la_SOURCES = alloca.c getenv.c inet_ntop.c inet_pton.c \ +	isfdtype.c sigprocmask.c sleep.c snprintf.c strcasestr.c \ +	strdup.c strndup.c strsep.c usleep.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps) +	@for dep in $?; do \ +	  case '$(am__configure_deps)' in \ +	    *$$dep*) \ +	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ +	        && { if test -f $@; then exit 0; else break; fi; }; \ +	      exit 1;; \ +	  esac; \ +	done; \ +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ +	$(am__cd) $(top_srcdir) && \ +	  $(AUTOMAKE) --gnu lib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +	@case '$?' in \ +	  *config.status*) \ +	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +	  *) \ +	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +	esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: +	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +	@list='$(noinst_LTLIBRARIES)'; \ +	locs=`for p in $$list; do echo $$p; done | \ +	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ +	      sort -u`; \ +	test -z "$$locs" || { \ +	  echo rm -f $${locs}; \ +	  rm -f $${locs}; \ +	} + +libfelib.la: $(libfelib_la_OBJECTS) $(libfelib_la_DEPENDENCIES) $(EXTRA_libfelib_la_DEPENDENCIES)  +	$(AM_V_CCLD)$(LINK)  $(libfelib_la_OBJECTS) $(libfelib_la_LIBADD) $(LIBS) + +liblib.la: $(liblib_la_OBJECTS) $(liblib_la_DEPENDENCIES) $(EXTRA_liblib_la_DEPENDENCIES)  +	$(AM_V_CCLD)$(LINK)  $(liblib_la_OBJECTS) $(liblib_la_LIBADD) $(LIBS) + +mostlyclean-compile: +	-rm -f *.$(OBJEXT) + +distclean-compile: +	-rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getenv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet_ntop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet_pton.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isfdtype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigprocmask.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sleep.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasestr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsep.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syslog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usleep.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsyslog.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: +	-rm -f *.lo + +clean-libtool: +	-rm -rf .libs _libs + +ID: $(am__tagged_files) +	$(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) +	set x; \ +	here=`pwd`; \ +	$(am__define_uniq_tagged_files); \ +	shift; \ +	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ +	  test -n "$$unique" || unique=$$empty_fix; \ +	  if test $$# -gt 0; then \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      "$$@" $$unique; \ +	  else \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      $$unique; \ +	  fi; \ +	fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) +	$(am__define_uniq_tagged_files); \ +	test -z "$(CTAGS_ARGS)$$unique" \ +	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +	     $$unique + +GTAGS: +	here=`$(am__cd) $(top_builddir) && pwd` \ +	  && $(am__cd) $(top_srcdir) \ +	  && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) +	list='$(am__tagged_files)'; \ +	case "$(srcdir)" in \ +	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ +	  *) sdir=$(subdir)/$(srcdir) ;; \ +	esac; \ +	for i in $$list; do \ +	  if test -f "$$i"; then \ +	    echo "$(subdir)/$$i"; \ +	  else \ +	    echo "$$sdir/$$i"; \ +	  fi; \ +	done >> $(top_builddir)/cscope.files + +distclean-tags: +	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) +	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	list='$(DISTFILES)'; \ +	  dist_files=`for file in $$list; do echo $$file; done | \ +	  sed -e "s|^$$srcdirstrip/||;t" \ +	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ +	case $$dist_files in \ +	  */*) $(MKDIR_P) `echo "$$dist_files" | \ +			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ +			   sort -u` ;; \ +	esac; \ +	for file in $$dist_files; do \ +	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +	  if test -d $$d/$$file; then \ +	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ +	    if test -d "$(distdir)/$$file"; then \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ +	  else \ +	    test -f "$(distdir)/$$file" \ +	    || cp -p $$d/$$file "$(distdir)/$$file" \ +	    || exit 1; \ +	  fi; \ +	done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am +	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: +	if test -z '$(STRIP)'; then \ +	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +	      install; \ +	else \ +	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ +	fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: +	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: +	@echo "This command is intended for maintainers to use" +	@echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ +	mostlyclean-am + +distclean: distclean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ +	distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +	mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ +	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ +	ctags-am distclean distclean-compile distclean-generic \ +	distclean-libtool distclean-tags distdir dvi dvi-am html \ +	html-am info info-am install install-am install-data \ +	install-data-am install-dvi install-dvi-am install-exec \ +	install-exec-am install-html install-html-am install-info \ +	install-info-am install-man install-pdf install-pdf-am \ +	install-ps install-ps-am install-strip installcheck \ +	installcheck-am installdirs maintainer-clean \ +	maintainer-clean-generic mostlyclean mostlyclean-compile \ +	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +	tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/lib/alloca.c b/lib/alloca.c new file mode 100644 index 0000000..6404fe1 --- /dev/null +++ b/lib/alloca.c @@ -0,0 +1,495 @@ +/* alloca.c -- allocate automatically reclaimed memory +   (Mostly) portable public-domain implementation -- D A Gwyn + +   This implementation of the PWB library alloca function, +   which is used to allocate space off the run-time stack so +   that it is automatically reclaimed upon procedure exit, +   was inspired by discussions with J. Q. Johnson of Cornell. +   J.Otto Tennant <jot@cray.com> contributed the Cray support. + +   There are some preprocessor constants that can +   be defined when compiling for your specific system, for +   improved efficiency; however, the defaults should be okay. + +   The general concept of this implementation is to keep +   track of all alloca-allocated blocks, and reclaim any +   that are found to be deeper in the stack than the current +   invocation.  This heuristic does not reclaim storage as +   soon as it becomes invalid, but it will do so eventually. + +   As a special case, alloca(0) reclaims storage without +   allocating any.  It is a good idea to use alloca(0) in +   your main control loop, etc. to force garbage collection.  */ + +#ifdef HAVE_CONFIG_H +#include "../include/sane/config.h" +#endif + +#ifndef HAVE_ALLOCA + +#include "lalloca.h" + +#ifdef emacs +#include "blockinput.h" +#endif + +/* If compiling with GCC 2, this file's not needed.  */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, +   there must be some other way alloca is supposed to work.  */ +#ifndef alloca + +#ifdef emacs +#ifdef static +/* actually, only want this if static is defined as "" +   -- this is for usg, in which emacs must undefine static +   in order to make unexec workable +   */ +#ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +#endif /* STACK_DIRECTION undefined */ +#endif /* static */ +#endif /* emacs */ + +/* If your stack is a linked list of frames, you have to +   provide an "address metric" ADDRESS_FUNCTION macro.  */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#if __STDC__ +typedef void *pointer; +#else +typedef char *pointer; +#endif + +#define	NULL	0 + +/* Different portions of Emacs need to call different versions of +   malloc.  The Emacs executable needs alloca to call xmalloc, because +   ordinary malloc isn't protected from input signals.  On the other +   hand, the utilities in lib-src need alloca to call malloc; some of +   them are very simple, and don't have an xmalloc routine. + +   Non-Emacs programs expect this to call xmalloc. + +   Callers below should use malloc.  */ + +extern pointer malloc (); + +/* Define STACK_DIRECTION if you know the direction of stack +   growth for your system; otherwise it will be automatically +   deduced at run-time. + +   STACK_DIRECTION > 0 => grows toward higher addresses +   STACK_DIRECTION < 0 => grows toward lower addresses +   STACK_DIRECTION = 0 => direction of growth unknown  */ + +#ifndef STACK_DIRECTION +#define	STACK_DIRECTION	0	/* Direction unknown.  */ +#endif + +#if STACK_DIRECTION != 0 + +#define	STACK_DIR	STACK_DIRECTION	/* Known at compile-time.  */ + +#else /* STACK_DIRECTION == 0; need run-time code.  */ + +static int stack_dir;		/* 1 or -1 once known.  */ +#define	STACK_DIR	stack_dir + +static void +find_stack_direction () +{ +  static char *addr = NULL;	/* Address of first `dummy', once known.  */ +  auto char dummy;		/* To get stack address.  */ + +  if (addr == NULL) +    {				/* Initial entry.  */ +      addr = ADDRESS_FUNCTION (dummy); + +      find_stack_direction ();	/* Recurse once.  */ +    } +  else +    { +      /* Second entry.  */ +      if (ADDRESS_FUNCTION (dummy) > addr) +	stack_dir = 1;		/* Stack grew upward.  */ +      else +	stack_dir = -1;		/* Stack grew downward.  */ +    } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: +   (a) chain together all alloca'ed blocks; +   (b) keep track of stack depth. + +   It is very important that sizeof(header) agree with malloc +   alignment chunk size.  The following default should work okay.  */ + +#ifndef	ALIGN_SIZE +#define	ALIGN_SIZE	sizeof(double) +#endif + +typedef union hdr +{ +  char align[ALIGN_SIZE];	/* To force sizeof(header).  */ +  struct +    { +      union hdr *next;		/* For chaining headers.  */ +      char *deep;		/* For stack depth measure.  */ +    } h; +} header; + +static header *last_alloca_header = NULL;	/* -> last alloca header.  */ + +/* Return a pointer to at least SIZE bytes of storage, +   which will be automatically reclaimed upon exit from +   the procedure that called alloca.  Originally, this space +   was supposed to be taken from the current stack frame of the +   caller, but that method cannot be made to work for some +   implementations of C, for example under Gould's UTX/32.  */ + +pointer +alloca (size) +     unsigned size; +{ +  auto char probe;		/* Probes stack depth: */ +  register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 +  if (STACK_DIR == 0)		/* Unknown growth direction.  */ +    find_stack_direction (); +#endif + +  /* Reclaim garbage, defined as all alloca'd storage that +     was allocated from deeper in the stack than currently. */ + +  { +    register header *hp;	/* Traverses linked list.  */ + +#ifdef emacs +    BLOCK_INPUT; +#endif + +    for (hp = last_alloca_header; hp != NULL;) +      if ((STACK_DIR > 0 && hp->h.deep > depth) +	  || (STACK_DIR < 0 && hp->h.deep < depth)) +	{ +	  register header *np = hp->h.next; + +	  free ((pointer) hp);	/* Collect garbage.  */ + +	  hp = np;		/* -> next header.  */ +	} +      else +	break;			/* Rest are not deeper.  */ + +    last_alloca_header = hp;	/* -> last valid storage.  */ + +#ifdef emacs +    UNBLOCK_INPUT; +#endif +  } + +  if (size == 0) +    return NULL;		/* No allocation required.  */ + +  /* Allocate combined header + user data storage.  */ + +  { +    register pointer new = malloc (sizeof (header) + size); +    /* Address of header.  */ + +    ((header *) new)->h.next = last_alloca_header; +    ((header *) new)->h.deep = depth; + +    last_alloca_header = (header *) new; + +    /* User storage begins just after header.  */ + +    return (pointer) ((char *) new + sizeof (header)); +  } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include <stdio.h> +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header +  { +    long shgrow:32;		/* Number of times stack has grown.  */ +    long shaseg:32;		/* Size of increments to stack.  */ +    long shhwm:32;		/* High water mark of stack.  */ +    long shsize:32;		/* Current size of stack (all segments).  */ +  }; + +/* The stack segment linkage control information occurs at +   the high-address end of a stack segment.  (The stack +   grows from low addresses to high addresses.)  The initial +   part of the stack segment linkage control information is +   0200 (octal) words.  This provides for register storage +   for the routine which overflows the stack.  */ + +struct stack_segment_linkage +  { +    long ss[0200];		/* 0200 overflow words.  */ +    long sssize:32;		/* Number of words in this segment.  */ +    long ssbase:32;		/* Offset to stack base.  */ +    long:32; +    long sspseg:32;		/* Offset to linkage control of previous +				   segment of stack.  */ +    long:32; +    long sstcpt:32;		/* Pointer to task common address block.  */ +    long sscsnm;		/* Private control structure number for +				   microtasking.  */ +    long ssusr1;		/* Reserved for user.  */ +    long ssusr2;		/* Reserved for user.  */ +    long sstpid;		/* Process ID for pid based multi-tasking.  */ +    long ssgvup;		/* Pointer to multitasking thread giveup.  */ +    long sscray[7];		/* Reserved for Cray Research.  */ +    long ssa0; +    long ssa1; +    long ssa2; +    long ssa3; +    long ssa4; +    long ssa5; +    long ssa6; +    long ssa7; +    long sss0; +    long sss1; +    long sss2; +    long sss3; +    long sss4; +    long sss5; +    long sss6; +    long sss7; +  }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words +   returned by the STKSTAT library routine.  */ +struct stk_stat +  { +    long now;			/* Current total stack size.  */ +    long maxc;			/* Amount of contiguous space which would +				   be required to satisfy the maximum +				   stack demand to date.  */ +    long high_water;		/* Stack high-water mark.  */ +    long overflows;		/* Number of stack overflow ($STKOFEN) calls.  */ +    long hits;			/* Number of internal buffer hits.  */ +    long extends;		/* Number of block extensions.  */ +    long stko_mallocs;		/* Block allocations by $STKOFEN.  */ +    long underflows;		/* Number of stack underflow calls ($STKRETN).  */ +    long stko_free;		/* Number of deallocations by $STKRETN.  */ +    long stkm_free;		/* Number of deallocations by $STKMRET.  */ +    long segments;		/* Current number of stack segments.  */ +    long maxs;			/* Maximum number of stack segments so far.  */ +    long pad_size;		/* Stack pad size.  */ +    long current_address;	/* Current stack segment address.  */ +    long current_size;		/* Current stack segment size.  This +				   number is actually corrupted by STKSTAT to +				   include the fifteen word trailer area.  */ +    long initial_address;	/* Address of initial segment.  */ +    long initial_size;		/* Size of initial segment.  */ +  }; + +/* The following structure describes the data structure which trails +   any stack segment.  I think that the description in 'asdef' is +   out of date.  I only describe the parts that I am sure about.  */ + +struct stk_trailer +  { +    long this_address;		/* Address of this block.  */ +    long this_size;		/* Size of this block (does not include +				   this trailer).  */ +    long unknown2; +    long unknown3; +    long link;			/* Address of trailer block of previous +				   segment.  */ +    long unknown5; +    long unknown6; +    long unknown7; +    long unknown8; +    long unknown9; +    long unknown10; +    long unknown11; +    long unknown12; +    long unknown13; +    long unknown14; +  }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. +   I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ +  struct stk_stat status; +  struct stk_trailer *trailer; +  long *block, size; +  long result = 0; + +  /* We want to iterate through all of the segments.  The first +     step is to get the stack status structure.  We could do this +     more quickly and more directly, perhaps, by referencing the +     $LM00 common block, but I know that this works.  */ + +  STKSTAT (&status); + +  /* Set up the iteration.  */ + +  trailer = (struct stk_trailer *) (status.current_address +				    + status.current_size +				    - 15); + +  /* There must be at least one stack segment.  Therefore it is +     a fatal error if "trailer" is null.  */ + +  if (trailer == 0) +    abort (); + +  /* Discard segments that do not contain our argument address.  */ + +  while (trailer != 0) +    { +      block = (long *) trailer->this_address; +      size = trailer->this_size; +      if (block == 0 || size == 0) +	abort (); +      trailer = (struct stk_trailer *) trailer->link; +      if ((block <= address) && (address < (block + size))) +	break; +    } + +  /* Set the result to the offset in this segment and add the sizes +     of all predecessor segments.  */ + +  result = address - block; + +  if (trailer == 0) +    { +      return result; +    } + +  do +    { +      if (trailer->this_size <= 0) +	abort (); +      result += trailer->this_size; +      trailer = (struct stk_trailer *) trailer->link; +    } +  while (trailer != 0); + +  /* We are done.  Note that if you present a bogus address (one +     not in any segment), you will get a different number back, formed +     from subtracting the address of the first block.  This is probably +     not what you want.  */ + +  return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. +   Determine the number of the cell within the stack, +   given the address of the cell.  The purpose of this +   routine is to linearize, in some sense, stack addresses +   for alloca.  */ + +static long +i00afunc (long address) +{ +  long stkl = 0; + +  long size, pseg, this_segment, stack; +  long result = 0; + +  struct stack_segment_linkage *ssptr; + +  /* Register B67 contains the address of the end of the +     current stack segment.  If you (as a subprogram) store +     your registers on the stack and find that you are past +     the contents of B67, you have overflowed the segment. + +     B67 also points to the stack segment linkage control +     area, which is what we are really interested in.  */ + +  stkl = CRAY_STACKSEG_END (); +  ssptr = (struct stack_segment_linkage *) stkl; + +  /* If one subtracts 'size' from the end of the segment, +     one has the address of the first word of the segment. + +     If this is not the first segment, 'pseg' will be +     nonzero.  */ + +  pseg = ssptr->sspseg; +  size = ssptr->sssize; + +  this_segment = stkl - size; + +  /* It is possible that calling this routine itself caused +     a stack overflow.  Discard stack segments which do not +     contain the target address.  */ + +  while (!(this_segment <= address && address <= stkl)) +    { +#ifdef DEBUG_I00AFUNC +      fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif +      if (pseg == 0) +	break; +      stkl = stkl - pseg; +      ssptr = (struct stack_segment_linkage *) stkl; +      size = ssptr->sssize; +      pseg = ssptr->sspseg; +      this_segment = stkl - size; +    } + +  result = address - this_segment; + +  /* If you subtract pseg from the current end of the stack, +     you get the address of the previous stack segment's end. +     This seems a little convoluted to me, but I'll bet you save +     a cycle somewhere.  */ + +  while (pseg != 0) +    { +#ifdef DEBUG_I00AFUNC +      fprintf (stderr, "%011o %011o\n", pseg, size); +#endif +      stkl = stkl - pseg; +      ssptr = (struct stack_segment_linkage *) stkl; +      size = ssptr->sssize; +      pseg = ssptr->sspseg; +      result += size; +    } +  return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ + +#endif /* no alloca */ +#endif /* not GCC version 2 */ + +#endif /* !HAVE_ALLOCA */ diff --git a/lib/getenv.c b/lib/getenv.c new file mode 100644 index 0000000..c450659 --- /dev/null +++ b/lib/getenv.c @@ -0,0 +1,18 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_GETENV + +char * +getenv(const char *name) +{ +  char *retval = 0; +#ifdef HAVE_OS2_H +  if (0 != DosScanEnv (buf, &retval)) +    retval = 0; +#else +#  error "Missing getenv() on this platform.  Please implement." +#endif +  return retval; +} + +#endif /* !HAVE_GETENV */ diff --git a/lib/getopt.c b/lib/getopt.c new file mode 100644 index 0000000..9dabb82 --- /dev/null +++ b/lib/getopt.c @@ -0,0 +1,1282 @@ +/* Getopt for GNU. +   NOTE: getopt is now part of the C library, so if you don't know what +   "Keep this file name-space clean" means, talk to drepper@gnu.org +   before changing it! +   Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002 +	Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ +# include <config.h> +#if !defined(HAVE_GETOPT_H) || !defined(HAVE_GETOPT_LONG) + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. +   Ditto for AIX 3.2 and <stdlib.h>.  */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#if 0 +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems +   reject `defined (const)'.  */ +# ifndef const +#  define const +# endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not +   actually compiling the library itself.  This code is part of the GNU C +   Library, but also included in many other GNU distributions.  Compiling +   and linking in this code is a waste when using the GNU C library +   (especially if it is a shared library).  Rather than having every GNU +   program understand `configure --with-gnu-libc' and omit the object files, +   it is simpler to just do this in the source for each such file.  */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include <gnu-versions.h> +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#  define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include +   to get __GNU_LIBRARY__ defined.  */ +#ifdef	__GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them +   contain conflicting prototypes for getopt.  */ +# include <stdlib.h> +# include <unistd.h> +#endif	/* GNU C library.  */ + +#ifdef VMS +# include <unixlib.h> +# if HAVE_STRING_H - 0 +#  include <string.h> +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages.  */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +#  include <libintl.h> +#  ifndef _ +#   define _(msgid)	gettext (msgid) +#  endif +# else +#  define _(msgid)	(msgid) +# endif +# if defined _LIBC && defined USE_IN_LIBIO +#  include <wchar.h> +# endif +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* 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 POSIXLY_CORRECT 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.  */ + +#include "../include/lgetopt.h" + +/* 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 = NULL; + +/* 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 -1, 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.  */ + +/* 1003.2 says this must be 1 before any call.  */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which +   causes problems with re-calling getopt as programs generally don't +   know that. */ + +int __getopt_initialized attribute_hidden; + +/* 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; + +/* Callers store zero here to inhibit the error message +   for unrecognized options.  */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. +   This must be initialized on some systems to avoid linking in the +   system's own getopt implementation.  */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + +   If the caller did not specify anything, +   the default is REQUIRE_ORDER if the environment variable +   POSIXLY_CORRECT 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. +   This mode of operation is selected by either setting the environment +   variable POSIXLY_CORRECT, or using `+' as the first character +   of the list of option characters. + +   PERMUTE is the default.  We permute the contents of ARGV as we scan, +   so that eventually all the non-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 1. +   Using `-' as the first character of the list of option characters +   selects 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 -1 with `optind' != ARGC.  */ + +static enum +{ +  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable.  */ +static char *posixly_correct; + +#ifdef	__GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries +   because there are many ways it can cause trouble. +   On some systems, it contains special magic macros that don't work +   in GCC.  */ +# include <string.h> +# define my_index	strchr +#else + +# if HAVE_STRING_H +#  include <string.h> +# else +#  include <strings.h> +# endif + +/* Avoid depending on library functions or files +   whose names are inconsistent.  */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) +     const char *str; +     int chr; +{ +  while (*str) +    { +      if (*str == chr) +	return (char *) str; +      str++; +    } +  return 0; +} + +/* If using GCC, we can safely declare strlen this way. +   If not using GCC, it is ok not to declare it.  */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. +   That was relevant to code that was here before.  */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, +   and has done so at least since version 2.4.5. -- rms.  */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* 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; + +#ifdef _LIBC +/* Stored original parameters. +   XXX This is no good solution.  We should rather copy the args so +   that we can compare them later.  But we must not use malloc(3).  */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags +   indicating ARGV elements that should not be considered arguments.  */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c  */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +#  define SWAP_FLAGS(ch1, ch2) \ +  if (nonoption_flags_len > 0)						      \ +    {									      \ +      char __tmp = __getopt_nonoption_flags[ch1];			      \ +      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \ +      __getopt_nonoption_flags[ch2] = __tmp;				      \ +    } +# else +#  define SWAP_FLAGS(ch1, ch2) +# endif +#else	/* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif	/* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. +   One subsequence is elements [first_nonopt,last_nonopt) +   which contains all the non-options that have been skipped so far. +   The other is elements [last_nonopt,optind), which contains all +   the options processed since those non-options were skipped. + +   `first_nonopt' and `last_nonopt' are relocated so that they describe +   the new indices of the non-options in ARGV after they are moved.  */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) +     char **argv; +{ +  int bottom = first_nonopt; +  int middle = last_nonopt; +  int top = optind; +  char *tem; + +  /* Exchange the shorter segment with the far end of the longer segment. +     That puts the shorter segment into the right place. +     It leaves the longer segment in the right place overall, +     but it consists of two parts that need to be swapped next.  */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS +  /* First make sure the handling of the `__getopt_nonoption_flags' +     string can work normally.  Our top argument must be in the range +     of the string.  */ +  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) +    { +      /* We must extend the array.  The user plays games with us and +	 presents new arguments.  */ +      char *new_str = malloc (top + 1); +      if (new_str == NULL) +	nonoption_flags_len = nonoption_flags_max_len = 0; +      else +	{ +	  memset (__mempcpy (new_str, __getopt_nonoption_flags, +			     nonoption_flags_max_len), +		  '\0', top + 1 - nonoption_flags_max_len); +	  nonoption_flags_max_len = top + 1; +	  __getopt_nonoption_flags = new_str; +	} +    } +#endif + +  while (top > middle && middle > bottom) +    { +      if (top - middle > middle - bottom) +	{ +	  /* Bottom segment is the short one.  */ +	  int len = middle - bottom; +	  register int i; + +	  /* Swap it with the top part of the top segment.  */ +	  for (i = 0; i < len; i++) +	    { +	      tem = argv[bottom + i]; +	      argv[bottom + i] = argv[top - (middle - bottom) + i]; +	      argv[top - (middle - bottom) + i] = tem; +	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); +	    } +	  /* Exclude the moved bottom segment from further swapping.  */ +	  top -= len; +	} +      else +	{ +	  /* Top segment is the short one.  */ +	  int len = top - middle; +	  register int i; + +	  /* Swap it with the bottom part of the bottom segment.  */ +	  for (i = 0; i < len; i++) +	    { +	      tem = argv[bottom + i]; +	      argv[bottom + i] = argv[middle + i]; +	      argv[middle + i] = tem; +	      SWAP_FLAGS (bottom + i, middle + i); +	    } +	  /* Exclude the moved top segment from further swapping.  */ +	  bottom += len; +	} +    } + +  /* Update records for the slots the non-options now occupy.  */ + +  first_nonopt += (optind - last_nonopt); +  last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made.  */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) +     int argc; +     char *const *argv; +     const char *optstring; +{ +  /* 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; + +  nextchar = NULL; + +  posixly_correct = getenv ("POSIXLY_CORRECT"); + +  /* Determine how to handle the ordering of options and nonoptions.  */ + +  if (optstring[0] == '-') +    { +      ordering = RETURN_IN_ORDER; +      ++optstring; +    } +  else if (optstring[0] == '+') +    { +      ordering = REQUIRE_ORDER; +      ++optstring; +    } +  else if (posixly_correct != NULL) +    ordering = REQUIRE_ORDER; +  else +    ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS +  if (posixly_correct == NULL +      && argc == __libc_argc && argv == __libc_argv) +    { +      if (nonoption_flags_max_len == 0) +	{ +	  if (__getopt_nonoption_flags == NULL +	      || __getopt_nonoption_flags[0] == '\0') +	    nonoption_flags_max_len = -1; +	  else +	    { +	      const char *orig_str = __getopt_nonoption_flags; +	      int len = nonoption_flags_max_len = strlen (orig_str); +	      if (nonoption_flags_max_len < argc) +		nonoption_flags_max_len = argc; +	      __getopt_nonoption_flags = +		(char *) malloc (nonoption_flags_max_len); +	      if (__getopt_nonoption_flags == NULL) +		nonoption_flags_max_len = -1; +	      else +		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), +			'\0', nonoption_flags_max_len - len); +	    } +	} +      nonoption_flags_len = nonoption_flags_max_len; +    } +  else +    nonoption_flags_len = 0; +#endif + +  return optstring; +} + +/* 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 the option 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 -1. +   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. +   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', otherwise `optarg' is set to zero. + +   If OPTSTRING starts with `-' or `+', it requests different methods of +   handling the non-option ARGV-elements. +   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + +   Long-named options begin with `--' instead of `-'. +   Their names may be abbreviated as long as the abbreviation is unique +   or is an exact match for some defined option.  If they have an +   argument, it follows the option name in the same ARGV-element, separated +   from the option name by a `=', or else the in next ARGV-element. +   When `getopt' finds a long-named option, it returns 0 if that option's +   `flag' field is nonzero, the value of the option's `val' field +   if the `flag' field is zero. + +   The elements of ARGV aren't really const, because we permute them. +   But we pretend they're const in the prototype to be compatible +   with other systems. + +   LONGOPTS is a vector of `struct option' terminated by an +   element containing a name which is zero. + +   LONGIND returns the index in LONGOPT of the long-named option found. +   It is only valid when a long-named option has been found by the most +   recent call. + +   If LONG_ONLY is nonzero, '-' as well as '--' can introduce +   long-named options.  */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) +     int argc; +     char *const *argv; +     const char *optstring; +     const struct option *longopts; +     int *longind; +     int long_only; +{ +  int print_errors = opterr; +  if (optstring[0] == ':') +    print_errors = 0; + +  if (argc < 1) +    return -1; + +  optarg = NULL; + +  if (optind == 0 || !__getopt_initialized) +    { +      if (optind == 0) +	optind = 1;	/* Don't scan ARGV[0], the program name.  */ +      optstring = _getopt_initialize (argc, argv, optstring); +      __getopt_initialized = 1; +    } + +  /* Test whether ARGV[optind] points to a non-option argument. +     Either it does not have option syntax, or there is an environment flag +     from the shell indicating it is not an option.  The later information +     is only used when the used in the GNU libc.  */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \ +		      || (optind < nonoption_flags_len			      \ +			  && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + +  if (nextchar == NULL || *nextchar == '\0') +    { +      /* Advance to the next ARGV-element.  */ + +      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been +	 moved back by the user (who may also have changed the arguments).  */ +      if (last_nonopt > optind) +	last_nonopt = optind; +      if (first_nonopt > optind) +	first_nonopt = optind; + +      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 ((char **) argv); +	  else if (last_nonopt != optind) +	    first_nonopt = optind; + +	  /* Skip any additional non-options +	     and extend the range of non-options previously skipped.  */ + +	  while (optind < argc && NONOPTION_P) +	    optind++; +	  last_nonopt = optind; +	} + +      /* The 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 != argc && !strcmp (argv[optind], "--")) +	{ +	  optind++; + +	  if (first_nonopt != last_nonopt && last_nonopt != optind) +	    exchange ((char **) argv); +	  else if (first_nonopt == last_nonopt) +	    first_nonopt = optind; +	  last_nonopt = argc; + +	  optind = argc; +	} + +      /* If we have done all the ARGV-elements, stop the scan +	 and back over any non-options that we skipped and permuted.  */ + +      if (optind == argc) +	{ +	  /* 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 -1; +	} + +      /* 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 (NONOPTION_P) +	{ +	  if (ordering == REQUIRE_ORDER) +	    return -1; +	  optarg = argv[optind++]; +	  return 1; +	} + +      /* We have found another option-ARGV-element. +	 Skip the initial punctuation.  */ + +      nextchar = (argv[optind] + 1 +		  + (longopts != NULL && argv[optind][1] == '-')); +    } + +  /* Decode the current option-ARGV-element.  */ + +  /* Check whether the ARGV-element is a long option. + +     If long_only and the ARGV-element has the form "-f", where f is +     a valid short option, don't consider it an abbreviated form of +     a long option that starts with f.  Otherwise there would be no +     way to give the -f short option. + +     On the other hand, if there's a long option "fubar" and +     the ARGV-element is "-fu", do consider that an abbreviation of +     the long option, just like "--fu", and not "-f" with arg "u". + +     This distinction seems to be the most useful approach.  */ + +  if (longopts != NULL +      && (argv[optind][1] == '-' +	  || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) +    { +      char *nameend; +      const struct option *p; +      const struct option *pfound = NULL; +      int exact = 0; +      int ambig = 0; +      int indfound = -1; +      int option_index; + +      for (nameend = nextchar; *nameend && *nameend != '='; nameend++) +	/* Do nothing.  */ ; + +      /* Test all long options for either exact match +	 or abbreviated matches.  */ +      for (p = longopts, option_index = 0; p->name; p++, option_index++) +	if (!strncmp (p->name, nextchar, nameend - nextchar)) +	  { +	    if ((unsigned int) (nameend - nextchar) +		== (unsigned int) strlen (p->name)) +	      { +		/* Exact match found.  */ +		pfound = p; +		indfound = option_index; +		exact = 1; +		break; +	      } +	    else if (pfound == NULL) +	      { +		/* First nonexact match found.  */ +		pfound = p; +		indfound = option_index; +	      } +	    else if (long_only +		     || pfound->has_arg != p->has_arg +		     || pfound->flag != p->flag +		     || pfound->val != p->val) +	      /* Second or later nonexact match found.  */ +	      ambig = 1; +	  } + +      if (ambig && !exact) +	{ +	  if (print_errors) +	    { +#if defined _LIBC && defined USE_IN_LIBIO +	      char *buf; + +	      if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), +			      argv[0], argv[optind]) >= 0) +		{ + +		  if (_IO_fwide (stderr, 0) > 0) +		    __fwprintf (stderr, L"%s", buf); +		  else +		    fputs (buf, stderr); + +		  free (buf); +		} +#else +	      fprintf (stderr, _("%s: option `%s' is ambiguous\n"), +		       argv[0], argv[optind]); +#endif +	    } +	  nextchar += strlen (nextchar); +	  optind++; +	  optopt = 0; +	  return '?'; +	} + +      if (pfound != NULL) +	{ +	  option_index = indfound; +	  optind++; +	  if (*nameend) +	    { +	      /* Don't test has_arg with >, because some C compilers don't +		 allow it to be used on enums.  */ +	      if (pfound->has_arg) +		optarg = nameend + 1; +	      else +		{ +		  if (print_errors) +		    { +#if defined _LIBC && defined USE_IN_LIBIO +		      char *buf; +		      int n; +#endif + +		      if (argv[optind - 1][1] == '-') +			{ +			  /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO +			  n = __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), +					  argv[0], pfound->name); +#else +			  fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), +				   argv[0], pfound->name); +#endif +			} +		      else +			{ +			  /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO +			  n = __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), +					  argv[0], argv[optind - 1][0], +					  pfound->name); +#else +			  fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), +				   argv[0], argv[optind - 1][0], pfound->name); +#endif +			} + +#if defined _LIBC && defined USE_IN_LIBIO +		      if (n >= 0) +			{ +			  if (_IO_fwide (stderr, 0) > 0) +			    __fwprintf (stderr, L"%s", buf); +			  else +			    fputs (buf, stderr); + +			  free (buf); +			} +#endif +		    } + +		  nextchar += strlen (nextchar); + +		  optopt = pfound->val; +		  return '?'; +		} +	    } +	  else if (pfound->has_arg == 1) +	    { +	      if (optind < argc) +		optarg = argv[optind++]; +	      else +		{ +		  if (print_errors) +		    { +#if defined _LIBC && defined USE_IN_LIBIO +		      char *buf; + +		      if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), +				      argv[0], argv[optind - 1]) >= 0) +			{ +			  if (_IO_fwide (stderr, 0) > 0) +			    __fwprintf (stderr, L"%s", buf); +			  else +			    fputs (buf, stderr); + +			  free (buf); +			} +#else +		      fprintf (stderr, +			       _("%s: option `%s' requires an argument\n"), +			       argv[0], argv[optind - 1]); +#endif +		    } +		  nextchar += strlen (nextchar); +		  optopt = pfound->val; +		  return optstring[0] == ':' ? ':' : '?'; +		} +	    } +	  nextchar += strlen (nextchar); +	  if (longind != NULL) +	    *longind = option_index; +	  if (pfound->flag) +	    { +	      *(pfound->flag) = pfound->val; +	      return 0; +	    } +	  return pfound->val; +	} + +      /* Can't find it as a long option.  If this is not getopt_long_only, +	 or the option starts with '--' or is not a valid short +	 option, then it's an error. +	 Otherwise interpret it as a short option.  */ +      if (!long_only || argv[optind][1] == '-' +	  || my_index (optstring, *nextchar) == NULL) +	{ +	  if (print_errors) +	    { +#if defined _LIBC && defined USE_IN_LIBIO +	      char *buf; +	      int n; +#endif + +	      if (argv[optind][1] == '-') +		{ +		  /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO +		  n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), +				  argv[0], nextchar); +#else +		  fprintf (stderr, _("%s: unrecognized option `--%s'\n"), +			   argv[0], nextchar); +#endif +		} +	      else +		{ +		  /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO +		  n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), +				  argv[0], argv[optind][0], nextchar); +#else +		  fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), +			   argv[0], argv[optind][0], nextchar); +#endif +		} + +#if defined _LIBC && defined USE_IN_LIBIO +	      if (n >= 0) +		{ +		  if (_IO_fwide (stderr, 0) > 0) +		    __fwprintf (stderr, L"%s", buf); +		  else +		    fputs (buf, stderr); + +		  free (buf); +		} +#endif +	    } +	  nextchar = (char *) ""; +	  optind++; +	  optopt = 0; +	  return '?'; +	} +    } + +  /* Look at and handle the next short option-character.  */ + +  { +    char c = *nextchar++; +    char *temp = my_index (optstring, c); + +    /* Increment `optind' when we start to process its last character.  */ +    if (*nextchar == '\0') +      ++optind; + +    if (temp == NULL || c == ':') +      { +	if (print_errors) +	  { +#if defined _LIBC && defined USE_IN_LIBIO +	      char *buf; +	      int n; +#endif + +	    if (posixly_correct) +	      { +		/* 1003.2 specifies the format of this message.  */ +#if defined _LIBC && defined USE_IN_LIBIO +		n = __asprintf (&buf, _("%s: illegal option -- %c\n"), +				argv[0], c); +#else +		fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif +	      } +	    else +	      { +#if defined _LIBC && defined USE_IN_LIBIO +		n = __asprintf (&buf, _("%s: invalid option -- %c\n"), +				argv[0], c); +#else +		fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif +	      } + +#if defined _LIBC && defined USE_IN_LIBIO +	    if (n >= 0) +	      { +		if (_IO_fwide (stderr, 0) > 0) +		  __fwprintf (stderr, L"%s", buf); +		else +		  fputs (buf, stderr); + +		free (buf); +	      } +#endif +	  } +	optopt = c; +	return '?'; +      } +    /* Convenience. Treat POSIX -W foo same as long option --foo */ +    if (temp[0] == 'W' && temp[1] == ';') +      { +	char *nameend; +	const struct option *p; +	const struct option *pfound = NULL; +	int exact = 0; +	int ambig = 0; +	int indfound = 0; +	int option_index; + +	/* 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 == argc) +	  { +	    if (print_errors) +	      { +		/* 1003.2 specifies the format of this message.  */ +#if defined _LIBC && defined USE_IN_LIBIO +		char *buf; + +		if (__asprintf (&buf, +				_("%s: option requires an argument -- %c\n"), +				argv[0], c) >= 0) +		  { +		    if (_IO_fwide (stderr, 0) > 0) +		      __fwprintf (stderr, L"%s", buf); +		    else +		      fputs (buf, stderr); + +		    free (buf); +		  } +#else +		fprintf (stderr, _("%s: option requires an argument -- %c\n"), +			 argv[0], c); +#endif +	      } +	    optopt = c; +	    if (optstring[0] == ':') +	      c = ':'; +	    else +	      c = '?'; +	    return c; +	  } +	else +	  /* We already incremented `optind' once; +	     increment it again when taking next ARGV-elt as argument.  */ +	  optarg = argv[optind++]; + +	/* optarg is now the argument, see if it's in the +	   table of longopts.  */ + +	for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) +	  /* Do nothing.  */ ; + +	/* Test all long options for either exact match +	   or abbreviated matches.  */ +	for (p = longopts, option_index = 0; p->name; p++, option_index++) +	  if (!strncmp (p->name, nextchar, nameend - nextchar)) +	    { +	      if ((unsigned int) (nameend - nextchar) == strlen (p->name)) +		{ +		  /* Exact match found.  */ +		  pfound = p; +		  indfound = option_index; +		  exact = 1; +		  break; +		} +	      else if (pfound == NULL) +		{ +		  /* First nonexact match found.  */ +		  pfound = p; +		  indfound = option_index; +		} +	      else +		/* Second or later nonexact match found.  */ +		ambig = 1; +	    } +	if (ambig && !exact) +	  { +	    if (print_errors) +	      { +#if defined _LIBC && defined USE_IN_LIBIO +		char *buf; + +		if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), +				argv[0], argv[optind]) >= 0) +		  { +		    if (_IO_fwide (stderr, 0) > 0) +		      __fwprintf (stderr, L"%s", buf); +		    else +		      fputs (buf, stderr); + +		    free (buf); +		  } +#else +		fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), +			 argv[0], argv[optind]); +#endif +	      } +	    nextchar += strlen (nextchar); +	    optind++; +	    return '?'; +	  } +	if (pfound != NULL) +	  { +	    option_index = indfound; +	    if (*nameend) +	      { +		/* Don't test has_arg with >, because some C compilers don't +		   allow it to be used on enums.  */ +		if (pfound->has_arg) +		  optarg = nameend + 1; +		else +		  { +		    if (print_errors) +		      { +#if defined _LIBC && defined USE_IN_LIBIO +			char *buf; + +			if (__asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), +					argv[0], pfound->name) >= 0) +			  { +			    if (_IO_fwide (stderr, 0) > 0) +			      __fwprintf (stderr, L"%s", buf); +			    else +			      fputs (buf, stderr); + +			    free (buf); +			  } +#else +			fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), +				 argv[0], pfound->name); +#endif +		      } + +		    nextchar += strlen (nextchar); +		    return '?'; +		  } +	      } +	    else if (pfound->has_arg == 1) +	      { +		if (optind < argc) +		  optarg = argv[optind++]; +		else +		  { +		    if (print_errors) +		      { +#if defined _LIBC && defined USE_IN_LIBIO +			char *buf; + +			if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), +					argv[0], argv[optind - 1]) >= 0) +			  { +			    if (_IO_fwide (stderr, 0) > 0) +			      __fwprintf (stderr, L"%s", buf); +			    else +			      fputs (buf, stderr); + +			    free (buf); +			  } +#else +			fprintf (stderr, +				 _("%s: option `%s' requires an argument\n"), +				 argv[0], argv[optind - 1]); +#endif +		      } +		    nextchar += strlen (nextchar); +		    return optstring[0] == ':' ? ':' : '?'; +		  } +	      } +	    nextchar += strlen (nextchar); +	    if (longind != NULL) +	      *longind = option_index; +	    if (pfound->flag) +	      { +		*(pfound->flag) = pfound->val; +		return 0; +	      } +	    return pfound->val; +	  } +	  nextchar = NULL; +	  return 'W';	/* Let the application handle it.   */ +      } +    if (temp[1] == ':') +      { +	if (temp[2] == ':') +	  { +	    /* This is an option that accepts an argument optionally.  */ +	    if (*nextchar != '\0') +	      { +		optarg = nextchar; +		optind++; +	      } +	    else +	      optarg = NULL; +	    nextchar = NULL; +	  } +	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 == argc) +	      { +		if (print_errors) +		  { +		    /* 1003.2 specifies the format of this message.  */ +#if defined _LIBC && defined USE_IN_LIBIO +		    char *buf; + +		    if (__asprintf (&buf, _("\ +%s: option requires an argument -- %c\n"), +				    argv[0], c) >= 0) +		      { +			if (_IO_fwide (stderr, 0) > 0) +			  __fwprintf (stderr, L"%s", buf); +			else +			  fputs (buf, stderr); + +			free (buf); +		      } +#else +		    fprintf (stderr, +			     _("%s: option requires an argument -- %c\n"), +			     argv[0], c); +#endif +		  } +		optopt = c; +		if (optstring[0] == ':') +		  c = ':'; +		else +		  c = '?'; +	      } +	    else +	      /* We already incremented `optind' once; +		 increment it again when taking next ARGV-elt as argument.  */ +	      optarg = argv[optind++]; +	    nextchar = NULL; +	  } +      } +    return c; +  } +} + +int +getopt (argc, argv, optstring) +     int argc; +     char *const *argv; +     const char *optstring; +{ +  return _getopt_internal (argc, argv, optstring, +			   (const struct option *) 0, +			   (int *) 0, +			   0); +} + +#endif	/* Not ELIDE_CODE.  */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing +   the above definition of `getopt'.  */ + +int +main (argc, argv) +     int argc; +     char **argv; +{ +  int c; +  int digit_optind = 0; + +  while (1) +    { +      int this_option_optind = optind ? optind : 1; + +      c = getopt (argc, argv, "abc:d:0123456789"); +      if (c == -1) +	break; + +      switch (c) +	{ +	case '0': +	case '1': +	case '2': +	case '3': +	case '4': +	case '5': +	case '6': +	case '7': +	case '8': +	case '9': +	  if (digit_optind != 0 && digit_optind != this_option_optind) +	    printf ("digits occur in two different argv-elements.\n"); +	  digit_optind = this_option_optind; +	  printf ("option %c\n", c); +	  break; + +	case 'a': +	  printf ("option a\n"); +	  break; + +	case 'b': +	  printf ("option b\n"); +	  break; + +	case 'c': +	  printf ("option c with value `%s'\n", optarg); +	  break; + +	case '?': +	  break; + +	default: +	  printf ("?? getopt returned character code 0%o ??\n", c); +	} +    } + +  if (optind < argc) +    { +      printf ("non-option ARGV-elements: "); +      while (optind < argc) +	printf ("%s ", argv[optind++]); +      printf ("\n"); +    } + +  exit (0); +} + +#endif /* TEST */ +#endif /* !HAVE_GETOPT_LONG */ diff --git a/lib/getopt1.c b/lib/getopt1.c new file mode 100644 index 0000000..5ace00a --- /dev/null +++ b/lib/getopt1.c @@ -0,0 +1,199 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. +   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 +     Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ +#include <config.h> +#if !defined(HAVE_GETOPT_H) || !defined(HAVE_GETOPT_LONG) + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef _LIBC +# include <getopt.h> +#else +# include "../include/lgetopt.h" +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems +   reject `defined (const)'.  */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not +   actually compiling the library itself.  This code is part of the GNU C +   Library, but also included in many other GNU distributions.  Compiling +   and linking in this code is a waste when using the GNU C library +   (especially if it is a shared library).  Rather than having every GNU +   program understand `configure --with-gnu-libc' and omit the object files, +   it is simpler to just do this in the source for each such file.  */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include +   to get __GNU_LIBRARY__ defined.  */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#endif + +#ifndef	NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) +     int argc; +     char *const *argv; +     const char *options; +     const struct option *long_options; +     int *opt_index; +{ +  return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. +   If an option that starts with '-' (not '--') doesn't match a long option, +   but does match a short option, it is parsed as a short option +   instead.  */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) +     int argc; +     char *const *argv; +     const char *options; +     const struct option *long_options; +     int *opt_index; +{ +  return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + +# ifdef _LIBC +libc_hidden_def (getopt_long) +libc_hidden_def (getopt_long_only) +# endif + +#endif	/* Not ELIDE_CODE.  */ + +#ifdef TEST + +#include <stdio.h> + +int +main (argc, argv) +     int argc; +     char **argv; +{ +  int c; +  int digit_optind = 0; + +  while (1) +    { +      int this_option_optind = optind ? optind : 1; +      int option_index = 0; +      static struct option long_options[] = +      { +	{"add", 1, 0, 0}, +	{"append", 0, 0, 0}, +	{"delete", 1, 0, 0}, +	{"verbose", 0, 0, 0}, +	{"create", 0, 0, 0}, +	{"file", 1, 0, 0}, +	{0, 0, 0, 0} +      }; + +      c = getopt_long (argc, argv, "abc:d:0123456789", +		       long_options, &option_index); +      if (c == -1) +	break; + +      switch (c) +	{ +	case 0: +	  printf ("option %s", long_options[option_index].name); +	  if (optarg) +	    printf (" with arg %s", optarg); +	  printf ("\n"); +	  break; + +	case '0': +	case '1': +	case '2': +	case '3': +	case '4': +	case '5': +	case '6': +	case '7': +	case '8': +	case '9': +	  if (digit_optind != 0 && digit_optind != this_option_optind) +	    printf ("digits occur in two different argv-elements.\n"); +	  digit_optind = this_option_optind; +	  printf ("option %c\n", c); +	  break; + +	case 'a': +	  printf ("option a\n"); +	  break; + +	case 'b': +	  printf ("option b\n"); +	  break; + +	case 'c': +	  printf ("option c with value `%s'\n", optarg); +	  break; + +	case 'd': +	  printf ("option d with value `%s'\n", optarg); +	  break; + +	case '?': +	  break; + +	default: +	  printf ("?? getopt returned character code 0%o ??\n", c); +	} +    } + +  if (optind < argc) +    { +      printf ("non-option ARGV-elements: "); +      while (optind < argc) +	printf ("%s ", argv[optind++]); +      printf ("\n"); +    } + +  exit (0); +} + +#endif /* TEST */ +#endif /* HAVE_GETOPT_LONG */ diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c new file mode 100644 index 0000000..b5e357c --- /dev/null +++ b/lib/inet_ntop.c @@ -0,0 +1,40 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_INET_NTOP + +#include <string.h> +#include <sys/types.h> +#ifdef HAVE_WINSOCK2_H +#include <winsock2.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#endif + + +const char * +inet_ntop (int af, const void *src, char *dst, size_t cnt) +{ +  struct in_addr in; +  char *text_addr; + +#ifdef HAVE_INET_NTOA +  if (af == AF_INET) +    { +      memcpy (&in.s_addr, src, sizeof (in.s_addr)); +      text_addr = inet_ntoa (in); +      if (text_addr && dst) +	{ +	  strncpy (dst, text_addr, cnt); +	  return dst; +	} +      else +	return 0; +    } +#endif /* HAVE_INET_NTOA */ +  return 0; +} + +#endif /* !HAVE_INET_NTOP */ diff --git a/lib/inet_pton.c b/lib/inet_pton.c new file mode 100644 index 0000000..7638b6e --- /dev/null +++ b/lib/inet_pton.c @@ -0,0 +1,57 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_INET_PTON + +#include <string.h> +#include <sys/types.h> +#ifdef HAVE_WINSOCK2_H +#include <winsock2.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#endif + +int  +inet_pton (int af, const char *src, void *dst) +{ + +  if (af == AF_INET) +    { + +#if defined(HAVE_INET_ATON) +      int result; +      struct in_addr in; + +      result = inet_aton (src, &in); +      if (result) +	{ +	  memcpy (dst, &in.s_addr, sizeof (in.s_addr)); +	  return 1; +	} +      else +	return 0; + +#elif defined(HAVE_INET_ADDR) + +# if !defined(INADDR_NONE) +#  define INADDR_NONE -1 +# endif /* !defined(INADDR_NONE) */ +      u_int32_t in; + +      in = inet_addr (src); +      if (in != INADDR_NONE) +	{ +	  memcpy (dst, &in, sizeof (in)); +	  return 1; +	} +      else +	return 0; + +#endif /* defined(HAVE_INET_ATON) */ +    } +  return -1; +} + +#endif /* !HAVE_INET_PTON */ diff --git a/lib/isfdtype.c b/lib/isfdtype.c new file mode 100644 index 0000000..8e51516 --- /dev/null +++ b/lib/isfdtype.c @@ -0,0 +1,25 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_ISFDTYPE + +#include <sys/stat.h> + +int +isfdtype(int fd, int fdtype) +{ +  struct stat st; +   +  if (fstat(fd, &st) == -1) return 0; /* couldn't stat fd */ + +  if (st.st_mode == 0) +    return 1; /* At least Irix doesn't seem to know socket type */ +#if defined(S_ISSOCK) +  return S_ISSOCK(st.st_mode) != 0; +#elif defined(S_IFSOCK) && defined(S_IFMT) +  return (st.st_mode & S_IFMT) == S_IFSOCK; +#else +  return 0; +#endif +} + +#endif /* !HAVE_ISFDTYPE */ diff --git a/lib/md5.c b/lib/md5.c new file mode 100644 index 0000000..fd53191 --- /dev/null +++ b/lib/md5.c @@ -0,0 +1,457 @@ +/* Functions to compute MD5 message digest of files or memory blocks. +   according to the definition of MD5 in RFC 1321 from April 1992. +   Copyright (C) 1995,1996,1997,1999,2000,2001 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.  */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> + +#if STDC_HEADERS || defined _LIBC +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_MEMCPY +#  define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#include "md5.h" + +#ifdef _LIBC +# include <endian.h> +# if __BYTE_ORDER == __BIG_ENDIAN +#  define WORDS_BIGENDIAN 1 +# endif +/* We need to keep the namespace clean so define the MD5 function +   protected using leading __ .  */ +# define md5_init_ctx __md5_init_ctx +# define md5_process_block __md5_process_block +# define md5_process_bytes __md5_process_bytes +# define md5_finish_ctx __md5_finish_ctx +# define md5_read_ctx __md5_read_ctx +# define md5_stream __md5_stream +# define md5_buffer __md5_buffer +#endif + +#ifdef WORDS_BIGENDIAN +# define SWAP(n)							\ +    (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next +   64-byte boundary.  (RFC 1321, 3.1: Step 1)  */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ }; + + +void +md5_init_ctx (struct md5_ctx *ctx); +void * +md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); +void * +md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); +int +md5_stream (FILE *stream, void *resblock); +void * +md5_buffer (const char *buffer, size_t len, void *resblock); +void +md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx); +void +md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx); + + +/* Initialize structure containing state of computation. +   (RFC 1321, 3.3: Step 3)  */ +void +md5_init_ctx (struct md5_ctx *ctx) +{ +  ctx->A = 0x67452301; +  ctx->B = 0xefcdab89; +  ctx->C = 0x98badcfe; +  ctx->D = 0x10325476; + +  ctx->total[0] = ctx->total[1] = 0; +  ctx->buflen = 0; +} + +/* Put result from CTX in first 16 bytes following RESBUF.  The result +   must be in little endian byte order. + +   IMPORTANT: On some systems it is required that RESBUF is correctly +   aligned for a 32 bits value.  */ +void * +md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) +{ +  ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); +  ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); +  ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); +  ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); + +  return resbuf; +} + +/* Process the remaining bytes in the internal buffer and the usual +   prolog according to the standard and write the result to RESBUF. + +   IMPORTANT: On some systems it is required that RESBUF is correctly +   aligned for a 32 bits value.  */ +void * +md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) +{ +  /* Take yet unprocessed bytes into account.  */ +  md5_uint32 bytes = ctx->buflen; +  size_t pad; + +  /* Now count remaining bytes.  */ +  ctx->total[0] += bytes; +  if (ctx->total[0] < bytes) +    ++ctx->total[1]; + +  pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; +  memcpy (&ctx->buffer[bytes], fillbuf, pad); + +  /* Put the 64-bit file length in *bits* at the end of the buffer.  */ +  *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); +  *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | +							(ctx->total[0] >> 29)); + +  /* Process last bytes.  */ +  md5_process_block (ctx->buffer, bytes + pad + 8, ctx); + +  return md5_read_ctx (ctx, resbuf); +} + +/* Compute MD5 message digest for bytes read from STREAM.  The +   resulting message digest number will be written into the 16 bytes +   beginning at RESBLOCK.  */ +int +md5_stream (FILE *stream, void *resblock) +{ +  /* Important: BLOCKSIZE must be a multiple of 64.  */ +#define BLOCKSIZE 4096 +  struct md5_ctx ctx; +  char buffer[BLOCKSIZE + 72]; +  size_t sum; + +  /* Initialize the computation context.  */ +  md5_init_ctx (&ctx); + +  /* Iterate over full file contents.  */ +  while (1) +    { +      /* We read the file in blocks of BLOCKSIZE bytes.  One call of the +	 computation function processes the whole buffer so that with the +	 next round of the loop another block can be read.  */ +      size_t n; +      sum = 0; + +      /* Read block.  Take care for partial reads.  */ +      do +	{ +	  n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + +	  sum += n; +	} +      while (sum < BLOCKSIZE && n != 0); +      if (n == 0 && ferror (stream)) +        return 1; + +      /* If end of file is reached, end the loop.  */ +      if (n == 0) +	break; + +      /* Process buffer with BLOCKSIZE bytes.  Note that +			BLOCKSIZE % 64 == 0 +       */ +      md5_process_block (buffer, BLOCKSIZE, &ctx); +    } + +  /* Add the last bytes if necessary.  */ +  if (sum > 0) +    md5_process_bytes (buffer, sum, &ctx); + +  /* Construct result in desired memory.  */ +  md5_finish_ctx (&ctx, resblock); +  return 0; +} + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The +   result is always in little endian byte order, so that a byte-wise +   output yields to the wanted ASCII representation of the message +   digest.  */ +void * +md5_buffer (const char *buffer, size_t len, void *resblock) +{ +  struct md5_ctx ctx; + +  /* Initialize the computation context.  */ +  md5_init_ctx (&ctx); + +  /* Process whole buffer but last len % 64 bytes.  */ +  md5_process_bytes (buffer, len, &ctx); + +  /* Put result in desired memory area.  */ +  return md5_finish_ctx (&ctx, resblock); +} + + +void +md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) +{ +  /* When we already have some bits in our internal buffer concatenate +     both inputs first.  */ +  if (ctx->buflen != 0) +    { +      size_t left_over = ctx->buflen; +      size_t add = 128 - left_over > len ? len : 128 - left_over; + +      memcpy (&ctx->buffer[left_over], buffer, add); +      ctx->buflen += add; + +      if (ctx->buflen > 64) +	{ +	  md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); + +	  ctx->buflen &= 63; +	  /* The regions in the following copy operation cannot overlap.  */ +	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], +		  ctx->buflen); +	} + +      buffer = (const char *) buffer + add; +      len -= add; +    } + +  /* Process available complete blocks.  */ +  if (len >= 64) +    { +#if !_STRING_ARCH_unaligned +/* To check alignment gcc has an appropriate operator.  Other +   compilers don't.  */ +# if __GNUC__ >= 2 +#  define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0) +# else +#  define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0) +# endif +      if (UNALIGNED_P (buffer)) +	while (len > 64) +	  { +	    md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); +	    buffer = (const char *) buffer + 64; +	    len -= 64; +	  } +      else +#endif +	{ +	  md5_process_block (buffer, len & ~63, ctx); +	  buffer = (const char *) buffer + (len & ~63); +	  len &= 63; +	} +    } + +  /* Move remaining bytes in internal buffer.  */ +  if (len > 0) +    { +      size_t left_over = ctx->buflen; + +      memcpy (&ctx->buffer[left_over], buffer, len); +      left_over += len; +      if (left_over >= 64) +	{ +	  md5_process_block (ctx->buffer, 64, ctx); +	  left_over -= 64; +	  memcpy (ctx->buffer, &ctx->buffer[64], left_over); +	} +      ctx->buflen = left_over; +    } +} + + +/* These are the four functions used in the four steps of the MD5 algorithm +   and defined in the RFC 1321.  The first function is a little bit optimized +   (as found in Colin Plumbs public domain implementation).  */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + +/* Process LEN bytes of BUFFER, accumulating context into CTX. +   It is assumed that LEN % 64 == 0.  */ + +void +md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) +{ +  md5_uint32 correct_words[16]; +  const md5_uint32 *words = buffer; +  size_t nwords = len / sizeof (md5_uint32); +  const md5_uint32 *endp = words + nwords; +  md5_uint32 A = ctx->A; +  md5_uint32 B = ctx->B; +  md5_uint32 C = ctx->C; +  md5_uint32 D = ctx->D; + +  /* First increment the byte count.  RFC 1321 specifies the possible +     length of the file up to 2^64 bits.  Here we only compute the +     number of bytes.  Do a double word increment.  */ +  ctx->total[0] += len; +  if (ctx->total[0] < len) +    ++ctx->total[1]; + +  /* Process all bytes in the buffer with 64 bytes in each round of +     the loop.  */ +  while (words < endp) +    { +      md5_uint32 *cwp = correct_words; +      md5_uint32 A_save = A; +      md5_uint32 B_save = B; +      md5_uint32 C_save = C; +      md5_uint32 D_save = D; + +      /* First round: using the given function, the context and a constant +	 the next context is computed.  Because the algorithms processing +	 unit is a 32-bit word and it is determined to work on words in +	 little endian byte order we perhaps have to change the byte order +	 before the computation.  To reduce the work for the next steps +	 we store the swapped words in the array CORRECT_WORDS.  */ + +#define OP(a, b, c, d, s, T)						\ +      do								\ +        {								\ +	  a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T;		\ +	  ++words;							\ +	  CYCLIC (a, s);						\ +	  a += b;							\ +        }								\ +      while (0) + +      /* It is unfortunate that C does not provide an operator for +	 cyclic rotation.  Hope the C compiler is smart enough.  */ +#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) + +      /* Before we start, one word to the strange constants. +	 They are defined in RFC 1321 as + +	 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 +       */ + +      /* Round 1.  */ +      OP (A, B, C, D,  7, 0xd76aa478); +      OP (D, A, B, C, 12, 0xe8c7b756); +      OP (C, D, A, B, 17, 0x242070db); +      OP (B, C, D, A, 22, 0xc1bdceee); +      OP (A, B, C, D,  7, 0xf57c0faf); +      OP (D, A, B, C, 12, 0x4787c62a); +      OP (C, D, A, B, 17, 0xa8304613); +      OP (B, C, D, A, 22, 0xfd469501); +      OP (A, B, C, D,  7, 0x698098d8); +      OP (D, A, B, C, 12, 0x8b44f7af); +      OP (C, D, A, B, 17, 0xffff5bb1); +      OP (B, C, D, A, 22, 0x895cd7be); +      OP (A, B, C, D,  7, 0x6b901122); +      OP (D, A, B, C, 12, 0xfd987193); +      OP (C, D, A, B, 17, 0xa679438e); +      OP (B, C, D, A, 22, 0x49b40821); + +      /* For the second to fourth round we have the possibly swapped words +	 in CORRECT_WORDS.  Redefine the macro to take an additional first +	 argument specifying the function to use.  */ +#undef OP +#define OP(f, a, b, c, d, k, s, T)					\ +      do 								\ +	{								\ +	  a += f (b, c, d) + correct_words[k] + T;			\ +	  CYCLIC (a, s);						\ +	  a += b;							\ +	}								\ +      while (0) + +      /* Round 2.  */ +      OP (FG, A, B, C, D,  1,  5, 0xf61e2562); +      OP (FG, D, A, B, C,  6,  9, 0xc040b340); +      OP (FG, C, D, A, B, 11, 14, 0x265e5a51); +      OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa); +      OP (FG, A, B, C, D,  5,  5, 0xd62f105d); +      OP (FG, D, A, B, C, 10,  9, 0x02441453); +      OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); +      OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8); +      OP (FG, A, B, C, D,  9,  5, 0x21e1cde6); +      OP (FG, D, A, B, C, 14,  9, 0xc33707d6); +      OP (FG, C, D, A, B,  3, 14, 0xf4d50d87); +      OP (FG, B, C, D, A,  8, 20, 0x455a14ed); +      OP (FG, A, B, C, D, 13,  5, 0xa9e3e905); +      OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8); +      OP (FG, C, D, A, B,  7, 14, 0x676f02d9); +      OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + +      /* Round 3.  */ +      OP (FH, A, B, C, D,  5,  4, 0xfffa3942); +      OP (FH, D, A, B, C,  8, 11, 0x8771f681); +      OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); +      OP (FH, B, C, D, A, 14, 23, 0xfde5380c); +      OP (FH, A, B, C, D,  1,  4, 0xa4beea44); +      OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9); +      OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60); +      OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); +      OP (FH, A, B, C, D, 13,  4, 0x289b7ec6); +      OP (FH, D, A, B, C,  0, 11, 0xeaa127fa); +      OP (FH, C, D, A, B,  3, 16, 0xd4ef3085); +      OP (FH, B, C, D, A,  6, 23, 0x04881d05); +      OP (FH, A, B, C, D,  9,  4, 0xd9d4d039); +      OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); +      OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); +      OP (FH, B, C, D, A,  2, 23, 0xc4ac5665); + +      /* Round 4.  */ +      OP (FI, A, B, C, D,  0,  6, 0xf4292244); +      OP (FI, D, A, B, C,  7, 10, 0x432aff97); +      OP (FI, C, D, A, B, 14, 15, 0xab9423a7); +      OP (FI, B, C, D, A,  5, 21, 0xfc93a039); +      OP (FI, A, B, C, D, 12,  6, 0x655b59c3); +      OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92); +      OP (FI, C, D, A, B, 10, 15, 0xffeff47d); +      OP (FI, B, C, D, A,  1, 21, 0x85845dd1); +      OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f); +      OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); +      OP (FI, C, D, A, B,  6, 15, 0xa3014314); +      OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); +      OP (FI, A, B, C, D,  4,  6, 0xf7537e82); +      OP (FI, D, A, B, C, 11, 10, 0xbd3af235); +      OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb); +      OP (FI, B, C, D, A,  9, 21, 0xeb86d391); + +      /* Add the starting values of the context.  */ +      A += A_save; +      B += B_save; +      C += C_save; +      D += D_save; +    } + +  /* Put checksum in context given as argument.  */ +  ctx->A = A; +  ctx->B = B; +  ctx->C = C; +  ctx->D = D; +} diff --git a/lib/sigprocmask.c b/lib/sigprocmask.c new file mode 100644 index 0000000..f754987 --- /dev/null +++ b/lib/sigprocmask.c @@ -0,0 +1,53 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C 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. + +The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA.  */ + +#include "../include/sane/config.h" + +#include <errno.h> + +#ifndef HAVE_SIGPROCMASK + +#define sigprocmask	SOMETHINGELSE +#include <signal.h> +#undef  sigprocmask + +int +sigprocmask (int how, int *new, int *old) +{ +  int o, n = *new; + +/* FIXME: Get this working on Windows.  Probably should move to + * POSIX sigaction API and emulate it before emulating this one. + */ +#ifndef WIN32 +  switch (how) +    { +    case 1: o = sigblock (n); break; +    case 2: o = sigsetmask (sigblock (0) & ~n); break; +    case 3: o = sigsetmask (n); break; +    default: +      errno = EINVAL; +      return -1; +    } +  if (old) +    *old = o; +#endif +  return 0; +} + +#endif /* !HAVE_SIGPROCMASK */ diff --git a/lib/sleep.c b/lib/sleep.c new file mode 100644 index 0000000..f016a9e --- /dev/null +++ b/lib/sleep.c @@ -0,0 +1,30 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_SLEEP + +#ifdef HAVE_WINDOWS_H +#include <windows.h> +#endif + +unsigned int sleep(unsigned int seconds) +{ +#ifdef HAVE_WINDOWS_H +    Sleep(seconds*1000); +    return 0; +#else +    int rc = 0; + +    /* WARNING: Not all platforms support usleep() for more than 1 +     * second. Assuming if they do not have POSIX sleep then they +     * do not have POSIX usleep() either and are using our internal +     * version which can support it. If it fails, need to add an OS +     * specific replacement like Sleep for Windows. +     */ +    if (usleep(seconds*1000000)) +	rc = 1; +    return rc; +#endif + +} + +#endif diff --git a/lib/snprintf.c b/lib/snprintf.c new file mode 100644 index 0000000..aca8df9 --- /dev/null +++ b/lib/snprintf.c @@ -0,0 +1,532 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_SNPRINTF + +/*************************************************************************** + * LPRng - An Extended Print Spooler System + * + * Copyright 1988-1997, Patrick Powell, San Diego, CA + *     papowell@sdsu.edu + * See below for conditions of use. + * + *************************************************************************** + * MODULE: snprintf.c + * PURPOSE: LPRng version of printf - absolutely bombproof (hopefully!) + **************************************************************************/ +#if 0 + +			 The "Artistic License" + +				Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + +	"Package" refers to the collection of files distributed by the +	Copyright Holder, and derivatives of that collection of files +	created through textual modification. + +	"Standard Version" refers to such a Package if it has not been +	modified, or has been modified in accordance with the wishes +	of the Copyright Holder as specified below. + +	"Copyright Holder" is whoever is named in the copyright or +	copyrights for the package. + +	"You" is you, if you are thinking about copying or distributing +	this Package. + +	"Reasonable copying fee" is whatever you can justify on the +	basis of media cost, duplication charges, time of people involved, +	and so on.  (You will not be required to justify it to the +	Copyright Holder, but only to the computing community at large +	as a market that must bear the fee.) + +	"Freely Available" means that no fee is charged for the item +	itself, though there may be fees involved in handling the item. +	It also means that recipients of the item may redistribute it +	under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder.  A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + +    a) place your modifications in the Public Domain or otherwise make them +    Freely Available, such as by posting said modifications to Usenet or +    an equivalent medium, or placing the modifications on a major archive +    site such as uunet.uu.net, or by allowing the Copyright Holder to include +    your modifications in the Standard Version of the Package. + +    b) use the modified Package only within your corporation or organization. + +    c) rename any non-standard executables so the names do not conflict +    with standard executables, which must also be provided, and provide +    a separate manual page for each non-standard executable that clearly +    documents how it differs from the Standard Version. + +    d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + +    a) distribute a Standard Version of the executables and library files, +    together with instructions (in the manual page or equivalent) on where +    to get the Standard Version. + +    b) accompany the distribution with the machine-readable source of +    the Package with your modifications. + +    c) give non-standard executables non-standard names, and clearly +    document the differences in manual pages (or equivalent), together +    with instructions on where to get the Standard Version. + +    d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package.  You may charge any fee you choose for support of this +Package.  You may not charge a fee for this Package itself.  However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own.  + +6. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +7. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +				The End +#include "lp.h" +#endif + +#include <stdarg.h> +#include <errno.h> +#include <sys/types.h> +#define HAVE_STDARGS /* let's hope that works everywhere (mj) */ +#define VA_LOCAL_DECL va_list ap; +#define VA_START(f) va_start(ap, f) +#define VA_SHIFT(v,t) ; /* no-op for ANSI */ +#define VA_END va_end(ap) + +/**** ENDINCLUDE ****/ + +static char *const _id = "$Id$"; + +/* + * dopr(): poor man's version of doprintf + */ + +static char * plp_Errormsg ( int err ); +static void dopr( char *buffer, const char *format, va_list args ); +static void fmtstr(  char *value, int ljust, int len, int zpad, int precision ); +static void fmtnum(  long value, int base, int dosign, +	int ljust, int len, int zpad, int precision ); +static void fmtdouble( int fmt, double value, +	int ljust, int len, int zpad, int precision ); +static void dostr( char * ); +static char *output; +static void dopr_outch( int c ); +static char *end; +int visible_control = 1; + +/************************************************************** + * Original: + * Patrick Powell Tue Apr 11 09:48:21 PDT 1995 + * A bombproof version of doprnt (dopr) included. + * Sigh.  This sort of thing is always nasty do deal with.  Note that + * the version here does not include floating point... + * + * plp_snprintf() is used instead of sprintf() as it does limit checks + * for string length.  This covers a nasty loophole. + * + * The other functions are there to prevent NULL pointers from + * causing nast effects. + **************************************************************/ + +int vsnprintf(char *str, size_t count, const char *fmt, va_list args) +{ +	str[0] = 0; +	end = str+count-1; +	dopr( str, fmt, args ); +	if( count>0 ){ +		end[0] = 0; +	} +	return(strlen(str)); +} + +/* VARARGS3 */ +#ifdef HAVE_STDARGS +int snprintf (char *str,size_t count,const char *fmt,...) +#else +int snprintf (va_alist) va_dcl +#endif +{ +#ifndef HAVE_STDARGS +    char *str; +	size_t count; +    char *fmt; +#endif +    VA_LOCAL_DECL + +    VA_START (fmt); +    VA_SHIFT (str, char *); +    VA_SHIFT (count, size_t ); +    VA_SHIFT (fmt, char *); +    (void) vsnprintf ( str, count, fmt, ap); +    VA_END; +	return( strlen( str ) ); +} + +static void dopr( char *buffer, const char *format, va_list args ) +{ +	int ch; +	long value; +	int longflag = 0; +	char *strvalue; +	int ljust; +	int len; +	int zpad; +	int precision; +	int set_precision; +	double dval; +	int err = errno; + +	output = buffer; +	while( (ch = *format++) ){ +		switch( ch ){ +		case '%': +			ljust = len = zpad = 0; +			precision = -1; set_precision = 0; +		nextch:  +			ch = *format++; +			switch( ch ){ +			case 0: +				dostr( "**end of format**" ); +				return; +			case '-': ljust = 1; goto nextch; +			case '.': set_precision = 1; precision = 0; goto nextch; +			case '*': len = va_arg( args, int ); goto nextch; +			case '0': /* set zero padding if len not set */ +				if(len==0 && set_precision == 0 ) zpad = '0'; +			case '1': case '2': case '3': +			case '4': case '5': case '6': +			case '7': case '8': case '9': +				if( set_precision ){ +					precision = precision*10 + ch - '0'; +				} else { +					len = len*10 + ch - '0'; +				} +				goto nextch; +			case 'l': longflag = 1; goto nextch; +			case 'u': case 'U': +				/*fmtnum(value,base,dosign,ljust,len, zpad, precision) */ +				if( longflag ){ +					value = va_arg( args, long ); +				} else { +					value = va_arg( args, int ); +				} +				fmtnum( value, 10,0, ljust, len, zpad, precision ); break; +			case 'o': case 'O': +				/*fmtnum(value,base,dosign,ljust,len, zpad, precision) */ +				if( longflag ){ +					value = va_arg( args, long ); +				} else { +					value = va_arg( args, int ); +				} +				fmtnum( value, 8,0, ljust, len, zpad, precision ); break; +			case 'd': case 'D': +				if( longflag ){ +					value = va_arg( args, long ); +				} else { +					value = va_arg( args, int ); +				} +				fmtnum( value, 10,1, ljust, len, zpad, precision ); break; +			case 'x': +				if( longflag ){ +					value = va_arg( args, long ); +				} else { +					value = va_arg( args, int ); +				} +				fmtnum( value, 16,0, ljust, len, zpad, precision ); break; +			case 'X': +				if( longflag ){ +					value = va_arg( args, long ); +				} else { +					value = va_arg( args, int ); +				} +				fmtnum( value,-16,0, ljust, len, zpad, precision ); break; +			case 's': +				strvalue = va_arg( args, char *); +				fmtstr( strvalue,ljust,len, zpad, precision ); +				break; +			case 'c': +				ch = va_arg( args, int ); +				{ char b[2]; +					int vsb = visible_control; +					b[0] = ch; +					b[1] = 0; +					visible_control = 0; +					fmtstr( b,ljust,len, zpad, precision ); +					visible_control = vsb; +				} +				break; +			case 'f': case 'g': +				dval = va_arg( args, double ); +				fmtdouble( ch, dval,ljust,len, zpad, precision ); break; +			case 'm': +				fmtstr( plp_Errormsg(err),ljust,len, zpad, precision ); break; +			case '%': dopr_outch( ch ); continue; +			default: +				dostr(  "???????" ); +			} +			longflag = 0; +			break; +		default: +			dopr_outch( ch ); +			break; +		} +	} +	*output = 0; +} + +/* + * Format '%[-]len[.precision]s' + * -   = left justify (ljust) + * len = minimum length + * precision = numbers of chars in string to use + */ +static void +fmtstr(  char *value, int ljust, int len, int zpad, int precision ) +{ +	int padlen, strlen, i, c;	/* amount to pad */ + +	if( value == 0 ){ +		value = "<NULL>"; +	} +	if( precision > 0 ){ +		strlen = precision; +	} else { +		/* cheap strlen so you do not have library call */ +		for( strlen = 0; (c=value[strlen]); ++ strlen ){ +			if( visible_control && iscntrl( c ) && !isspace( c ) ){ +				++strlen; +			} +		} +	} +	padlen = len - strlen; +	if( padlen < 0 ) padlen = 0; +	if( ljust ) padlen = -padlen; +	while( padlen > 0 ) { +		dopr_outch( ' ' ); +		--padlen; +	} +	/* output characters */ +	for( i = 0; (c = value[i]); ++i ){ +		if( visible_control && iscntrl( c ) && !isspace( c ) ){ +			dopr_outch('^'); +			c = ('@' | (c & 0x1F)); +		} +		dopr_outch(c); +	} +	while( padlen < 0 ) { +		dopr_outch( ' ' ); +		++padlen; +	} +} + +static void +fmtnum(  long value, int base, int dosign, int ljust, +	int len, int zpad, int precision ) +{ +	int signvalue = 0; +	unsigned long uvalue; +	char convert[20]; +	int place = 0; +	int padlen = 0;	/* amount to pad */ +	int caps = 0; + +	/* DEBUGP(("value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n", +		value, base, dosign, ljust, len, zpad )); */ +	uvalue = value; +	if( dosign ){ +		if( value < 0 ) { +			signvalue = '-'; +			uvalue = -value;  +		} +	} +	if( base < 0 ){ +		caps = 1; +		base = -base; +	} +	do{ +		convert[place++] = +			(caps? "0123456789ABCDEF":"0123456789abcdef") +			 [uvalue % (unsigned)base  ]; +		uvalue = (uvalue / (unsigned)base ); +	}while(uvalue); +	convert[place] = 0; +	padlen = len - place; +	if( padlen < 0 ) padlen = 0; +	if( ljust ) padlen = -padlen; +	/* DEBUGP(( "str '%s', place %d, sign %c, padlen %d\n", +		convert,place,signvalue,padlen)); */ +	if( zpad && padlen > 0 ){ +		if( signvalue ){ +			dopr_outch( signvalue ); +			--padlen; +			signvalue = 0; +		} +		while( padlen > 0 ){ +			dopr_outch( zpad ); +			--padlen; +		} +	} +	while( padlen > 0 ) { +		dopr_outch( ' ' ); +		--padlen; +	} +	if( signvalue ) dopr_outch( signvalue ); +	while( place > 0 ) dopr_outch( convert[--place] ); +	while( padlen < 0 ){ +		dopr_outch( ' ' ); +		++padlen; +	} +} + +static void +fmtdouble( int fmt, double value, int ljust, int len, int zpad, int precision ) +{ +	char convert[128]; +	char fmtstr[128]; +	int l; + +	if( len == 0 ) len = 10; +	if( len > sizeof(convert) - 10 ){ +		len = sizeof(convert) - 10; +	} +	if( precision > sizeof(convert) - 10 ){ +		precision = sizeof(convert) - 10; +	} +	if( precision > len ) precision = len; +	strcpy( fmtstr, "%" ); +	if( ljust ) strcat(fmtstr, "-" ); +	if( len ){ +		sprintf( fmtstr+strlen(fmtstr), "%d", len ); +	} +	if( precision > 0 ){ +		sprintf( fmtstr+strlen(fmtstr), ".%d", precision ); +	} +	l = strlen( fmtstr ); +	fmtstr[l] = fmt; +	fmtstr[l+1] = 0; +	sprintf( convert, fmtstr, value ); +	dostr( convert ); +} + +static void dostr( char *str ) +{ +	while(*str) dopr_outch(*str++); +} + +static void dopr_outch( int c ) +{ +	if( end == 0 || output < end ){ +		*output++ = c; +	} +} + + +/**************************************************************************** + * static char *plp_errormsg( int err ) + *  returns a printable form of the + *  errormessage corresponding to the valie of err. + *  This is the poor man's version of sperror(), not available on all systems + *  Patrick Powell Tue Apr 11 08:05:05 PDT 1995 + ****************************************************************************/ +/****************************************************************************/ +#if !defined(HAVE_STRERROR) + +# if defined(HAVE_SYS_NERR) +#  if !defined(HAVE_SYS_NERR_DEF) +     extern int sys_nerr; +#  endif +#  define num_errors    (sys_nerr) +# else +#  define num_errors    (-1)            /* always use "errno=%d" */ +# endif + +# if defined(HAVE_SYS_ERRLIST) +#  if !defined(HAVE_SYS_ERRLIST_DEF) +     extern const char *const sys_errlist[]; +#  endif +# else +#  undef  num_errors +#  define num_errors   (-1)            /* always use "errno=%d" */ +# endif + +#endif + +static char * plp_Errormsg ( int err ) +{ +    char *cp; + +#if defined(HAVE_STRERROR) +	cp = (void *)strerror(err); +#else +# if defined(HAVE_SYS_ERRLIST) +    if (err >= 0 && err < num_errors) { +		cp = (void *)sys_errlist[err]; +    } else +# endif +	{ +		static char msgbuf[32];     /* holds "errno=%d". */ +		/* SAFE use of sprintf */ +		(void) sprintf (msgbuf, "errno=%d", err); +		cp = msgbuf; +    } +#endif +    return (cp); +} + +#if defined(TEST) +#include <stdio.h> +int main( void ) +{ +	char buffer[128]; +	char *t; +	char *test1 = "01234"; +	errno = 1; +	plp_snprintf( buffer, sizeof(buffer), (t="errno '%m'")); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%s"), test1 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%12s"), test1 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%-12s"), test1 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%12.2s"), test1 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%-12.2s"), test1 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%g"), 1.25 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%g"), 1.2345 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%12g"), 1.25 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%12.2g"), 1.25 ); printf( "%s = '%s'\n", t, buffer ); +	plp_snprintf( buffer, sizeof(buffer), (t = "%0*d"), 6, 1 ); printf( "%s = '%s'\n", t, buffer ); +	return(0); +} +#endif + + +#endif /* HAVE_SNPRINTF */ diff --git a/lib/strcasestr.c b/lib/strcasestr.c new file mode 100755 index 0000000..8999c50 --- /dev/null +++ b/lib/strcasestr.c @@ -0,0 +1,120 @@ +/* Return the offset of one string within another. +   Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C 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. + +   The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +/* + * My personal strstr() implementation that beats most other algorithms. + * Until someone tells me otherwise, I assume that this is the + * fastest implementation of strstr() in C. + * I deliberately chose not to comment it.  You should have at least + * as much fun trying to understand it, as I had to write it :-). + * + * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de	*/ +/* added strcasestr support, davidm@lineo.com */ + +#include "../include/sane/config.h" + +#ifndef HAVE_STRCASESTR  + +#if  defined HAVE_STRING_H +# include <string.h> +#endif + +typedef unsigned chartype; + +#include <ctype.h> +#define VAL(x)	tolower(x) + +char * strcasestr ( const char *phaystack, const char *pneedle) +{ +	register const unsigned char *haystack, *needle; +	register chartype b, c; + +	haystack = (const unsigned char *) phaystack; +	needle = (const unsigned char *) pneedle; + +	b = *needle; +	if (b != '\0') { +		haystack--;				/* possible ANSI violation */ +		do { +			c = *++haystack; +			if (c == '\0') +				goto ret0; +		} +		while (VAL(c) != VAL(b)); + +		c = *++needle; +		if (c == '\0') +			goto foundneedle; +		++needle; +		goto jin; + +		for (;;) { +			register chartype a; +			register const unsigned char *rhaystack, *rneedle; + +			do { +				a = *++haystack; +				if (a == '\0') +					goto ret0; +				if (VAL(a) == VAL(b)) +					break; +				a = *++haystack; +				if (a == '\0') +					goto ret0; +		  shloop:;} +			while (VAL(a) != VAL(b)); + +		  jin:a = *++haystack; +			if (a == '\0') +				goto ret0; + +			if (VAL(a) != VAL(c)) +				goto shloop; + +			rhaystack = haystack-- + 1; +			rneedle = needle; +			a = *rneedle; + +			if (VAL(*rhaystack) == VAL(a)) +				do { +					if (a == '\0') +						goto foundneedle; +					++rhaystack; +					a = *++needle; +					if (VAL(*rhaystack) != VAL(a)) +						break; +					if (a == '\0') +						goto foundneedle; +					++rhaystack; +					a = *++needle; +				} +				while (VAL(*rhaystack) == VAL(a)); + +			needle = rneedle;	/* took the register-poor approach */ + +			if (a == '\0') +				break; +		} +	} +  foundneedle: +	return (char *) haystack; +  ret0: +	return 0; +} +#endif diff --git a/lib/strdup.c b/lib/strdup.c new file mode 100644 index 0000000..fa6c5ab --- /dev/null +++ b/lib/strdup.c @@ -0,0 +1,38 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C 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. + +The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA.  */ + +#include "../include/sane/config.h" + +#include <stdlib.h> +#include <string.h> + +#ifndef HAVE_STRDUP + +char * +strdup (const char * s) +{ +  char *clone; +  size_t size; + +  size = strlen (s) + 1; +  clone = malloc (size); +  memcpy (clone, s, size); +  return clone; +} + +#endif /* !HAVE_STRDUP */ diff --git a/lib/strndup.c b/lib/strndup.c new file mode 100644 index 0000000..38147f0 --- /dev/null +++ b/lib/strndup.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C 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. + +The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA.  */ + +#include "../include/sane/config.h" + +#ifndef HAVE_STRNDUP + +#include <stdlib.h> +#include <string.h> + +#include <sys/types.h> + +char * +strndup (const char * s, size_t n) +{ +  char *clone; + +  clone = malloc (n + 1); +  strncpy (clone, s, n); +  clone[n] = '\0'; +  return clone; +} + +#endif /* !HAVE_STRNDUP */ diff --git a/lib/strsep.c b/lib/strsep.c new file mode 100644 index 0000000..e6018e1 --- /dev/null +++ b/lib/strsep.c @@ -0,0 +1,49 @@ +/* Copyright (C) 1992, 1993, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C 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. + +The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA.  */ + +#include "../include/sane/config.h" + +#include <string.h> + +#ifndef HAVE_STRSEP + +char * +strsep (char **stringp, const char *delim) +{ +  char *begin, *end; + +  begin = *stringp; +  if (! begin || *begin == '\0') +    return NULL; + +  /* Find the end of the token.  */ +  end = strpbrk (begin, delim); +  if (end) +    { +      /* Terminate the token and set *STRINGP past NUL character.  */ +      *end++ = '\0'; +      *stringp = end; +    } +  else +    /* No more delimiters; this is the last token.  */ +    *stringp = NULL; + +  return begin; +} + +#endif /* !HAVE_STRSEP */ diff --git a/lib/syslog.c b/lib/syslog.c new file mode 100644 index 0000000..fcb8396 --- /dev/null +++ b/lib/syslog.c @@ -0,0 +1,13 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_SYSLOG + +#include <stdio.h> + +void syslog(int priority, const char *format, va_list args) +{ +    printf("%d ", priority); +    printf(format, args); +} + +#endif diff --git a/lib/usleep.c b/lib/usleep.c new file mode 100644 index 0000000..e4ef453 --- /dev/null +++ b/lib/usleep.c @@ -0,0 +1,60 @@ +/* Copyright (C) 1992 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C 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. + +The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA.  */ + +#include "../include/sane/config.h" + +#ifndef HAVE_USLEEP + +#include <sys/types.h> +#ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +#endif + +#ifdef HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + +#ifdef apollo +# include <apollo/base.h> +# include <apollo/time.h> +  static time_$clock_t DomainTime100mS = +    { +	0, 100000/4 +    }; +  static status_$t DomainStatus; +#endif + +/* Sleep USECONDS microseconds, or until a previously set timer goes off.  */ +unsigned int +usleep (unsigned int useconds) +{ +#ifdef apollo +  /* The usleep function does not work under the SYS5.3 environment. +     Use the Domain/OS time_$wait call instead. */ +  time_$wait (time_$relative, DomainTime100mS, &DomainStatus); +#else +  struct timeval delay; + +  delay.tv_sec = 0; +  delay.tv_usec = useconds; +  select (0, 0, 0, 0, &delay); +  return 0; +#endif +} + +#endif /* !HAVE_USLEEP */ diff --git a/lib/vsyslog.c b/lib/vsyslog.c new file mode 100644 index 0000000..5878cff --- /dev/null +++ b/lib/vsyslog.c @@ -0,0 +1,15 @@ +#include "../include/sane/config.h" + +#ifndef HAVE_VSYSLOG + +#include <stdio.h> +#include <stdarg.h> + +void vsyslog(int priority, const char *format, va_list args) +{ +  char buf[1024]; +  vsnprintf(buf, sizeof(buf), format, args); +  syslog(priority, "%s", buf); +} + +#endif /* !HAVE_VSYSLOG */ | 
