Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
f4c730d3
Commit
f4c730d3
authored
Dec 26, 1990
by
Richard M. Stallman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*** empty log message ***
parent
7942b8ae
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
52 additions
and
4 deletions
+52
-4
src/doprnt.c
src/doprnt.c
+52
-4
No files found.
src/doprnt.c
View file @
f4c730d3
...
...
@@ -23,6 +23,14 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <ctype.h>
/* Generate output from a format-spec FORMAT,
terminated at position FORMAT_END.
Output goes in BUFFER, which has room for BUFSIZE chars.
If the output does not fit, truncate it to fit.
Returns the number of characters stored into BUFFER.
ARGS points to the vector of arguments, and NARGS says how many.
A double counts as two arguments. */
doprnt
(
buffer
,
bufsize
,
format
,
format_end
,
nargs
,
args
)
char
*
buffer
;
register
int
bufsize
;
...
...
@@ -34,7 +42,14 @@ doprnt (buffer, bufsize, format, format_end, nargs, args)
int
cnt
=
0
;
/* Number of arg to gobble next */
register
char
*
fmt
=
format
;
/* Pointer into format string */
register
char
*
bufptr
=
buffer
;
/* Pointer into output buffer.. */
char
tembuf
[
512
];
/* Use this for sprintf unless we need something really big. */
char
tembuf
[
100
];
/* Size of sprintf_buffer. */
int
size_allocated
=
100
;
/* Buffer to use for sprintf. Either tembuf or same as BIG_BUFFER. */
char
*
sprintf_buffer
=
tembuf
;
/* Buffer we have got with malloc. */
char
*
big_buffer
=
0
;
register
int
tem
;
char
*
string
;
char
fmtcpy
[
20
];
...
...
@@ -50,6 +65,8 @@ doprnt (buffer, bufsize, format, format_end, nargs, args)
{
if
(
*
fmt
==
'%'
)
/* Check for a '%' character */
{
int
size_bound
;
fmt
++
;
/* Copy this one %-spec into fmtcopy. */
string
=
fmtcpy
;
...
...
@@ -62,6 +79,18 @@ doprnt (buffer, bufsize, format, format_end, nargs, args)
fmt
++
;
}
*
string
=
0
;
/* Get an idea of how much space we might need. */
size_bound
=
atoi
(
&
fmtcpy
[
1
])
+
50
;
/* Make sure we have that much. */
if
(
size_bound
>
size_allocated
)
{
if
(
big_buffer
)
big_buffer
=
(
char
*
)
xrealloc
(
big_buffer
,
size_bound
);
else
big_buffer
=
(
char
*
)
xmalloc
(
size_bound
);
sprintf_buffer
=
big_buffer
;
size_allocated
=
size_bound
;
}
minlen
=
0
;
switch
(
*
fmt
++
)
{
...
...
@@ -74,11 +103,26 @@ doprnt (buffer, bufsize, format, format_end, nargs, args)
case
'x'
:
if
(
cnt
==
nargs
)
error
(
"Format string wants too many arguments"
);
sprintf
(
tembuf
,
fmtcpy
,
args
[
cnt
++
]);
/* Now copy
tembuf
into final output, truncating as nec. */
string
=
tembuf
;
sprintf
(
sprintf_buffer
,
fmtcpy
,
args
[
cnt
++
]);
/* Now copy into final output, truncating as nec. */
string
=
sprintf_buffer
;
goto
doit
;
case
'f'
:
case
'e'
:
case
'g'
:
{
union
{
double
d
;
char
*
half
[
2
];
}
u
;
if
(
cnt
+
1
==
nargs
)
error
(
"Format string wants too many arguments"
);
u
.
half
[
0
]
=
args
[
cnt
++
];
u
.
half
[
1
]
=
args
[
cnt
++
];
sprintf
(
sprintf_buffer
,
fmtcpy
,
u
.
d
);
/* Now copy into final output, truncating as nec. */
string
=
sprintf_buffer
;
goto
doit
;
}
case
'S'
:
string
[
-
1
]
=
's'
;
case
's'
:
...
...
@@ -132,6 +176,10 @@ doprnt (buffer, bufsize, format, format_end, nargs, args)
bufsize
--
;
};
/* If we had to malloc something, free it. */
if
(
big_buffer
)
free
(
big_buffer
);
*
bufptr
=
0
;
/* Make sure our string end with a '\0' */
return
bufptr
-
buffer
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment