Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
John McEleney
/
mailutils
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit
2f13ebfe
...
2f13ebfeddc73927f65ea8477049b4160d69101d
authored
2001-04-14 20:16:22 +0000
by
Alain Magloire
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Replace for loosing platforms.
1 parent
fdd1855d
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
193 additions
and
0 deletions
lib/vasprintf.c
lib/vasprintf.c
0 → 100644
View file @
2f13ebf
/* Like vsprintf but provides a pointer to malloc'd storage, which must
be freed by the caller.
Copyright (C) 1994 Free Software Foundation, Inc.
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; 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>
#if __STDC__
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#ifdef TEST
int
global_total_width
;
#endif
unsigned
long
strtoul
();
char
*
malloc
();
static
int
int_vasprintf
(
result
,
format
,
args
)
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
;
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
,
&
p
,
10
);
if
(
*
p
==
'.'
)
{
++
p
;
if
(
*
p
==
'*'
)
{
++
p
;
total_width
+=
abs
(
va_arg
(
ap
,
int
));
}
else
total_width
+=
strtoul
(
p
,
&
p
,
10
);
}
while
(
strchr
(
"hlL"
,
*
p
))
++
p
;
/* Should be big enough for any format specifier except %s. */
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
);
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
vasprintf
(
result
,
format
,
args
)
char
**
result
;
const
char
*
format
;
va_list
args
;
{
return
int_vasprintf
(
result
,
format
,
&
args
);
}
int
asprintf
#if __STDC__
(
char
**
result
,
const
char
*
format
,
...)
#else
(
result
,
va_alist
)
char
**
result
;
va_dcl
#endif
{
va_list
args
;
int
done
;
#if __STDC__
va_start
(
args
,
format
);
#else
char
*
format
;
va_start
(
args
);
format
=
va_arg
(
args
,
char
*
);
#endif
done
=
vasprintf
(
result
,
format
,
args
);
va_end
(
args
);
return
done
;
}
#ifdef TEST
void
checkit
#if __STDC__
(
const
char
*
format
,
...)
#else
(
va_alist
)
va_dcl
#endif
{
va_list
args
;
char
*
result
;
#if __STDC__
va_start
(
args
,
format
);
#else
char
*
format
;
va_start
(
args
);
format
=
va_arg
(
args
,
char
*
);
#endif
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
()
{
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 */
Please
register
or
sign in
to post a comment