111 lines
2.9 KiB
Text
111 lines
2.9 KiB
Text
$NetBSD: patch-ac,v 1.1 2008/08/02 21:00:29 dholland Exp $
|
|
|
|
Fix misuses of va_list to allow building on amd64.
|
|
|
|
--- arg.c.orig 1999-08-31 12:49:19.000000000 -0400
|
|
+++ arg.c 2008-08-02 16:56:12.000000000 -0400
|
|
@@ -28,5 +28,6 @@
|
|
|
|
#include <stdarg.h>
|
|
+#include <stdint.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
@@ -65,7 +66,11 @@ int arg_warning = 1; /* print warnings
|
|
|
|
static Arg_form *regf; /* advancing form ptr used by arg_find_reg */
|
|
|
|
-va_list arg_doc_parse();
|
|
+struct va_holder {
|
|
+ va_list ap;
|
|
+};
|
|
+
|
|
+static void arg_doc_parse(Arg_form *, struct va_holder *);
|
|
int arg_format(Arg_form *f);
|
|
void arg_init(Arg_form *form);
|
|
int arg_done();
|
|
@@ -180,7 +185,7 @@ Arg_form *arg_to_form1(va_list ap)
|
|
}
|
|
for (; (s = va_arg(ap, char *)) != 0;) {
|
|
/* note that we continue (not break) in all cases except one */
|
|
- switch ((int)s) {
|
|
+ switch ((int)(intptr_t)s) {
|
|
case ARG_FLAGNEXT: /* ptr to flag vbl */
|
|
CHECKTYPE(form, "FLAG");
|
|
form->type = ARG_SIMPFLAG;
|
|
@@ -220,7 +225,12 @@ Arg_form *arg_to_form1(va_list ap)
|
|
form->doc = prevs = s;
|
|
|
|
/* skip over doc args */
|
|
- ap = arg_doc_parse(form, ap);
|
|
+ {
|
|
+ struct va_holder tmp;
|
|
+ va_copy(tmp.ap, ap);
|
|
+ arg_doc_parse(form, &tmp);
|
|
+ va_copy(ap, tmp.ap);
|
|
+ }
|
|
}
|
|
va_end(ap);
|
|
return rootform;
|
|
@@ -289,13 +299,13 @@ int arg_format(Arg_form *f)
|
|
* documentation string and returns the new ap.
|
|
*/
|
|
|
|
-va_list arg_doc_parse(Arg_form *f, va_list ap)
|
|
+static void arg_doc_parse(Arg_form *f, struct va_holder *app)
|
|
{
|
|
char *s, buf[256];
|
|
int size, gotparam;
|
|
va_list ap0;
|
|
|
|
- ap0 = ap;
|
|
+ va_copy(ap0, app->ap);
|
|
gotparam = 0;
|
|
for (s=f->doc; *s; s++) {
|
|
for (; *s; s++) /* search for next format code */
|
|
@@ -329,22 +339,22 @@ va_list arg_doc_parse(Arg_form *f, va_li
|
|
case 'o': case 'O':
|
|
case 'x': case 'X':
|
|
case 'c':
|
|
- if (size==2 || *s>='A' && *s<='Z') va_arg(ap, long);
|
|
- else va_arg(ap, int);
|
|
+ if (size==2 || *s>='A' && *s<='Z') va_arg(app->ap, long);
|
|
+ else va_arg(app->ap, int);
|
|
break;
|
|
case 'e':
|
|
case 'f':
|
|
case 'g':
|
|
/* note: float args are converted to doubles by MOST compilers*/
|
|
- va_arg(ap, double);
|
|
+ va_arg(app->ap, double);
|
|
break;
|
|
case 's':
|
|
- va_arg(ap, char *);
|
|
+ va_arg(app->ap, char *);
|
|
break;
|
|
default:
|
|
fprintf(stderr, "arg: unknown format code %%%c in %s\n",
|
|
*s, f->doc);
|
|
- va_arg(ap, int);
|
|
+ va_arg(app->ap, int);
|
|
break;
|
|
}
|
|
}
|
|
@@ -354,7 +364,7 @@ va_list arg_doc_parse(Arg_form *f, va_li
|
|
strcpy(f->doc, buf);
|
|
}
|
|
|
|
- return ap; /* varargs ptr past end of doc params */
|
|
+ /*return ap;*/ /* varargs ptr past end of doc params */
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
@@ -851,7 +861,7 @@ static void space(FILE *fp, int c, int c
|
|
putc('\n', fp);
|
|
c = 0;
|
|
}
|
|
- for (; c<c1&~7; c=(c+7)&~7) putc('\t', fp);
|
|
+ for (; c<(c1&~7); c=(c+7)&~7) putc('\t', fp);
|
|
for (; c<c1; c++) putc(' ', fp);
|
|
}
|
|
|