Logo Search packages:      
Sourcecode: icecast-server version File versions  Download package

vsnprintf.c

/* Copyright (c) 1993
 *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
 *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
 * Copyright (c) 1987 Oliver Laumann
 *
 * 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 (see the file COPYING); if not, write to the
 * Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
 *
 ****************************************************************
 */


/* Implementation of vsnprintf() for systems that don't have it
 * (e.g. Solaris 2.5).  This hasn't been tested much in the context of
 * Mailman; it was ripped from screen 3.7.6's misc.c file which contains
 * the above copyright.
 *
 * This code has been modified slightly:
 *
 * - use prototypes unconditionally
 * - Don't use macros for stdargs calls
 * - Reformat to Python C standard
 *
 * RMS says it's okay to include this code in Mailman but it should be kept
 * in a separate file.
 *
 * TBD: This file needs a security audit.
 */
#include <config.h>

#ifndef HAVE_VSNPRINTF
#include <strings.h>
#include <stdarg.h>

int vsnprintf(char* s, int n, char* fmt, va_list stack)
{
      char *f, *sf = 0;
      int i, on, argl = 0;
      char myf[10], buf[20];
      char *arg, *myfp;

      on = n;
      f = fmt;
      arg = 0;
      while (arg || (sf = index(f, '%')) || (sf = f + strlen(f))) {
            if (arg == 0) {
                  arg = f;
                  argl = sf - f;
            }
            if (argl) {
                  i = argl > n - 1 ? n - 1 : argl;
                  strncpy(s, arg, i);
                  s += i;
                  n -= i;
                  if (i < argl) {
                        *s = 0;
                        return on;
                  }
            }
            arg = 0;
            if (sf == 0)
                  continue;
            f = sf;
            sf = 0;
            if (!*f)
                  break;
            myfp = myf;
            *myfp++ = *f++;
            while (((*f >= '0' && *f <='9') || *f == '#')
                   && myfp - myf < 8)
            {
                  *myfp++ = *f++;
            }
            *myfp++ = *f;
            *myfp = 0;
            if (!*f++)
                  break;
            switch(f[-1])
            {
            case '%':
                  arg = "%";
                  break;
            case 'c':
            case 'o':
            case 'd':
            case 'x':
                  i = va_arg(stack, int);
                  snprintf(buf, 20, myf, i);
                  arg = buf;
                  break;
            case 's':
                  arg = va_arg(stack, char *);
                  if (arg == 0)
                        arg = "NULL";
                  break;
            default:
                  arg = "";
                  break;
            }
            argl = strlen(arg);
      }
      *s = 0;
      return on - n;

      va_end(stack);
}
#endif /* !HAVE_VSNPRINTF */


/*
 * Local Variables:
 * c-file-style: "python"
 * End:
 */

Generated by  Doxygen 1.6.0   Back to index