diff options
| -rw-r--r-- | gpgme/ChangeLog | 5 | ||||
| -rw-r--r-- | gpgme/fopencookie.c | 37 | ||||
| -rw-r--r-- | gpgme/util.h | 23 | ||||
| -rw-r--r-- | gpgme/vasprintf.c | 155 | 
4 files changed, 219 insertions, 1 deletions
| diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index ccfa4c42..ff076263 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,8 @@ +2002-02-13  Werner Koch  <[email protected]> + +	* vasprintf.c, fopencookie.c: Add replacement functions. +	* util.h: Add prototypes for them. +  2002-02-09  Marcus Brinkmann  <[email protected]>  	* engine-gpgsm.c (gpgsm_assuan_simple_command): Return 0 if we diff --git a/gpgme/fopencookie.c b/gpgme/fopencookie.c new file mode 100644 index 00000000..7862b9a0 --- /dev/null +++ b/gpgme/fopencookie.c @@ -0,0 +1,37 @@ +/* fopencookie.c - Dummy glibc replacement + * Copyright (C) 2002 Free Software Foundation, Inc. + * + * This file is part of GnuPG. + * + * GnuPG 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 of the License, or + * (at your option) any later version. + * + * GnuPG 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdio.h> +#include <errno.h> + +#include "util.h" + +FILE *  +fopencookie (void *cookie, const char *opentype, +             cookie_io_functions_t funclist) +{ +  errno = ENOSYS; +  return NULL; +} + + diff --git a/gpgme/util.h b/gpgme/util.h index 029a8463..045c8bfe 100644 --- a/gpgme/util.h +++ b/gpgme/util.h @@ -125,8 +125,29 @@ char *stpcpy (char *a, const char *b);  const char *_gpgme_get_gpg_path (void);  const char *_gpgme_get_gpgsm_path (void); -#endif /* UTIL_H */ +/*-- replacement functions in <funcname>.c --*/ +#ifdef HAVE_CONFIG_H +#if !HAVE_VASPRINTF +#include <stdarg.h> +int vasprintf (char **result, const char *format, va_list *args); +int asprintf (char **result, const char *format, ...); +#endif +#if !HAVE_FOPENCOOKIE +typedef struct +{ +  ssize_t (*read)(void*,char*,size_t); +  ssize_t (*write)(void*,const char*,size_t); +  int (*seek)(void*,off_t*,int); +  int (*close)(coid*); +} _IO_cookie_io_functions_t; +typedef _IO_cookie_io_functions_t cookie_io_functions_t; +FILE *fopencookie (void *cookie, const char *opentype, +                   cookie_io_functions_t funclist); +#endif /*!HAVE_FOPENCOOKIE*/ +#endif /*HAVE_CONFIG_H*/ + +#endif /* UTIL_H */ diff --git a/gpgme/vasprintf.c b/gpgme/vasprintf.c new file mode 100644 index 00000000..dbef4eb0 --- /dev/null +++ b/gpgme/vasprintf.c @@ -0,0 +1,155 @@ +/* Like vsprintf but provides a pointer to malloc'd storage, which must +   be freed by the caller. +   Copyright (C) 1994, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB.  If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA.  */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stdarg.h> + +#ifdef TEST +int global_total_width; +#endif + +int +vasprintf (char **result, const char *format, va_list *args) +{ +  const char *p = format; +  /* Add one to make sure that it is never zero, which might cause malloc +     to return NULL.  */ +  int total_width = strlen (format) + 1; +  va_list ap; + +  /* FIXME: use va_copy() */ +  memcpy (&ap, args, sizeof (va_list)); + +  while (*p != '\0') +    { +      if (*p++ == '%') +	{ +	  while (strchr ("-+ #0", *p)) +	    ++p; +	  if (*p == '*') +	    { +	      ++p; +	      total_width += abs (va_arg (ap, int)); +	    } +	  else +	    total_width += strtoul (p, (char**)&p, 10); +	  if (*p == '.') +	    { +	      ++p; +	      if (*p == '*') +		{ +		  ++p; +		  total_width += abs (va_arg (ap, int)); +		} +	      else +	      total_width += strtoul (p, (char**)&p, 10); +	    } +	  while (strchr ("hlL", *p)) +	    ++p; +	  /* Should be big enough for any format specifier except %s and floats.  */ +	  total_width += 30; +	  switch (*p) +	    { +	    case 'd': +	    case 'i': +	    case 'o': +	    case 'u': +	    case 'x': +	    case 'X': +	    case 'c': +	      (void) va_arg (ap, int); +	      break; +	    case 'f': +	    case 'e': +	    case 'E': +	    case 'g': +	    case 'G': +	      (void) va_arg (ap, double); +	      /* Since an ieee double can have an exponent of 307, we'll +		 make the buffer wide enough to cover the gross case. */ +	      total_width += 307; +	      break; +	    case 's': +	      total_width += strlen (va_arg (ap, char *)); +	      break; +	    case 'p': +	    case 'n': +	      (void) va_arg (ap, char *); +	      break; +	    } +	} +    } +#ifdef TEST +  global_total_width = total_width; +#endif +  *result = malloc (total_width); +  if (*result != NULL) +    return vsprintf (*result, format, *args); +  else +    return 0; +} + + +int +asprintf (char **buf, const char *fmt, ...) +{ +  int status; +  va_list ap; + +  va_start (ap, fmt); +  status = vasprintf (buf, fmt, ap); +  va_end (ap); +  return status; +} + + +#ifdef TEST +void +checkit (const char* format, ...) +{ +  va_list args; +  char *result; + +  va_start (args, format); +  vasprintf (&result, format, args); +  if (strlen (result) < global_total_width) +    printf ("PASS: "); +  else +    printf ("FAIL: "); +  printf ("%d %s\n", global_total_width, result); +} + +int +main (void) +{ +  checkit ("%d", 0x12345678); +  checkit ("%200d", 5); +  checkit ("%.300d", 6); +  checkit ("%100.150d", 7); +  checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333"); +  checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); +} +#endif /* TEST */ | 
