mirror of
				https://gitea.invidious.io/iv-org/litespeed-quic.git
				synced 2024-08-15 00:53:43 +00:00 
			
		
		
		
	compiles in debug/release. tests pass (in debug config at least)
This commit is contained in:
		
							parent
							
								
									0e7c6aad9e
								
							
						
					
					
						commit
						461e84d874
					
				
					 97 changed files with 4282 additions and 875 deletions
				
			
		
							
								
								
									
										8
									
								
								wincompat/README.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								wincompat/README.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
- vcpkg does not have boringssl, so you'll have to build it yourself. Follow the instructions at the boringssl repository.
 | 
			
		||||
  With the caveat that you should do it from a VC command prompt for the correct architecture and make sure to set all 
 | 
			
		||||
  the paths for perl,ninja,etc. correctly. Also watch out for C runtime library mismatches. The easiest fix for me was to
 | 
			
		||||
  change the flags in the CMake cache file.
 | 
			
		||||
 | 
			
		||||
- zlib and libevent do exist in vcpkg. 
 | 
			
		||||
 | 
			
		||||
- getopt files are really old and could probably use updating.
 | 
			
		||||
							
								
								
									
										758
									
								
								wincompat/getopt.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										758
									
								
								wincompat/getopt.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,758 @@
 | 
			
		|||
/* 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 roland@gnu.ai.mit.edu
 | 
			
		||||
   before changing it!
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94
 | 
			
		||||
    Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
   This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
   under the terms of the GNU General Public License as published by the
 | 
			
		||||
   Free Software Foundation; either version 2, or (at your option) any
 | 
			
		||||
   later version.
 | 
			
		||||
 | 
			
		||||
   This program is distributed in the hope that it will be useful,
 | 
			
		||||
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
   GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
   You should have received a copy of the GNU General Public License
 | 
			
		||||
   along with this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 | 
			
		||||
 
 | 
			
		||||
/* 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
 | 
			
		||||
#pragma warning(disable:4131)
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#if defined (emacs) || defined (CONFIG_BROKETS)
 | 
			
		||||
/* We use <config.h> instead of "config.h" so that a compilation
 | 
			
		||||
   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
 | 
			
		||||
   (which it would do because it found this file in $srcdir).  */
 | 
			
		||||
#include <config.h>
 | 
			
		||||
#else
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __STDC__
 | 
			
		||||
/* This is a separate conditional since some stdc systems
 | 
			
		||||
   reject `defined (const)'.  */
 | 
			
		||||
#ifndef const
 | 
			
		||||
#define const
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <string.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.  */
 | 
			
		||||
 | 
			
		||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 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>
 | 
			
		||||
#endif	/* GNU C library.  */
 | 
			
		||||
 | 
			
		||||
/* 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 "getopt.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 EOF, this is the index of the first of the
 | 
			
		||||
   non-option elements that the caller should itself scan.
 | 
			
		||||
 | 
			
		||||
   Otherwise, `optind' communicates from one call to the next
 | 
			
		||||
   how much of ARGV has been scanned so far.  */
 | 
			
		||||
 | 
			
		||||
/* XXX 1003.2 says this must be 1 before any call.  */
 | 
			
		||||
int optind = 0;
 | 
			
		||||
 | 
			
		||||
/* 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 EOF 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
 | 
			
		||||
 | 
			
		||||
/* Avoid depending on library functions or files
 | 
			
		||||
   whose names are inconsistent.  */
 | 
			
		||||
 | 
			
		||||
char *getenv ();
 | 
			
		||||
 | 
			
		||||
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.  */
 | 
			
		||||
#ifndef __STDC__
 | 
			
		||||
/* 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;
 | 
			
		||||
 | 
			
		||||
/* 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.  */
 | 
			
		||||
 | 
			
		||||
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.  */
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
        }
 | 
			
		||||
      /* 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;
 | 
			
		||||
        }
 | 
			
		||||
      /* 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.  */
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
_getopt_initialize (optstring)
 | 
			
		||||
     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 = 1;
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  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 `EOF'.
 | 
			
		||||
   Then `optind' is the index in ARGV of the first ARGV-element
 | 
			
		||||
   that is not an option.  (The ARGV-elements have been permuted
 | 
			
		||||
   so that those that are not options now come last.)
 | 
			
		||||
 | 
			
		||||
   OPTSTRING is a string containing the legitimate option characters.
 | 
			
		||||
   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;
 | 
			
		||||
{
 | 
			
		||||
  optarg = NULL;
 | 
			
		||||
 | 
			
		||||
  if (optind == 0)
 | 
			
		||||
    optstring = _getopt_initialize (optstring);
 | 
			
		||||
 | 
			
		||||
  if (nextchar == NULL || *nextchar == '\0')
 | 
			
		||||
    {
 | 
			
		||||
      /* Advance to the next ARGV-element.  */
 | 
			
		||||
 | 
			
		||||
      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
 | 
			
		||||
         && (argv[optind][0] != '-' || argv[optind][1] == '\0'))
 | 
			
		||||
        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 EOF;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      /* If we have come to a non-option and did not permute it,
 | 
			
		||||
     either stop the scan or describe it to the caller and pass it by.  */
 | 
			
		||||
 | 
			
		||||
      if ((argv[optind][0] != '-' || argv[optind][1] == '\0'))
 | 
			
		||||
    {
 | 
			
		||||
      if (ordering == REQUIRE_ORDER)
 | 
			
		||||
        return EOF;
 | 
			
		||||
      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 = 0;
 | 
			
		||||
      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 (nameend - nextchar == (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
 | 
			
		||||
          /* Second or later nonexact match found.  */
 | 
			
		||||
          ambig = 1;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (ambig && !exact)
 | 
			
		||||
    {
 | 
			
		||||
      if (opterr)
 | 
			
		||||
        fprintf (stderr, "%s: option `%s' is ambiguous\n",
 | 
			
		||||
             argv[0], argv[optind]);
 | 
			
		||||
      nextchar += strlen (nextchar);
 | 
			
		||||
      optind++;
 | 
			
		||||
      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 (opterr)
 | 
			
		||||
            {
 | 
			
		||||
              if (argv[optind - 1][1] == '-')
 | 
			
		||||
            /* --option */
 | 
			
		||||
            fprintf (stderr,
 | 
			
		||||
                 "%s: option `--%s' doesn't allow an argument\n",
 | 
			
		||||
                 argv[0], pfound->name);
 | 
			
		||||
              else
 | 
			
		||||
            /* +option or -option */
 | 
			
		||||
            fprintf (stderr,
 | 
			
		||||
                 "%s: option `%c%s' doesn't allow an argument\n",
 | 
			
		||||
                 argv[0], argv[optind - 1][0], pfound->name);
 | 
			
		||||
            }
 | 
			
		||||
          nextchar += strlen (nextchar);
 | 
			
		||||
          return '?';
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
      else if (pfound->has_arg == 1)
 | 
			
		||||
        {
 | 
			
		||||
          if (optind < argc)
 | 
			
		||||
        optarg = argv[optind++];
 | 
			
		||||
          else
 | 
			
		||||
        {
 | 
			
		||||
          if (opterr)
 | 
			
		||||
            fprintf (stderr, "%s: option `%s' requires an argument\n",
 | 
			
		||||
                 argv[0], argv[optind - 1]);
 | 
			
		||||
          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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      /* 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 (opterr)
 | 
			
		||||
        {
 | 
			
		||||
          if (argv[optind][1] == '-')
 | 
			
		||||
        /* --option */
 | 
			
		||||
        fprintf (stderr, "%s: unrecognized option `--%s'\n",
 | 
			
		||||
             argv[0], nextchar);
 | 
			
		||||
          else
 | 
			
		||||
        /* +option or -option */
 | 
			
		||||
        fprintf (stderr, "%s: unrecognized option `%c%s'\n",
 | 
			
		||||
             argv[0], argv[optind][0], nextchar);
 | 
			
		||||
        }
 | 
			
		||||
      nextchar = (char *) "";
 | 
			
		||||
      optind++;
 | 
			
		||||
      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 (opterr)
 | 
			
		||||
      {
 | 
			
		||||
        if (posixly_correct)
 | 
			
		||||
          /* 1003.2 specifies the format of this message.  */
 | 
			
		||||
          fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
 | 
			
		||||
        else
 | 
			
		||||
          fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c);
 | 
			
		||||
      }
 | 
			
		||||
    optopt = c;
 | 
			
		||||
    return '?';
 | 
			
		||||
      }
 | 
			
		||||
    if (temp[1] == ':')
 | 
			
		||||
      {
 | 
			
		||||
    if (temp[2] == ':')
 | 
			
		||||
      {
 | 
			
		||||
        /* This is an option that accepts an argument optionally.  */
 | 
			
		||||
        if (*nextchar != '\0')
 | 
			
		||||
          {
 | 
			
		||||
        optarg = nextchar;
 | 
			
		||||
        optind++;
 | 
			
		||||
          }
 | 
			
		||||
        else
 | 
			
		||||
          optarg = 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 (opterr)
 | 
			
		||||
          {
 | 
			
		||||
            /* 1003.2 specifies the format of this message.  */
 | 
			
		||||
            fprintf (stderr, "%s: option requires an argument -- %c\n",
 | 
			
		||||
                 argv[0], c);
 | 
			
		||||
          }
 | 
			
		||||
        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	/* _LIBC or not __GNU_LIBRARY__.  */
 | 
			
		||||
 
 | 
			
		||||
#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 == EOF)
 | 
			
		||||
    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 */
 | 
			
		||||
							
								
								
									
										131
									
								
								wincompat/getopt.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								wincompat/getopt.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,131 @@
 | 
			
		|||
/* Declarations for getopt.
 | 
			
		||||
   Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
   This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
   under the terms of the GNU General Public License as published by the
 | 
			
		||||
   Free Software Foundation; either version 2, or (at your option) any
 | 
			
		||||
   later version.
 | 
			
		||||
 | 
			
		||||
   This program is distributed in the hope that it will be useful,
 | 
			
		||||
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
   GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
   You should have received a copy of the GNU General Public License
 | 
			
		||||
   along with this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 | 
			
		||||
 | 
			
		||||
/* $CVSid: @(#)getopt.h 1.7 94/09/21 $ */
 | 
			
		||||
 | 
			
		||||
#ifndef _GETOPT_H
 | 
			
		||||
#define _GETOPT_H 1
 | 
			
		||||
 | 
			
		||||
#ifdef	__cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* 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.  */
 | 
			
		||||
 | 
			
		||||
extern char *optarg;
 | 
			
		||||
 | 
			
		||||
/* Index in ARGV of the next element to be scanned.
 | 
			
		||||
   This is used for communication to and from the caller
 | 
			
		||||
   and for communication between successive calls to `getopt'.
 | 
			
		||||
 | 
			
		||||
   On entry to `getopt', zero means this is the first call; initialize.
 | 
			
		||||
 | 
			
		||||
   When `getopt' returns EOF, this is the index of the first of the
 | 
			
		||||
   non-option elements that the caller should itself scan.
 | 
			
		||||
 | 
			
		||||
   Otherwise, `optind' communicates from one call to the next
 | 
			
		||||
   how much of ARGV has been scanned so far.  */
 | 
			
		||||
 | 
			
		||||
extern int optind;
 | 
			
		||||
 | 
			
		||||
/* Callers store zero here to inhibit the error message `getopt' prints
 | 
			
		||||
   for unrecognized options.  */
 | 
			
		||||
 | 
			
		||||
extern int opterr;
 | 
			
		||||
 | 
			
		||||
/* Set to an option character which was unrecognized.  */
 | 
			
		||||
 | 
			
		||||
extern int optopt;
 | 
			
		||||
 | 
			
		||||
/* Describe the long-named options requested by the application.
 | 
			
		||||
   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
 | 
			
		||||
   of `struct option' terminated by an element containing a name which is
 | 
			
		||||
   zero.
 | 
			
		||||
 | 
			
		||||
   The field `has_arg' is:
 | 
			
		||||
   no_argument		(or 0) if the option does not take an argument,
 | 
			
		||||
   required_argument	(or 1) if the option requires an argument,
 | 
			
		||||
   optional_argument 	(or 2) if the option takes an optional argument.
 | 
			
		||||
 | 
			
		||||
   If the field `flag' is not NULL, it points to a variable that is set
 | 
			
		||||
   to the value given in the field `val' when the option is found, but
 | 
			
		||||
   left unchanged if the option is not found.
 | 
			
		||||
 | 
			
		||||
   To have a long-named option do something other than set an `int' to
 | 
			
		||||
   a compiled-in constant, such as set a value from `optarg', set the
 | 
			
		||||
   option's `flag' field to zero and its `val' field to a nonzero
 | 
			
		||||
   value (the equivalent single-letter option character, if there is
 | 
			
		||||
   one).  For long options that have a zero `flag' field, `getopt'
 | 
			
		||||
   returns the contents of the `val' field.  */
 | 
			
		||||
 | 
			
		||||
struct option
 | 
			
		||||
{
 | 
			
		||||
#if	__STDC__
 | 
			
		||||
  const char *name;
 | 
			
		||||
#else
 | 
			
		||||
  char *name;
 | 
			
		||||
#endif
 | 
			
		||||
  /* has_arg can't be an enum because some compilers complain about
 | 
			
		||||
     type mismatches in all the code that assumes it is an int.  */
 | 
			
		||||
  int has_arg;
 | 
			
		||||
  int *flag;
 | 
			
		||||
  int val;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Names for the values of the `has_arg' field of `struct option'.  */
 | 
			
		||||
 | 
			
		||||
#define	no_argument		0
 | 
			
		||||
#define required_argument	1
 | 
			
		||||
#define optional_argument	2
 | 
			
		||||
 | 
			
		||||
#if __STDC__
 | 
			
		||||
#if defined(__GNU_LIBRARY__)
 | 
			
		||||
/* Many other libraries have conflicting prototypes for getopt, with
 | 
			
		||||
   differences in the consts, in stdlib.h.  To avoid compilation
 | 
			
		||||
   errors, only prototype getopt for the GNU C library.  */
 | 
			
		||||
extern int getopt (int argc, char *const *argv, const char *shortopts);
 | 
			
		||||
#else /* not __GNU_LIBRARY__ */
 | 
			
		||||
extern int getopt ();
 | 
			
		||||
#endif /* not __GNU_LIBRARY__ */
 | 
			
		||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
 | 
			
		||||
		        const struct option *longopts, int *longind);
 | 
			
		||||
extern int getopt_long_only (int argc, char *const *argv,
 | 
			
		||||
			     const char *shortopts,
 | 
			
		||||
		             const struct option *longopts, int *longind);
 | 
			
		||||
 | 
			
		||||
/* Internal only.  Users should not call this directly.  */
 | 
			
		||||
extern int _getopt_internal (int argc, char *const *argv,
 | 
			
		||||
			     const char *shortopts,
 | 
			
		||||
		             const struct option *longopts, int *longind,
 | 
			
		||||
			     int long_only);
 | 
			
		||||
#else /* not __STDC__ */
 | 
			
		||||
extern int getopt ();
 | 
			
		||||
extern int getopt_long ();
 | 
			
		||||
extern int getopt_long_only ();
 | 
			
		||||
 | 
			
		||||
extern int _getopt_internal ();
 | 
			
		||||
#endif /* not __STDC__ */
 | 
			
		||||
 | 
			
		||||
#ifdef	__cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* _GETOPT_H */
 | 
			
		||||
							
								
								
									
										188
									
								
								wincompat/getopt1.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								wincompat/getopt1.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,188 @@
 | 
			
		|||
/* getopt_long and getopt_long_only entry points for GNU getopt.
 | 
			
		||||
   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
 | 
			
		||||
	Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
   This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
   under the terms of the GNU General Public License as published by the
 | 
			
		||||
   Free Software Foundation; either version 2, or (at your option) any
 | 
			
		||||
   later version.
 | 
			
		||||
 | 
			
		||||
   This program is distributed in the hope that it will be useful,
 | 
			
		||||
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
   GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
   You should have received a copy of the GNU General Public License
 | 
			
		||||
   along with this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#if defined (emacs) || defined (CONFIG_BROKETS)
 | 
			
		||||
/* We use <config.h> instead of "config.h" so that a compilation
 | 
			
		||||
   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
 | 
			
		||||
   (which it would do because it found this file in $srcdir).  */
 | 
			
		||||
#include <config.h>
 | 
			
		||||
#else
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#pragma warning(disable:4131)
 | 
			
		||||
#include "getopt.h"
 | 
			
		||||
 | 
			
		||||
#ifndef __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.  */
 | 
			
		||||
 | 
			
		||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* This needs to come after some library #include
 | 
			
		||||
   to get __GNU_LIBRARY__ defined.  */
 | 
			
		||||
#ifdef __GNU_LIBRARY__
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#else
 | 
			
		||||
char *getenv ();
 | 
			
		||||
#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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif	/* _LIBC or not __GNU_LIBRARY__.  */
 | 
			
		||||
 | 
			
		||||
#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 == EOF)
 | 
			
		||||
	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 */
 | 
			
		||||
							
								
								
									
										859
									
								
								wincompat/sys/queue.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										859
									
								
								wincompat/sys/queue.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,859 @@
 | 
			
		|||
/*-
 | 
			
		||||
 * SPDX-License-Identifier: BSD-3-Clause
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 1991, 1993
 | 
			
		||||
 *	The Regents of the University of California.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. Neither the name of the University nor the names of its contributors
 | 
			
		||||
 *    may be used to endorse or promote products derived from this software
 | 
			
		||||
 *    without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
 * SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *	@(#)queue.h	8.5 (Berkeley) 8/20/94
 | 
			
		||||
 * $FreeBSD$
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _SYS_QUEUE_H_
 | 
			
		||||
#define	_SYS_QUEUE_H_
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This file defines four types of data structures: singly-linked lists,
 | 
			
		||||
 * singly-linked tail queues, lists and tail queues.
 | 
			
		||||
 *
 | 
			
		||||
 * A singly-linked list is headed by a single forward pointer. The elements
 | 
			
		||||
 * are singly linked for minimum space and pointer manipulation overhead at
 | 
			
		||||
 * the expense of O(n) removal for arbitrary elements. New elements can be
 | 
			
		||||
 * added to the list after an existing element or at the head of the list.
 | 
			
		||||
 * Elements being removed from the head of the list should use the explicit
 | 
			
		||||
 * macro for this purpose for optimum efficiency. A singly-linked list may
 | 
			
		||||
 * only be traversed in the forward direction.  Singly-linked lists are ideal
 | 
			
		||||
 * for applications with large datasets and few or no removals or for
 | 
			
		||||
 * implementing a LIFO queue.
 | 
			
		||||
 *
 | 
			
		||||
 * A singly-linked tail queue is headed by a pair of pointers, one to the
 | 
			
		||||
 * head of the list and the other to the tail of the list. The elements are
 | 
			
		||||
 * singly linked for minimum space and pointer manipulation overhead at the
 | 
			
		||||
 * expense of O(n) removal for arbitrary elements. New elements can be added
 | 
			
		||||
 * to the list after an existing element, at the head of the list, or at the
 | 
			
		||||
 * end of the list. Elements being removed from the head of the tail queue
 | 
			
		||||
 * should use the explicit macro for this purpose for optimum efficiency.
 | 
			
		||||
 * A singly-linked tail queue may only be traversed in the forward direction.
 | 
			
		||||
 * Singly-linked tail queues are ideal for applications with large datasets
 | 
			
		||||
 * and few or no removals or for implementing a FIFO queue.
 | 
			
		||||
 *
 | 
			
		||||
 * A list is headed by a single forward pointer (or an array of forward
 | 
			
		||||
 * pointers for a hash table header). The elements are doubly linked
 | 
			
		||||
 * so that an arbitrary element can be removed without a need to
 | 
			
		||||
 * traverse the list. New elements can be added to the list before
 | 
			
		||||
 * or after an existing element or at the head of the list. A list
 | 
			
		||||
 * may be traversed in either direction.
 | 
			
		||||
 *
 | 
			
		||||
 * A tail queue is headed by a pair of pointers, one to the head of the
 | 
			
		||||
 * list and the other to the tail of the list. The elements are doubly
 | 
			
		||||
 * linked so that an arbitrary element can be removed without a need to
 | 
			
		||||
 * traverse the list. New elements can be added to the list before or
 | 
			
		||||
 * after an existing element, at the head of the list, or at the end of
 | 
			
		||||
 * the list. A tail queue may be traversed in either direction.
 | 
			
		||||
 *
 | 
			
		||||
 * For details on the use of these macros, see the queue(3) manual page.
 | 
			
		||||
 *
 | 
			
		||||
 * Below is a summary of implemented functions where:
 | 
			
		||||
 *  +  means the macro is available
 | 
			
		||||
 *  -  means the macro is not available
 | 
			
		||||
 *  s  means the macro is available but is slow (runs in O(n) time)
 | 
			
		||||
 *
 | 
			
		||||
 *				SLIST	LIST	STAILQ	TAILQ
 | 
			
		||||
 * _HEAD			+	+	+	+
 | 
			
		||||
 * _CLASS_HEAD			+	+	+	+
 | 
			
		||||
 * _HEAD_INITIALIZER		+	+	+	+
 | 
			
		||||
 * _ENTRY			+	+	+	+
 | 
			
		||||
 * _CLASS_ENTRY			+	+	+	+
 | 
			
		||||
 * _INIT			+	+	+	+
 | 
			
		||||
 * _EMPTY			+	+	+	+
 | 
			
		||||
 * _FIRST			+	+	+	+
 | 
			
		||||
 * _NEXT			+	+	+	+
 | 
			
		||||
 * _PREV			-	+	-	+
 | 
			
		||||
 * _LAST			-	-	+	+
 | 
			
		||||
 * _FOREACH			+	+	+	+
 | 
			
		||||
 * _FOREACH_FROM		+	+	+	+
 | 
			
		||||
 * _FOREACH_SAFE		+	+	+	+
 | 
			
		||||
 * _FOREACH_FROM_SAFE		+	+	+	+
 | 
			
		||||
 * _FOREACH_REVERSE		-	-	-	+
 | 
			
		||||
 * _FOREACH_REVERSE_FROM	-	-	-	+
 | 
			
		||||
 * _FOREACH_REVERSE_SAFE	-	-	-	+
 | 
			
		||||
 * _FOREACH_REVERSE_FROM_SAFE	-	-	-	+
 | 
			
		||||
 * _INSERT_HEAD			+	+	+	+
 | 
			
		||||
 * _INSERT_BEFORE		-	+	-	+
 | 
			
		||||
 * _INSERT_AFTER		+	+	+	+
 | 
			
		||||
 * _INSERT_TAIL			-	-	+	+
 | 
			
		||||
 * _CONCAT			s	s	+	+
 | 
			
		||||
 * _REMOVE_AFTER		+	-	+	-
 | 
			
		||||
 * _REMOVE_HEAD			+	-	+	-
 | 
			
		||||
 * _REMOVE			s	+	s	+
 | 
			
		||||
 * _SWAP			+	+	+	+
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifdef QUEUE_MACRO_DEBUG
 | 
			
		||||
#warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH
 | 
			
		||||
#define	QUEUE_MACRO_DEBUG_TRACE
 | 
			
		||||
#define	QUEUE_MACRO_DEBUG_TRASH
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef QUEUE_MACRO_DEBUG_TRACE
 | 
			
		||||
/* Store the last 2 places the queue element or head was altered */
 | 
			
		||||
struct qm_trace {
 | 
			
		||||
	unsigned long	 lastline;
 | 
			
		||||
	unsigned long	 prevline;
 | 
			
		||||
	const char	*lastfile;
 | 
			
		||||
	const char	*prevfile;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define	TRACEBUF	struct qm_trace trace;
 | 
			
		||||
#define	TRACEBUF_INITIALIZER	{ __LINE__, 0, __FILE__, NULL } ,
 | 
			
		||||
 | 
			
		||||
#define	QMD_TRACE_HEAD(head) do {					\
 | 
			
		||||
	(head)->trace.prevline = (head)->trace.lastline;		\
 | 
			
		||||
	(head)->trace.prevfile = (head)->trace.lastfile;		\
 | 
			
		||||
	(head)->trace.lastline = __LINE__;				\
 | 
			
		||||
	(head)->trace.lastfile = __FILE__;				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	QMD_TRACE_ELEM(elem) do {					\
 | 
			
		||||
	(elem)->trace.prevline = (elem)->trace.lastline;		\
 | 
			
		||||
	(elem)->trace.prevfile = (elem)->trace.lastfile;		\
 | 
			
		||||
	(elem)->trace.lastline = __LINE__;				\
 | 
			
		||||
	(elem)->trace.lastfile = __FILE__;				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#else	/* !QUEUE_MACRO_DEBUG_TRACE */
 | 
			
		||||
#define	QMD_TRACE_ELEM(elem)
 | 
			
		||||
#define	QMD_TRACE_HEAD(head)
 | 
			
		||||
#define	TRACEBUF
 | 
			
		||||
#define	TRACEBUF_INITIALIZER
 | 
			
		||||
#endif	/* QUEUE_MACRO_DEBUG_TRACE */
 | 
			
		||||
 | 
			
		||||
#ifdef QUEUE_MACRO_DEBUG_TRASH
 | 
			
		||||
#define	TRASHIT(x)		do {(x) = (void *)-1;} while (0)
 | 
			
		||||
#define	QMD_IS_TRASHED(x)	((x) == (void *)(intptr_t)-1)
 | 
			
		||||
#else	/* !QUEUE_MACRO_DEBUG_TRASH */
 | 
			
		||||
#define	TRASHIT(x)
 | 
			
		||||
#define	QMD_IS_TRASHED(x)	0
 | 
			
		||||
#endif	/* QUEUE_MACRO_DEBUG_TRASH */
 | 
			
		||||
 | 
			
		||||
#if defined(QUEUE_MACRO_DEBUG_TRACE) || defined(QUEUE_MACRO_DEBUG_TRASH)
 | 
			
		||||
#define	QMD_SAVELINK(name, link)	void **name = (void *)&(link)
 | 
			
		||||
#else	/* !QUEUE_MACRO_DEBUG_TRACE && !QUEUE_MACRO_DEBUG_TRASH */
 | 
			
		||||
#define	QMD_SAVELINK(name, link)
 | 
			
		||||
#endif	/* QUEUE_MACRO_DEBUG_TRACE || QUEUE_MACRO_DEBUG_TRASH */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
/*
 | 
			
		||||
 * In C++ there can be structure lists and class lists:
 | 
			
		||||
 */
 | 
			
		||||
#define	QUEUE_TYPEOF(type) type
 | 
			
		||||
#else
 | 
			
		||||
#define	QUEUE_TYPEOF(type) struct type
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Singly-linked List declarations.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLIST_HEAD(name, type)						\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	struct type *slh_first;	/* first element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	SLIST_CLASS_HEAD(name, type)					\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	class type *slh_first;	/* first element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	SLIST_HEAD_INITIALIZER(head)					\
 | 
			
		||||
	{ NULL }
 | 
			
		||||
 | 
			
		||||
#define	SLIST_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	struct type *sle_next;	/* next element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	SLIST_CLASS_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	class type *sle_next;		/* next element */		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Singly-linked List functions.
 | 
			
		||||
 */
 | 
			
		||||
#if (defined(_KERNEL) && defined(INVARIANTS))
 | 
			
		||||
#define	QMD_SLIST_CHECK_PREVPTR(prevp, elm) do {			\
 | 
			
		||||
	if (*(prevp) != (elm))						\
 | 
			
		||||
		panic("Bad prevptr *(%p) == %p != %p",			\
 | 
			
		||||
		    (prevp), *(prevp), (elm));				\
 | 
			
		||||
} while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define	QMD_SLIST_CHECK_PREVPTR(prevp, elm)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SLIST_CONCAT(head1, head2, type, field) do {			\
 | 
			
		||||
	QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head1);		\
 | 
			
		||||
	if (curelm == NULL) {						\
 | 
			
		||||
		if ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL)	\
 | 
			
		||||
			SLIST_INIT(head2);				\
 | 
			
		||||
	} else if (SLIST_FIRST(head2) != NULL) {			\
 | 
			
		||||
		while (SLIST_NEXT(curelm, field) != NULL)		\
 | 
			
		||||
			curelm = SLIST_NEXT(curelm, field);		\
 | 
			
		||||
		SLIST_NEXT(curelm, field) = SLIST_FIRST(head2);		\
 | 
			
		||||
		SLIST_INIT(head2);					\
 | 
			
		||||
	}								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FIRST(head)	((head)->slh_first)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FOREACH(var, head, field)					\
 | 
			
		||||
	for ((var) = SLIST_FIRST((head));				\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = SLIST_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FOREACH_FROM(var, head, field)				\
 | 
			
		||||
	for ((var) = ((var) ? (var) : SLIST_FIRST((head)));		\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = SLIST_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = SLIST_FIRST((head));				\
 | 
			
		||||
	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FOREACH_FROM_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = ((var) ? (var) : SLIST_FIRST((head)));		\
 | 
			
		||||
	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	SLIST_FOREACH_PREVPTR(var, varp, head, field)			\
 | 
			
		||||
	for ((varp) = &SLIST_FIRST((head));				\
 | 
			
		||||
	    ((var) = *(varp)) != NULL;					\
 | 
			
		||||
	    (varp) = &SLIST_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	SLIST_INIT(head) do {						\
 | 
			
		||||
	SLIST_FIRST((head)) = NULL;					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
 | 
			
		||||
	SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);	\
 | 
			
		||||
	SLIST_NEXT((slistelm), field) = (elm);				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
 | 
			
		||||
	SLIST_NEXT((elm), field) = SLIST_FIRST((head));			\
 | 
			
		||||
	SLIST_FIRST((head)) = (elm);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_REMOVE(head, elm, type, field) do {			\
 | 
			
		||||
	QMD_SAVELINK(oldnext, (elm)->field.sle_next);			\
 | 
			
		||||
	if (SLIST_FIRST((head)) == (elm)) {				\
 | 
			
		||||
		SLIST_REMOVE_HEAD((head), field);			\
 | 
			
		||||
	}								\
 | 
			
		||||
	else {								\
 | 
			
		||||
		QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head);		\
 | 
			
		||||
		while (SLIST_NEXT(curelm, field) != (elm))		\
 | 
			
		||||
			curelm = SLIST_NEXT(curelm, field);		\
 | 
			
		||||
		SLIST_REMOVE_AFTER(curelm, field);			\
 | 
			
		||||
	}								\
 | 
			
		||||
	TRASHIT(*oldnext);						\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define SLIST_REMOVE_AFTER(elm, field) do {				\
 | 
			
		||||
	SLIST_NEXT(elm, field) =					\
 | 
			
		||||
	    SLIST_NEXT(SLIST_NEXT(elm, field), field);			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_REMOVE_HEAD(head, field) do {				\
 | 
			
		||||
	SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	SLIST_REMOVE_PREVPTR(prevp, elm, field) do {			\
 | 
			
		||||
	QMD_SLIST_CHECK_PREVPTR(prevp, elm);				\
 | 
			
		||||
	*(prevp) = SLIST_NEXT(elm, field);				\
 | 
			
		||||
	TRASHIT((elm)->field.sle_next);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define SLIST_SWAP(head1, head2, type) do {				\
 | 
			
		||||
	QUEUE_TYPEOF(type) *swap_first = SLIST_FIRST(head1);		\
 | 
			
		||||
	SLIST_FIRST(head1) = SLIST_FIRST(head2);			\
 | 
			
		||||
	SLIST_FIRST(head2) = swap_first;				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Singly-linked Tail queue declarations.
 | 
			
		||||
 */
 | 
			
		||||
#define	STAILQ_HEAD(name, type)						\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	struct type *stqh_first;/* first element */			\
 | 
			
		||||
	struct type **stqh_last;/* addr of last next element */		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_CLASS_HEAD(name, type)					\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	class type *stqh_first;	/* first element */			\
 | 
			
		||||
	class type **stqh_last;	/* addr of last next element */		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_HEAD_INITIALIZER(head)					\
 | 
			
		||||
	{ NULL, &(head).stqh_first }
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	struct type *stqe_next;	/* next element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_CLASS_ENTRY(type)					\
 | 
			
		||||
struct {								\
 | 
			
		||||
	class type *stqe_next;	/* next element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Singly-linked Tail queue functions.
 | 
			
		||||
 */
 | 
			
		||||
#define	STAILQ_CONCAT(head1, head2) do {				\
 | 
			
		||||
	if (!STAILQ_EMPTY((head2))) {					\
 | 
			
		||||
		*(head1)->stqh_last = (head2)->stqh_first;		\
 | 
			
		||||
		(head1)->stqh_last = (head2)->stqh_last;		\
 | 
			
		||||
		STAILQ_INIT((head2));					\
 | 
			
		||||
	}								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_FIRST(head)	((head)->stqh_first)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_FOREACH(var, head, field)				\
 | 
			
		||||
	for((var) = STAILQ_FIRST((head));				\
 | 
			
		||||
	   (var);							\
 | 
			
		||||
	   (var) = STAILQ_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_FOREACH_FROM(var, head, field)				\
 | 
			
		||||
	for ((var) = ((var) ? (var) : STAILQ_FIRST((head)));		\
 | 
			
		||||
	   (var);							\
 | 
			
		||||
	   (var) = STAILQ_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_FOREACH_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = STAILQ_FIRST((head));				\
 | 
			
		||||
	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar)		\
 | 
			
		||||
	for ((var) = ((var) ? (var) : STAILQ_FIRST((head)));		\
 | 
			
		||||
	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_INIT(head) do {						\
 | 
			
		||||
	STAILQ_FIRST((head)) = NULL;					\
 | 
			
		||||
	(head)->stqh_last = &STAILQ_FIRST((head));			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {		\
 | 
			
		||||
	if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
 | 
			
		||||
		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
 | 
			
		||||
	STAILQ_NEXT((tqelm), field) = (elm);				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
 | 
			
		||||
	if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)	\
 | 
			
		||||
		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
 | 
			
		||||
	STAILQ_FIRST((head)) = (elm);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
 | 
			
		||||
	STAILQ_NEXT((elm), field) = NULL;				\
 | 
			
		||||
	*(head)->stqh_last = (elm);					\
 | 
			
		||||
	(head)->stqh_last = &STAILQ_NEXT((elm), field);			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_LAST(head, type, field)				\
 | 
			
		||||
	(STAILQ_EMPTY((head)) ? NULL :				\
 | 
			
		||||
	    __containerof((head)->stqh_last,			\
 | 
			
		||||
	    QUEUE_TYPEOF(type), field.stqe_next))
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_REMOVE(head, elm, type, field) do {			\
 | 
			
		||||
	QMD_SAVELINK(oldnext, (elm)->field.stqe_next);			\
 | 
			
		||||
	if (STAILQ_FIRST((head)) == (elm)) {				\
 | 
			
		||||
		STAILQ_REMOVE_HEAD((head), field);			\
 | 
			
		||||
	}								\
 | 
			
		||||
	else {								\
 | 
			
		||||
		QUEUE_TYPEOF(type) *curelm = STAILQ_FIRST(head);	\
 | 
			
		||||
		while (STAILQ_NEXT(curelm, field) != (elm))		\
 | 
			
		||||
			curelm = STAILQ_NEXT(curelm, field);		\
 | 
			
		||||
		STAILQ_REMOVE_AFTER(head, curelm, field);		\
 | 
			
		||||
	}								\
 | 
			
		||||
	TRASHIT(*oldnext);						\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define STAILQ_REMOVE_AFTER(head, elm, field) do {			\
 | 
			
		||||
	if ((STAILQ_NEXT(elm, field) =					\
 | 
			
		||||
	     STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)	\
 | 
			
		||||
		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	STAILQ_REMOVE_HEAD(head, field) do {				\
 | 
			
		||||
	if ((STAILQ_FIRST((head)) =					\
 | 
			
		||||
	     STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)		\
 | 
			
		||||
		(head)->stqh_last = &STAILQ_FIRST((head));		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define STAILQ_SWAP(head1, head2, type) do {				\
 | 
			
		||||
	QUEUE_TYPEOF(type) *swap_first = STAILQ_FIRST(head1);		\
 | 
			
		||||
	QUEUE_TYPEOF(type) **swap_last = (head1)->stqh_last;		\
 | 
			
		||||
	STAILQ_FIRST(head1) = STAILQ_FIRST(head2);			\
 | 
			
		||||
	(head1)->stqh_last = (head2)->stqh_last;			\
 | 
			
		||||
	STAILQ_FIRST(head2) = swap_first;				\
 | 
			
		||||
	(head2)->stqh_last = swap_last;					\
 | 
			
		||||
	if (STAILQ_EMPTY(head1))					\
 | 
			
		||||
		(head1)->stqh_last = &STAILQ_FIRST(head1);		\
 | 
			
		||||
	if (STAILQ_EMPTY(head2))					\
 | 
			
		||||
		(head2)->stqh_last = &STAILQ_FIRST(head2);		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * List declarations.
 | 
			
		||||
 */
 | 
			
		||||
#define	LIST_HEAD(name, type)						\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	struct type *lh_first;	/* first element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	LIST_CLASS_HEAD(name, type)					\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	class type *lh_first;	/* first element */			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	LIST_HEAD_INITIALIZER(head)					\
 | 
			
		||||
	{ NULL }
 | 
			
		||||
 | 
			
		||||
#define	LIST_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	struct type *le_next;	/* next element */			\
 | 
			
		||||
	struct type **le_prev;	/* address of previous next element */	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	LIST_CLASS_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	class type *le_next;	/* next element */			\
 | 
			
		||||
	class type **le_prev;	/* address of previous next element */	\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * List functions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if (defined(_KERNEL) && defined(INVARIANTS))
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_LIST_CHECK_HEAD(LIST_HEAD *head, LIST_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * If the list is non-empty, validates that the first element of the list
 | 
			
		||||
 * points back at 'head.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_LIST_CHECK_HEAD(head, field) do {				\
 | 
			
		||||
	if (LIST_FIRST((head)) != NULL &&				\
 | 
			
		||||
	    LIST_FIRST((head))->field.le_prev !=			\
 | 
			
		||||
	     &LIST_FIRST((head)))					\
 | 
			
		||||
		panic("Bad list head %p first->prev != head", (head));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_LIST_CHECK_NEXT(TYPE *elm, LIST_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * If an element follows 'elm' in the list, validates that the next element
 | 
			
		||||
 * points back at 'elm.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_LIST_CHECK_NEXT(elm, field) do {				\
 | 
			
		||||
	if (LIST_NEXT((elm), field) != NULL &&				\
 | 
			
		||||
	    LIST_NEXT((elm), field)->field.le_prev !=			\
 | 
			
		||||
	     &((elm)->field.le_next))					\
 | 
			
		||||
	     	panic("Bad link elm %p next->prev != elm", (elm));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_LIST_CHECK_PREV(TYPE *elm, LIST_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * Validates that the previous element (or head of the list) points to 'elm.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_LIST_CHECK_PREV(elm, field) do {				\
 | 
			
		||||
	if (*(elm)->field.le_prev != (elm))				\
 | 
			
		||||
		panic("Bad link elm %p prev->next != elm", (elm));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define	QMD_LIST_CHECK_HEAD(head, field)
 | 
			
		||||
#define	QMD_LIST_CHECK_NEXT(elm, field)
 | 
			
		||||
#define	QMD_LIST_CHECK_PREV(elm, field)
 | 
			
		||||
#endif /* (_KERNEL && INVARIANTS) */
 | 
			
		||||
 | 
			
		||||
#define LIST_CONCAT(head1, head2, type, field) do {			      \
 | 
			
		||||
	QUEUE_TYPEOF(type) *curelm = LIST_FIRST(head1);			      \
 | 
			
		||||
	if (curelm == NULL) {						      \
 | 
			
		||||
		if ((LIST_FIRST(head1) = LIST_FIRST(head2)) != NULL) {	      \
 | 
			
		||||
			LIST_FIRST(head2)->field.le_prev =		      \
 | 
			
		||||
			    &LIST_FIRST((head1));			      \
 | 
			
		||||
			LIST_INIT(head2);				      \
 | 
			
		||||
		}							      \
 | 
			
		||||
	} else if (LIST_FIRST(head2) != NULL) {				      \
 | 
			
		||||
		while (LIST_NEXT(curelm, field) != NULL)		      \
 | 
			
		||||
			curelm = LIST_NEXT(curelm, field);		      \
 | 
			
		||||
		LIST_NEXT(curelm, field) = LIST_FIRST(head2);		      \
 | 
			
		||||
		LIST_FIRST(head2)->field.le_prev = &LIST_NEXT(curelm, field); \
 | 
			
		||||
		LIST_INIT(head2);					      \
 | 
			
		||||
	}								      \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	LIST_EMPTY(head)	((head)->lh_first == NULL)
 | 
			
		||||
 | 
			
		||||
#define	LIST_FIRST(head)	((head)->lh_first)
 | 
			
		||||
 | 
			
		||||
#define	LIST_FOREACH(var, head, field)					\
 | 
			
		||||
	for ((var) = LIST_FIRST((head));				\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = LIST_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	LIST_FOREACH_FROM(var, head, field)				\
 | 
			
		||||
	for ((var) = ((var) ? (var) : LIST_FIRST((head)));		\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = LIST_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = LIST_FIRST((head));				\
 | 
			
		||||
	    (var) && ((tvar) = LIST_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	LIST_FOREACH_FROM_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = ((var) ? (var) : LIST_FIRST((head)));		\
 | 
			
		||||
	    (var) && ((tvar) = LIST_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	LIST_INIT(head) do {						\
 | 
			
		||||
	LIST_FIRST((head)) = NULL;					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
 | 
			
		||||
	QMD_LIST_CHECK_NEXT(listelm, field);				\
 | 
			
		||||
	if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
 | 
			
		||||
		LIST_NEXT((listelm), field)->field.le_prev =		\
 | 
			
		||||
		    &LIST_NEXT((elm), field);				\
 | 
			
		||||
	LIST_NEXT((listelm), field) = (elm);				\
 | 
			
		||||
	(elm)->field.le_prev = &LIST_NEXT((listelm), field);		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
 | 
			
		||||
	QMD_LIST_CHECK_PREV(listelm, field);				\
 | 
			
		||||
	(elm)->field.le_prev = (listelm)->field.le_prev;		\
 | 
			
		||||
	LIST_NEXT((elm), field) = (listelm);				\
 | 
			
		||||
	*(listelm)->field.le_prev = (elm);				\
 | 
			
		||||
	(listelm)->field.le_prev = &LIST_NEXT((elm), field);		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	LIST_INSERT_HEAD(head, elm, field) do {				\
 | 
			
		||||
	QMD_LIST_CHECK_HEAD((head), field);				\
 | 
			
		||||
	if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)	\
 | 
			
		||||
		LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
 | 
			
		||||
	LIST_FIRST((head)) = (elm);					\
 | 
			
		||||
	(elm)->field.le_prev = &LIST_FIRST((head));			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	LIST_NEXT(elm, field)	((elm)->field.le_next)
 | 
			
		||||
 | 
			
		||||
#define	LIST_PREV(elm, head, type, field)			\
 | 
			
		||||
	((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL :	\
 | 
			
		||||
	    __containerof((elm)->field.le_prev,			\
 | 
			
		||||
	    QUEUE_TYPEOF(type), field.le_next))
 | 
			
		||||
 | 
			
		||||
#define	LIST_REMOVE(elm, field) do {					\
 | 
			
		||||
	QMD_SAVELINK(oldnext, (elm)->field.le_next);			\
 | 
			
		||||
	QMD_SAVELINK(oldprev, (elm)->field.le_prev);			\
 | 
			
		||||
	QMD_LIST_CHECK_NEXT(elm, field);				\
 | 
			
		||||
	QMD_LIST_CHECK_PREV(elm, field);				\
 | 
			
		||||
	if (LIST_NEXT((elm), field) != NULL)				\
 | 
			
		||||
		LIST_NEXT((elm), field)->field.le_prev = 		\
 | 
			
		||||
		    (elm)->field.le_prev;				\
 | 
			
		||||
	*(elm)->field.le_prev = LIST_NEXT((elm), field);		\
 | 
			
		||||
	TRASHIT(*oldnext);						\
 | 
			
		||||
	TRASHIT(*oldprev);						\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define LIST_SWAP(head1, head2, type, field) do {			\
 | 
			
		||||
	QUEUE_TYPEOF(type) *swap_tmp = LIST_FIRST(head1);		\
 | 
			
		||||
	LIST_FIRST((head1)) = LIST_FIRST((head2));			\
 | 
			
		||||
	LIST_FIRST((head2)) = swap_tmp;					\
 | 
			
		||||
	if ((swap_tmp = LIST_FIRST((head1))) != NULL)			\
 | 
			
		||||
		swap_tmp->field.le_prev = &LIST_FIRST((head1));		\
 | 
			
		||||
	if ((swap_tmp = LIST_FIRST((head2))) != NULL)			\
 | 
			
		||||
		swap_tmp->field.le_prev = &LIST_FIRST((head2));		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Tail queue declarations.
 | 
			
		||||
 */
 | 
			
		||||
#define	TAILQ_HEAD(name, type)						\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	struct type *tqh_first;	/* first element */			\
 | 
			
		||||
	struct type **tqh_last;	/* addr of last next element */		\
 | 
			
		||||
	TRACEBUF							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_CLASS_HEAD(name, type)					\
 | 
			
		||||
struct name {								\
 | 
			
		||||
	class type *tqh_first;	/* first element */			\
 | 
			
		||||
	class type **tqh_last;	/* addr of last next element */		\
 | 
			
		||||
	TRACEBUF							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_HEAD_INITIALIZER(head)					\
 | 
			
		||||
	{ NULL, &(head).tqh_first, TRACEBUF_INITIALIZER }
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	struct type *tqe_next;	/* next element */			\
 | 
			
		||||
	struct type **tqe_prev;	/* address of previous next element */	\
 | 
			
		||||
	TRACEBUF							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_CLASS_ENTRY(type)						\
 | 
			
		||||
struct {								\
 | 
			
		||||
	class type *tqe_next;	/* next element */			\
 | 
			
		||||
	class type **tqe_prev;	/* address of previous next element */	\
 | 
			
		||||
	TRACEBUF							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Tail queue functions.
 | 
			
		||||
 */
 | 
			
		||||
#if (defined(_KERNEL) && defined(INVARIANTS))
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_TAILQ_CHECK_HEAD(TAILQ_HEAD *head, TAILQ_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * If the tailq is non-empty, validates that the first element of the tailq
 | 
			
		||||
 * points back at 'head.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_TAILQ_CHECK_HEAD(head, field) do {				\
 | 
			
		||||
	if (!TAILQ_EMPTY(head) &&					\
 | 
			
		||||
	    TAILQ_FIRST((head))->field.tqe_prev !=			\
 | 
			
		||||
	     &TAILQ_FIRST((head)))					\
 | 
			
		||||
		panic("Bad tailq head %p first->prev != head", (head));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_TAILQ_CHECK_TAIL(TAILQ_HEAD *head, TAILQ_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * Validates that the tail of the tailq is a pointer to pointer to NULL.
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_TAILQ_CHECK_TAIL(head, field) do {				\
 | 
			
		||||
	if (*(head)->tqh_last != NULL)					\
 | 
			
		||||
	    	panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); 	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_TAILQ_CHECK_NEXT(TYPE *elm, TAILQ_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * If an element follows 'elm' in the tailq, validates that the next element
 | 
			
		||||
 * points back at 'elm.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_TAILQ_CHECK_NEXT(elm, field) do {				\
 | 
			
		||||
	if (TAILQ_NEXT((elm), field) != NULL &&				\
 | 
			
		||||
	    TAILQ_NEXT((elm), field)->field.tqe_prev !=			\
 | 
			
		||||
	     &((elm)->field.tqe_next))					\
 | 
			
		||||
		panic("Bad link elm %p next->prev != elm", (elm));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * QMD_TAILQ_CHECK_PREV(TYPE *elm, TAILQ_ENTRY NAME)
 | 
			
		||||
 *
 | 
			
		||||
 * Validates that the previous element (or head of the tailq) points to 'elm.'
 | 
			
		||||
 */
 | 
			
		||||
#define	QMD_TAILQ_CHECK_PREV(elm, field) do {				\
 | 
			
		||||
	if (*(elm)->field.tqe_prev != (elm))				\
 | 
			
		||||
		panic("Bad link elm %p prev->next != elm", (elm));	\
 | 
			
		||||
} while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define	QMD_TAILQ_CHECK_HEAD(head, field)
 | 
			
		||||
#define	QMD_TAILQ_CHECK_TAIL(head, headname)
 | 
			
		||||
#define	QMD_TAILQ_CHECK_NEXT(elm, field)
 | 
			
		||||
#define	QMD_TAILQ_CHECK_PREV(elm, field)
 | 
			
		||||
#endif /* (_KERNEL && INVARIANTS) */
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_CONCAT(head1, head2, field) do {				\
 | 
			
		||||
	if (!TAILQ_EMPTY(head2)) {					\
 | 
			
		||||
		*(head1)->tqh_last = (head2)->tqh_first;		\
 | 
			
		||||
		(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
 | 
			
		||||
		(head1)->tqh_last = (head2)->tqh_last;			\
 | 
			
		||||
		TAILQ_INIT((head2));					\
 | 
			
		||||
		QMD_TRACE_HEAD(head1);					\
 | 
			
		||||
		QMD_TRACE_HEAD(head2);					\
 | 
			
		||||
	}								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_EMPTY(head)	((head)->tqh_first == NULL)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FIRST(head)	((head)->tqh_first)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH(var, head, field)					\
 | 
			
		||||
	for ((var) = TAILQ_FIRST((head));				\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = TAILQ_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_FROM(var, head, field)				\
 | 
			
		||||
	for ((var) = ((var) ? (var) : TAILQ_FIRST((head)));		\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = TAILQ_NEXT((var), field))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = TAILQ_FIRST((head));				\
 | 
			
		||||
	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar)			\
 | 
			
		||||
	for ((var) = ((var) ? (var) : TAILQ_FIRST((head)));		\
 | 
			
		||||
	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
 | 
			
		||||
	for ((var) = TAILQ_LAST((head), headname);			\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = TAILQ_PREV((var), headname, field))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field)		\
 | 
			
		||||
	for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname));	\
 | 
			
		||||
	    (var);							\
 | 
			
		||||
	    (var) = TAILQ_PREV((var), headname, field))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
 | 
			
		||||
	for ((var) = TAILQ_LAST((head), headname);			\
 | 
			
		||||
	    (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);	\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \
 | 
			
		||||
	for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname));	\
 | 
			
		||||
	    (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);	\
 | 
			
		||||
	    (var) = (tvar))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_INIT(head) do {						\
 | 
			
		||||
	TAILQ_FIRST((head)) = NULL;					\
 | 
			
		||||
	(head)->tqh_last = &TAILQ_FIRST((head));			\
 | 
			
		||||
	QMD_TRACE_HEAD(head);						\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
 | 
			
		||||
	QMD_TAILQ_CHECK_NEXT(listelm, field);				\
 | 
			
		||||
	if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
 | 
			
		||||
		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
 | 
			
		||||
		    &TAILQ_NEXT((elm), field);				\
 | 
			
		||||
	else {								\
 | 
			
		||||
		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
 | 
			
		||||
		QMD_TRACE_HEAD(head);					\
 | 
			
		||||
	}								\
 | 
			
		||||
	TAILQ_NEXT((listelm), field) = (elm);				\
 | 
			
		||||
	(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);		\
 | 
			
		||||
	QMD_TRACE_ELEM(&(elm)->field);					\
 | 
			
		||||
	QMD_TRACE_ELEM(&(listelm)->field);				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
 | 
			
		||||
	QMD_TAILQ_CHECK_PREV(listelm, field);				\
 | 
			
		||||
	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
 | 
			
		||||
	TAILQ_NEXT((elm), field) = (listelm);				\
 | 
			
		||||
	*(listelm)->field.tqe_prev = (elm);				\
 | 
			
		||||
	(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);		\
 | 
			
		||||
	QMD_TRACE_ELEM(&(elm)->field);					\
 | 
			
		||||
	QMD_TRACE_ELEM(&(listelm)->field);				\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
 | 
			
		||||
	QMD_TAILQ_CHECK_HEAD(head, field);				\
 | 
			
		||||
	if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)	\
 | 
			
		||||
		TAILQ_FIRST((head))->field.tqe_prev =			\
 | 
			
		||||
		    &TAILQ_NEXT((elm), field);				\
 | 
			
		||||
	else								\
 | 
			
		||||
		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
 | 
			
		||||
	TAILQ_FIRST((head)) = (elm);					\
 | 
			
		||||
	(elm)->field.tqe_prev = &TAILQ_FIRST((head));			\
 | 
			
		||||
	QMD_TRACE_HEAD(head);						\
 | 
			
		||||
	QMD_TRACE_ELEM(&(elm)->field);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
 | 
			
		||||
	QMD_TAILQ_CHECK_TAIL(head, field);				\
 | 
			
		||||
	TAILQ_NEXT((elm), field) = NULL;				\
 | 
			
		||||
	(elm)->field.tqe_prev = (head)->tqh_last;			\
 | 
			
		||||
	*(head)->tqh_last = (elm);					\
 | 
			
		||||
	(head)->tqh_last = &TAILQ_NEXT((elm), field);			\
 | 
			
		||||
	QMD_TRACE_HEAD(head);						\
 | 
			
		||||
	QMD_TRACE_ELEM(&(elm)->field);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_LAST(head, headname)					\
 | 
			
		||||
	(*(((struct headname *)((head)->tqh_last))->tqh_last))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_PREV(elm, headname, field)				\
 | 
			
		||||
	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
 | 
			
		||||
 | 
			
		||||
#define	TAILQ_REMOVE(head, elm, field) do {				\
 | 
			
		||||
	QMD_SAVELINK(oldnext, (elm)->field.tqe_next);			\
 | 
			
		||||
	QMD_SAVELINK(oldprev, (elm)->field.tqe_prev);			\
 | 
			
		||||
	QMD_TAILQ_CHECK_NEXT(elm, field);				\
 | 
			
		||||
	QMD_TAILQ_CHECK_PREV(elm, field);				\
 | 
			
		||||
	if ((TAILQ_NEXT((elm), field)) != NULL)				\
 | 
			
		||||
		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
 | 
			
		||||
		    (elm)->field.tqe_prev;				\
 | 
			
		||||
	else {								\
 | 
			
		||||
		(head)->tqh_last = (elm)->field.tqe_prev;		\
 | 
			
		||||
		QMD_TRACE_HEAD(head);					\
 | 
			
		||||
	}								\
 | 
			
		||||
	*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);		\
 | 
			
		||||
	TRASHIT(*oldnext);						\
 | 
			
		||||
	TRASHIT(*oldprev);						\
 | 
			
		||||
	QMD_TRACE_ELEM(&(elm)->field);					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define TAILQ_SWAP(head1, head2, type, field) do {			\
 | 
			
		||||
	QUEUE_TYPEOF(type) *swap_first = (head1)->tqh_first;		\
 | 
			
		||||
	QUEUE_TYPEOF(type) **swap_last = (head1)->tqh_last;		\
 | 
			
		||||
	(head1)->tqh_first = (head2)->tqh_first;			\
 | 
			
		||||
	(head1)->tqh_last = (head2)->tqh_last;				\
 | 
			
		||||
	(head2)->tqh_first = swap_first;				\
 | 
			
		||||
	(head2)->tqh_last = swap_last;					\
 | 
			
		||||
	if ((swap_first = (head1)->tqh_first) != NULL)			\
 | 
			
		||||
		swap_first->field.tqe_prev = &(head1)->tqh_first;	\
 | 
			
		||||
	else								\
 | 
			
		||||
		(head1)->tqh_last = &(head1)->tqh_first;		\
 | 
			
		||||
	if ((swap_first = (head2)->tqh_first) != NULL)			\
 | 
			
		||||
		swap_first->field.tqe_prev = &(head2)->tqh_first;	\
 | 
			
		||||
	else								\
 | 
			
		||||
		(head2)->tqh_last = &(head2)->tqh_first;		\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* !_SYS_QUEUE_H_ */
 | 
			
		||||
							
								
								
									
										1019
									
								
								wincompat/test_common_win.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1019
									
								
								wincompat/test_common_win.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										34
									
								
								wincompat/vc_compat.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								wincompat/vc_compat.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
#include <Windows.h>
 | 
			
		||||
#include <winsock2.h>
 | 
			
		||||
typedef SSIZE_T ssize_t;
 | 
			
		||||
struct iovec {
 | 
			
		||||
  void  *iov_base;    /* Starting address */
 | 
			
		||||
  size_t iov_len;     /* Number of bytes to transfer */
 | 
			
		||||
};
 | 
			
		||||
#define strcasecmp(a,b) _strcmpi(a,b)
 | 
			
		||||
#define strdup _strdup
 | 
			
		||||
 | 
			
		||||
#define posix_memalign(p, a, s) (((*(p)) = _aligned_malloc((s), (a))), *(p) ?0 :errno)
 | 
			
		||||
 | 
			
		||||
#pragma warning(disable: 4018 4100 4127 4189 4200 4204 4214 4152 4221 4244 4245 4267 4334 4702 4706 4804 ) 
 | 
			
		||||
                                    /*
 | 
			
		||||
                                    4018:signed/unsigned mismatch
 | 
			
		||||
                                    4100:unreferenced formal parameter,
 | 
			
		||||
                                    4127: conditional expression is constant
 | 
			
		||||
									4152: nonstandard extension, function/data pointer conversion in expression
 | 
			
		||||
									4189:local variable is initialized but not referenced
 | 
			
		||||
                                    4200:zero-sized-array in struct, 
 | 
			
		||||
                                    4204: nonstandard extension used: non-constant aggregate initializer,
 | 
			
		||||
                                    4214: nonstandard extension used: bit field types other than int
 | 
			
		||||
                                    4221: nonstandard extension used:xx cannot be initialized using address of automatic variable y,
 | 
			
		||||
                                    4244: '+=': conversion from 'int' to 'unsigned short', possible loss of data
 | 
			
		||||
                                    4245:'=': conversion from 'int' to 'unsigned int', signed/unsigned mismatch
 | 
			
		||||
                                    4267 function': conversion from 'size_t' to 'int', possible loss of data
 | 
			
		||||
                                    4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
 | 
			
		||||
                                    4702: unreachable code
 | 
			
		||||
                                    4706: assignment within conditional expression,
 | 
			
		||||
                                    4804: '-': unsafe use of type 'bool' in operation
 | 
			
		||||
                                    */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue