File: variadic.c

package info (click to toggle)
libffi-platypus-perl 2.10-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,860 kB
  • sloc: perl: 7,388; ansic: 6,862; cpp: 53; sh: 19; makefile: 14
file content (73 lines) | stat: -rw-r--r-- 1,109 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <ffi_platypus.h>
#ifdef FFI_PL_PROBE_VARIADIC
#include <stdio.h>
#include <stdarg.h>
#include "libtest.h"

EXTERN int
variadic_return_arg(int which, ...)
{
  va_list ap;
  int i, val;

  va_start(ap, which);

  for(i=0; i<which; i++)
  {
    val = va_arg(ap, int);
  }

  va_end(ap);

  return val;
}

EXTERN const char *
xprintf(const char *fmt, ...)
{
  va_list ap;
  static char buffer[2046];
  char *bp=buffer;

  va_start(ap, fmt);

  while(*fmt != '\0')
  {
    switch(*fmt)
    {
      case '%':
        {
          char buffer2[64];
          const char *str=buffer2;
          switch(*(++fmt))
          {
            case 'd':
              sprintf(buffer2, "%d", va_arg(ap, int));
              break;
            case 's':
              str = va_arg(ap, char *);
              break;
            default:
              str = "[fmt error]";
              break;
          }
          strcpy(bp, str);
          bp += strlen(str);
        }
        break;

      default:
        *(bp++) = *fmt;
        break;
    }
    fmt++;
  }

  va_end(ap);

  *bp = '\0';

  return buffer;
}

#endif