[27045] in Source-Commits

home help back first fref pref prev next nref lref last post

Re: /svn/athena r25905 - in trunk/athena/lib/athdir: . src

daemon@ATHENA.MIT.EDU (Jonathan Reed)
Wed Apr 10 11:55:46 2013

Mime-Version: 1.0 (Apple Message framework v1084)
Content-Type: text/plain; charset=us-ascii
From: Jonathan Reed <jdreed@MIT.EDU>
In-Reply-To: <201304092107.r39L718k019193@drugstore.mit.edu>
Date: Wed, 10 Apr 2013 11:55:35 -0400
Cc: source-commits@MIT.EDU
Message-Id: <19BD68DF-CDD4-42C2-840B-8DB3CCB67C2B@mit.edu>
To: Alexander Chernyakhovsky <achernya@MIT.EDU>
Content-Transfer-Encoding: 8bit

Actually, we now need to cleanup the mess that is the rules file.  If you want to just convert it to dh7, feel free.

-Jon

On Apr 9, 2013, at 5:07 PM, Alexander Chernyakhovsky wrote:

> Author: achernya
> Date: 2013-04-09 17:07:01 -0400 (Tue, 09 Apr 2013)
> New Revision: 25905
> 
> Added:
>   trunk/athena/lib/athdir/AUTHORS
>   trunk/athena/lib/athdir/COPYING
>   trunk/athena/lib/athdir/ChangeLog
>   trunk/athena/lib/athdir/Makefile.am
>   trunk/athena/lib/athdir/NEWS
>   trunk/athena/lib/athdir/README
>   trunk/athena/lib/athdir/autogen.sh
>   trunk/athena/lib/athdir/m4/
>   trunk/athena/lib/athdir/src/
>   trunk/athena/lib/athdir/src/Makefile.am
>   trunk/athena/lib/athdir/src/athdir.c
>   trunk/athena/lib/athdir/src/athdir.h
>   trunk/athena/lib/athdir/src/athdir.pc.in
>   trunk/athena/lib/athdir/src/stringlist.c
>   trunk/athena/lib/athdir/src/stringlist.h
> Removed:
>   trunk/athena/lib/athdir/Makefile.in
>   trunk/athena/lib/athdir/athdir.c
>   trunk/athena/lib/athdir/athdir.h
>   trunk/athena/lib/athdir/athdir.pc.in
>   trunk/athena/lib/athdir/stringlist.c
>   trunk/athena/lib/athdir/stringlist.h
> Modified:
>   trunk/athena/lib/athdir/configure.ac
> Log:
> Transform athdir into an automake project; also relicense to BSD-2-Clause
> 
> Added: trunk/athena/lib/athdir/AUTHORS
> ===================================================================
> Added: trunk/athena/lib/athdir/COPYING
> ===================================================================
> --- trunk/athena/lib/athdir/COPYING	                        (rev 0)
> +++ trunk/athena/lib/athdir/COPYING	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,30 @@
> +Copyright 1998 by the Massachusetts Institute of Technology.
> +
> +Redistribution and use in source and binary forms, with or without
> +modification, are permitted provided that the following conditions
> +are met:
> +
> +* Redistributions of source code must retain the above copyright
> +  notice, this list of conditions and the following disclaimer.
> +
> +* 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.
> +
> +* Neither the name of the M.I.T 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 COPYRIGHT HOLDERS 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
> +COPYRIGHT HOLDER 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.
> 
> Added: trunk/athena/lib/athdir/ChangeLog
> ===================================================================
> Added: trunk/athena/lib/athdir/Makefile.am
> ===================================================================
> --- trunk/athena/lib/athdir/Makefile.am	                        (rev 0)
> +++ trunk/athena/lib/athdir/Makefile.am	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,3 @@
> +ACLOCAL_AMFLAGS = --install -I m4
> +SUBDIRS = src
> +EXTRA_DIST = autogen.sh
> 
> Added: trunk/athena/lib/athdir/NEWS
> ===================================================================
> Added: trunk/athena/lib/athdir/README
> ===================================================================
> Added: trunk/athena/lib/athdir/autogen.sh
> ===================================================================
> --- trunk/athena/lib/athdir/autogen.sh	                        (rev 0)
> +++ trunk/athena/lib/athdir/autogen.sh	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,2 @@
> +#!/bin/sh
> +exec autoreconf -fi
> 
> 
> Property changes on: trunk/athena/lib/athdir/autogen.sh
> ___________________________________________________________________
> Added: svn:executable
>   + *
> 
> Modified: trunk/athena/lib/athdir/configure.ac
> ===================================================================
> --- trunk/athena/lib/athdir/configure.ac	2013-04-09 19:13:05 UTC (rev 25904)
> +++ trunk/athena/lib/athdir/configure.ac	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -1,15 +1,44 @@
> -dnl Process this file with autoconf to produce a configure script.
> -AC_INIT([libathdir], [10.0.2])
> -AC_CONFIG_SRCDIR([athdir.c])
> +#                                               -*- Autoconf -*-
> +# Process this file with autoconf to produce a configure script.
> 
> +AC_PREREQ([2.67])
> +AC_INIT([libathdir], [10.0.2], [debathena@mit.edu])
> +AM_INIT_AUTOMAKE([-Wall])
> +AM_MAINTAINER_MODE([enable])
> +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
> +AC_CONFIG_MACRO_DIR([m4])
> +AC_CONFIG_SRCDIR([src/athdir.c])
> +AC_CONFIG_HEADERS([config.h])
> +
> +# Checks for programs.
> AC_PROG_CC
> AC_PROG_INSTALL
> +# automake 1.12 seems to require this, but automake 1.11 doesn't recognize it
> +m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
> +LT_INIT
> AC_PROG_LIBTOOL
> -AC_PROG_MKDIR_P
> -AS_IF([test x"$ATHENA_SYS" = x], [AC_MSG_ERROR([ATHENA_SYS must be set])]) 
> -AS_IF([test x"$ATHENA_HOSTTYPE" = x], [AC_MSG_ERROR([ATHENA_HOSTTYPE must be set])]) 
> -AC_DEFINE_UNQUOTED([ATHSYS], ["$ATHENA_SYS"])
> -AC_DEFINE_UNQUOTED([HOSTTYPE_$ATHENA_HOSTTYPE])
> 
> -AC_CONFIG_FILES([Makefile athdir.pc])
> +# Checks for libraries.
> +
> +# Checks for header files.
> +AC_CHECK_HEADERS([stdlib.h string.h sys/param.h])
> +
> +# Checks for typedefs, structures, and compiler characteristics.
> +
> +# Checks for library functions.
> +AC_FUNC_MALLOC
> +AC_FUNC_REALLOC
> +AC_CHECK_FUNCS([strchr])
> +
> +# More stuff
> +AS_IF([test x"$ATHENA_SYS" = x], [AC_MSG_ERROR([ATHENA_SYS must be set])])
> +AS_IF([test x"$ATHENA_HOSTTYPE" = x], [AC_MSG_ERROR([ATHENA_HOSTTYPE must be set])])
> +AC_DEFINE_UNQUOTED([ATHSYS], ["$ATHENA_SYS"], [Define the Athena System Version])
> +AC_DEFINE_UNQUOTED([HOSTTYPE_$ATHENA_HOSTTYPE], [Define the type of the Athena System])
> +
> +
> +AC_CONFIG_FILES([Makefile
> +                 src/Makefile
> +		 src/athdir.pc
> +])
> AC_OUTPUT
> 
> Added: trunk/athena/lib/athdir/src/Makefile.am
> ===================================================================
> --- trunk/athena/lib/athdir/src/Makefile.am	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/Makefile.am	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,9 @@
> +pkgconfigdir = $(libdir)/pkgconfig
> +pkgconfig_DATA = athdir.pc
> +
> +include_HEADERS = athdir.h
> +
> +lib_LTLIBRARIES = libathdir.la
> +libathdir_la_SOURCES = \
> +        athdir.c \
> +	stringlist.c
> 
> Copied: trunk/athena/lib/athdir/src/athdir.c (from rev 25903, trunk/athena/lib/athdir/athdir.c)
> ===================================================================
> --- trunk/athena/lib/athdir/src/athdir.c	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/athdir.c	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,382 @@
> +/* Copyright 1998 by the Massachusetts Institute of Technology.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + *   notice, this list of conditions and the following disclaimer.
> + *
> + * * 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.
> + *
> + * * Neither the name of the M.I.T 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 COPYRIGHT HOLDERS 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
> + * COPYRIGHT HOLDER 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.
> + */
> +
> +/* This file implements the main athdir library calls. */
> +
> +static const char rcsid[] = "$Id: athdir.c,v 1.6 1999-10-23 19:28:46 danw Exp $";
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/param.h>		/* MAXPATHLEN */
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include "athdir.h"
> +#include "stringlist.h"
> +#include "config.h"
> +
> +/* Define HOSTTYPE for the platforms where `machtype`bin has historic
> + * use.  Never add new platforms to this list.
> + */
> +#if defined(HOSTTYPE_sun4)
> +#define HOSTTYPE "sun4"
> +#elif defined(HOSTTYPE_linux)
> +#define HOSTTYPE "linux"
> +#elif defined(HOSTTYPE_inbsd)
> +#define HOSTTYPE "inbsd"
> +#endif
> +
> +#ifdef HOSTTYPE
> +char *hosttype = HOSTTYPE;
> +#else
> +char *hosttype = NULL;
> +#endif
> +
> +/* Definition of known conventions and what flavors they are.  */
> +
> +typedef struct {
> +  char *name;
> +  int flavor;
> +} Convention;
> +
> +#define ARCHflavor (1<<0)
> +#define MACHflavor (1<<1)
> +#define PLAINflavor (1<<2)
> +#define SYSflavor (1<<3)
> +#define DEPENDENTflavor (1<<8)
> +#define INDEPENDENTflavor (1<<9)
> +#define ATSYSflag (1<<16)
> +
> +#define NUMCONVENTIONS 5
> +
> +Convention conventions[NUMCONVENTIONS] = {
> +  { NULL,		ARCHflavor | MACHflavor | PLAINflavor |
> +      			DEPENDENTflavor | INDEPENDENTflavor },
> +  { "%p/arch/%s/%t",	ARCHflavor | DEPENDENTflavor | ATSYSflag },
> +  { "%p/%s/%t",		SYSflavor | DEPENDENTflavor | ATSYSflag },
> +  { "%p/%m%t",		MACHflavor | DEPENDENTflavor },
> +  { "%p/%t",		PLAINflavor | INDEPENDENTflavor }
> +};
> +
> +/* Editorial tagging for what conventions are acceptable or
> + * preferable for what types.
> + */
> +
> +typedef struct {
> +  char *type;
> +  int allowedFlavors;	/* searching parameters */
> +  int preferredFlavor;	/* creating paramaters */
> +} Editorial;
> +
> +Editorial editorials[] = {
> +  { "bin",	ARCHflavor | SYSflavor | MACHflavor,	DEPENDENTflavor },
> +  { "lib",	ARCHflavor | SYSflavor | MACHflavor,	DEPENDENTflavor },
> +  { "etc",	ARCHflavor | SYSflavor | MACHflavor,	DEPENDENTflavor },
> +  { "man",	ARCHflavor | PLAINflavor,		INDEPENDENTflavor },
> +  { "include",	ARCHflavor | PLAINflavor,		INDEPENDENTflavor },
> +  { NULL,	ARCHflavor | PLAINflavor,		DEPENDENTflavor }
> +};
> +
> +/* path = template(dir, type, sys, machine)
> + *	%p = path (dir)
> + *	%t = type
> + *	%s = sys
> + *	%m = machine
> + * %foo is inserted if the corresponding string is NULL.
> + * If this happens, expand returns 1 (not a valid path).
> + * If expand runs out of memory, it returns -1 (and path is NULL).
> + * Otherwise, expand returns 0.
> + */
> +static int expand(char **path, char *template, char *dir,
> +	   char *type, char *sys, char *machine)
> +{
> +  char *src, *dst, *oldpath;
> +  int somenull = 0, size;
> +
> +  src = template;
> +  size = strlen(template) + 1;
> +  dst = oldpath = *path = malloc(size);
> +  *dst = '\0';
> +
> +  while (*src != '\0')
> +    {
> +      if (*src != '%')
> +	*dst++ = *src++;
> +      else
> +	{
> +
> +#define copystring(casec, cases, string)			\
> +	case casec:						\
> +	  src++;						\
> +	  if (string)						\
> +	    {							\
> +	      *path = realloc(*path, size += strlen(string));	\
> +	      if (!*path)					\
> +		return -1;					\
> +	      dst = *path + (dst - oldpath);			\
> +	      oldpath = *path;					\
> +	      strcpy(dst, string);				\
> +	      dst += strlen(string);				\
> +	    }							\
> +	  else							\
> +	    {							\
> +	      strcpy(dst, cases);				\
> +	      dst += 2;						\
> +	      somenull = 1;					\
> +	    }							\
> +	  break;
> +
> +	  src++;
> +	  switch(*src)
> +	    {
> +	      copystring('p', "%p", dir);
> +	      copystring('t', "%t", type);
> +	      copystring('s', "%s", sys);
> +	      copystring('m', "%m", machine);
> +
> +#undef copystring
> +
> +	    case '\0':
> +	      break;
> +
> +	    default:
> +	      *dst++ = '%';
> +	      *dst++ = *src++;
> +	      break;
> +	    }
> +	}
> +    }
> +
> +  *dst = '\0';
> +  return somenull;
> +}
> +
> +static int template_flavor(char *template)
> +{
> +  int flavor = ARCHflavor | MACHflavor | PLAINflavor
> +    | DEPENDENTflavor | INDEPENDENTflavor;
> +  char *ptr;
> +
> +  if (template == NULL)
> +    return 0;
> +
> +  for (ptr = strchr(template, '%'); ptr != NULL; ptr = strchr(ptr + 1, '%'))
> +    {
> +      if (*(ptr+1) == 's')
> +	flavor |= ATSYSflag;
> +    }
> +
> +  return flavor;
> +}
> +
> +int athdir_native(char *what, char *sys)
> +{
> +  char *ptr;
> +
> +  /* If sys is NULL, fall back to ATHENA_SYS if it's set, otherwise
> +   * use the compiled-in value.
> +   */
> +  if (sys == NULL)
> +    {
> +      sys = getenv("ATHENA_SYS");
> +      if (sys == NULL || strchr(sys, '/') != NULL)
> +	sys = ATHSYS;
> +    }
> +
> +  for (ptr = strchr(what, sys[0]); ptr != NULL; ptr = strchr(ptr + 1, sys[0]))
> +    {
> +      if (!strncmp(ptr, sys, strlen(sys)))
> +	return 1;
> +    }
> +
> +  return 0;
> +}
> +
> +/* You are in a twisty little maze of interconnecting flags, all different.
> + */
> +char **athdir_get_paths(char *base_path, char *type,
> +			char *sys, char **syscompat, char *machine,
> +			char *aux, int flags)
> +{
> +  char *path;
> +  string_list *path_list = NULL, *compat_list = NULL;
> +  int t, j, complete, preferredFlavor, want_break;
> +  struct stat statbuf;
> +  char **current_compat, **mysyscompat = NULL, *compat_env;
> +
> +  /* If sys is NULL, fall back to ATHENA_SYS if it's set, otherwise
> +   * use the compiled-in value.
> +   */
> +  if (sys == NULL)
> +    {
> +      sys = getenv("ATHENA_SYS");
> +      if (sys == NULL || strchr(sys, '/') != NULL)
> +	sys = ATHSYS;
> +    }
> +
> +  /* Generate the syscompat array from the environment if it wasn't
> +   * passed in.
> +   */
> +  if (syscompat == NULL)
> +    {
> +      /* We're compatible with ourselves. */
> +      if (athdir__add_string(&compat_list, sys, 0))
> +	return NULL;
> +      compat_env = getenv("ATHENA_SYS_COMPAT");
> +      if (compat_env != NULL && !strchr(compat_env, '/'))
> +	{
> +	  if (athdir__parse_string(&compat_list, compat_env, ':'))
> +	    return NULL;
> +	}
> +      syscompat = mysyscompat = athdir__make_string_array(&compat_list);
> +    }
> +
> +  /* If machine is NULL, use whatever was compiled in. */
> +  if (machine == NULL)
> +    machine = hosttype;
> +
> +  /* Zeroeth convention is optionally provided by the caller. */
> +  conventions[0].name = aux;
> +  conventions[0].flavor = template_flavor(aux);
> +
> +  /* Find matching editorial for the type of directory requested
> +   * (to be consulted later).
> +   */
> +  for (t = 0; editorials[t].type != NULL; t++)
> +    {
> +      if (type != NULL && !strcmp(type, editorials[t].type))
> +	break;
> +    }
> +
> +  if (flags & ATHDIR_MACHINEDEPENDENT)
> +    preferredFlavor = DEPENDENTflavor;
> +  else
> +    {
> +      if (flags & ATHDIR_MACHINEINDEPENDENT)
> +	preferredFlavor = INDEPENDENTflavor;
> +      else
> +	preferredFlavor = editorials[t].preferredFlavor;
> +    }
> +
> +  /* Cycle through matching conventions */
> +  for (j = 0; j < NUMCONVENTIONS; j++)
> +    {
> +      if (conventions[j].name == NULL)
> +	continue; /* conventions[0], the caller specified convention,
> +		   * is not set. */
> +      want_break = 0;
> +
> +      if (
> +	  /* If the editorial says this is a reasonable convention
> +	   * for this type
> +	   */
> +	  (editorials[t].allowedFlavors & conventions[j].flavor) ||
> +
> +	  /* or we don't care what the editorials say */
> +	  (flags & ATHDIR_SUPPRESSEDITORIALS) || 
> +
> +	  /* or something more explicit than the editorials has been
> +	   * specified
> +	   */
> +	  (((ATHDIR_MACHINEDEPENDENT | ATHDIR_MACHINEINDEPENDENT) & flags) &&
> +	   (flags & ATHDIR_SUPPRESSSEARCH)))
> +	{
> +	  /* If we're looking for a specific flavor (machine dependent/
> +	   * machine independent) and this isn't it, keep going.
> +	   */
> +	  if ((ATHDIR_SUPPRESSSEARCH & flags) &&
> +	      !(preferredFlavor & conventions[j].flavor))
> +	    continue;
> +
> +	  for (current_compat = syscompat; *current_compat != NULL;
> +	       current_compat++)
> +	    {
> +	      complete = !expand(&path, conventions[j].name,
> +				 base_path, type, *current_compat, hosttype);
> +
> +	      if (!path)
> +		return NULL;
> +
> +	      /* If we're listing everything, or we only care about the
> +	       * first match for creation purposes (both cases where we
> +	       * don't want to stat()), store this match.
> +	       */
> +	      if ((flags & ATHDIR_LISTSEARCHDIRECTORIES) ||
> +		  ((flags & ATHDIR_SUPPRESSSEARCH) && complete))
> +		{
> +		  if (athdir__add_string(&path_list, path, 0))
> +		    {
> +		      free(path);
> +		      return NULL;
> +		    }
> +		  free(path);
> +		  
> +		  /* In this case (first match for creation) we're done. */
> +		  if (flags & ATHDIR_SUPPRESSSEARCH)
> +		    {
> +		      want_break = 1;
> +		      break;
> +		    }
> +		}
> +	      else /* If it's there, store it and be done. */
> +		if (complete && !stat(path, &statbuf))
> +		  {
> +		    if (athdir__add_string(&path_list, path, 0))
> +		      {
> +			free(path);
> +			return NULL;
> +		      }
> +		    free(path);
> +		    want_break = 1;
> +		    break;
> +		  }
> +	      else
> +		free(path);
> +
> +	      /* Don't loop over @sys values unless ATSYSflag. */
> +	      if (!(conventions[j].flavor & ATSYSflag))
> +		break;
> +	    }
> +	}
> +
> +      if (want_break)
> +	break;
> +    }
> +
> +  athdir__free_string_array(mysyscompat);
> +  return athdir__make_string_array(&path_list);
> +}
> +
> +void athdir_free_paths(char **paths)
> +{
> +  athdir__free_string_array(paths);
> +}
> 
> Copied: trunk/athena/lib/athdir/src/athdir.h (from rev 25903, trunk/athena/lib/athdir/athdir.h)
> ===================================================================
> --- trunk/athena/lib/athdir/src/athdir.h	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/athdir.h	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,50 @@
> +/* $Id: athdir.h,v 1.1 1998-03-17 03:43:09 cfields Exp $ */
> +
> +/* Copyright 1998 by the Massachusetts Institute of Technology.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + *   notice, this list of conditions and the following disclaimer.
> + *
> + * * 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.
> + *
> + * * Neither the name of the M.I.T 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 COPYRIGHT HOLDERS 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
> + * COPYRIGHT HOLDER 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.
> + */
> +
> +#ifndef ATHDIR__H
> +#define ATHDIR__H
> +
> +#define ATHDIR_SUPPRESSEDITORIALS	(1<<0)
> +#define ATHDIR_SUPPRESSSEARCH		(1<<1)
> +#define ATHDIR_MACHINEDEPENDENT		(1<<2)
> +#define ATHDIR_MACHINEINDEPENDENT	(1<<3)
> +#define ATHDIR_LISTSEARCHDIRECTORIES	(1<<4)
> +
> +char **athdir_get_paths(char *base_path, char *type,
> +			char *sys, char **syscompat, char *machine,
> +			char *aux, int flags);
> +void athdir_free_paths(char **paths);
> +int athdir_native(char *what, char *sys);
> +
> +#endif
> 
> Copied: trunk/athena/lib/athdir/src/athdir.pc.in (from rev 25903, trunk/athena/lib/athdir/athdir.pc.in)
> ===================================================================
> --- trunk/athena/lib/athdir/src/athdir.pc.in	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/athdir.pc.in	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,10 @@
> +prefix=@prefix@
> +exec_prefix=@exec_prefix@
> +libdir=@libdir@
> +includedir=@includedir@
> +
> +Name: athdir
> +Description: The Athena directory location library
> +Version: @PACKAGE_VERSION@
> +Libs: -L${libdir} -lathdir
> +Cflags: -I${includedir}
> 
> Copied: trunk/athena/lib/athdir/src/stringlist.c (from rev 25903, trunk/athena/lib/athdir/stringlist.c)
> ===================================================================
> --- trunk/athena/lib/athdir/src/stringlist.c	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/stringlist.c	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,207 @@
> +/* Copyright 1998 by the Massachusetts Institute of Technology.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + *   notice, this list of conditions and the following disclaimer.
> + *
> + * * 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.
> + *
> + * * Neither the name of the M.I.T 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 COPYRIGHT HOLDERS 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
> + * COPYRIGHT HOLDER 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.
> + */
> +
> +/* This file implements basic string array functions and structures
> + * to be used by software using the athdir library.
> + */
> +
> +static const char rcsid[] = "$Id: stringlist.c,v 1.2 1999-10-23 19:28:46 danw Exp $";
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
> +#include "stringlist.h"
> +
> +#define CHUNKSIZE 10
> +
> +/* athdir__add_string
> + *   Add a copy of "string" to "list," and to the front of "list" if
> + *   "front" is false. If "list" is NULL, initialize it as well.
> + */
> +int athdir__add_string(string_list **list, char *string, int front)
> +{
> +  char *newstring;
> +  int index;
> +
> +  /* To add nothing, do nothing. */
> +  if (string == NULL)
> +    return 0;
> +
> +  if (list == NULL)
> +    return -1;
> +
> + /* Initialize the structure if it's NULL. */
> +  if (*list == NULL)
> +    {
> +      *list = malloc(sizeof(string_list));
> +
> +      if (*list == NULL)
> +	return -1;
> +
> +      (*list)->strings = malloc(CHUNKSIZE * sizeof(char *));
> +      if ((*list)->strings == NULL)
> +	{
> +	  free(*list);
> +	  *list = NULL;
> +	  return -1;
> +	}
> +
> +      (*list)->alloced = CHUNKSIZE;
> +      (*list)->length = 0;
> +      (*list)->strings[0] = NULL;
> +    }
> +
> +  /* Allocate more list space if the list is full. */
> +  if ((*list)->alloced == (*list)->length + 1) /* must be NULL terminated */
> +    {
> +      (*list)->strings = realloc((*list)->strings,
> +			      ((*list)->alloced + CHUNKSIZE) * sizeof(char *));
> +      if ((*list)->strings == NULL)
> +	{
> +	  free(*list);
> +	  return -1;
> +	}
> +      (*list)->alloced += CHUNKSIZE;
> +    }
> +
> +  /* Make our own copy of the string. */
> +  newstring = malloc(strlen(string) + 1);
> +  if (newstring == NULL)
> +    return -1;
> +  strcpy(newstring, string);
> +
> +  /* Add the string to the list. */
> +  if (front)
> +    {
> +      (*list)->length++;
> +      for (index = (*list)->length; index > 0; index--)
> +	(*list)->strings[index] = (*list)->strings[index - 1];
> +      (*list)->strings[0] = newstring;
> +    }
> +  else
> +    {
> +      (*list)->strings[(*list)->length] = newstring;
> +      (*list)->length++;
> +      (*list)->strings[(*list)->length] = NULL;
> +    }
> +
> +  return 0;
> +}
> +
> +/* athdir__make_string_array
> + *   Returns a NULL terminated array of strings (or NULL if the list
> + *   is empty) while freeing the surrounding structure. free_string_array
> + *   the array when finished.
> + */
> +char **athdir__make_string_array(string_list **list)
> +{
> +  char **strings = NULL;
> +
> +  if (list != NULL && *list != NULL)
> +    {
> +      if ((*list)->strings[0] != NULL)
> +	strings = (*list)->strings;
> +      else
> +	free((*list)->strings);
> +
> +      free(*list);
> +      *list = NULL;
> +    }
> +
> +  return strings;
> +}
> +
> +/* athdir__free_string_array
> + *   Frees a string array generated by athdir__make_string_array.
> + */
> +void athdir__free_string_array(char **array)
> +{
> +  char **ptr;
> +
> +  if (array != NULL)
> +    {
> +      for (ptr = array; *ptr != NULL; ptr++)
> +	free(*ptr);
> +
> +      free(array);
> +    }
> +}
> +
> +/* athdir__parse_string
> + *   Parse "string" using "sep" as a separator into separate strings, adding
> + *   adding each substring to the end of "list." Nondestructive to string,
> + *   doesn't point to string.
> + */
> +int athdir__parse_string(string_list **list, char *string, char sep)
> +{
> +  char *ptr, *sep_ptr;
> +  char *value;
> +  int length;
> +
> +  if (string != NULL)
> +    {
> +      /* Allocate a buffer big enough for any substring of string. */
> +      value = malloc(strlen(string) + 1);
> +      if (value == NULL)
> +	return -1;
> +
> +      ptr = string;
> +      while (*ptr != '\0')
> +	{
> +	  /* Figure out the length of this substring. */
> +	  sep_ptr = strchr(ptr, sep);
> +	  if (sep_ptr == NULL)
> +	    length = strlen(ptr);
> +	  else
> +	    length = sep_ptr - ptr;
> +
> +	  /* Make a copy to be copied by athdir__add_string. */
> +	  strncpy(value, ptr, length);
> +	  value[length] = '\0';
> +
> +	  if (athdir__add_string(list, value, 0))
> +	    {
> +	      free(value);
> +	      return -1;
> +	    }
> +
> +	  ptr += length;
> +	  if (*ptr == sep)
> +	    ptr++;
> +	}
> +
> +      free(value);
> +    }
> +
> +  return 0;
> +}
> 
> Copied: trunk/athena/lib/athdir/src/stringlist.h (from rev 25903, trunk/athena/lib/athdir/stringlist.h)
> ===================================================================
> --- trunk/athena/lib/athdir/src/stringlist.h	                        (rev 0)
> +++ trunk/athena/lib/athdir/src/stringlist.h	2013-04-09 21:07:01 UTC (rev 25905)
> @@ -0,0 +1,43 @@
> +/* $Id: stringlist.h,v 1.1 1998-03-17 03:44:04 cfields Exp $ */
> +
> +/* Copyright 1998 by the Massachusetts Institute of Technology.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + *   notice, this list of conditions and the following disclaimer.
> + *
> + * * 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.
> + *
> + * * Neither the name of the M.I.T 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 COPYRIGHT HOLDERS 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
> + * COPYRIGHT HOLDER 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.
> + */
> +
> +typedef struct {
> +  int alloced, length;
> +  char **strings;
> +} string_list;
> +
> +int athdir__add_string(string_list **list, char *string, int front);
> +int athdir__parse_string(string_list **list, char *string, char sep);
> +char **athdir__make_string_array(string_list **list);
> +void athdir__free_string_array(char **array);
> 



home help back first fref pref prev next nref lref last post