diff options
| author | espie <> | 2004-05-01 10:52:59 +0000 |
|---|---|---|
| committer | espie <> | 2004-05-01 10:52:59 +0000 |
| commit | 020a840ea33d9a0972e79af8e8d5b08fd704ff84 (patch) | |
| tree | 1f27d0d8245ae0d59ef8d9d1db9d52e15d4a17c1 /src/lib/libc/string | |
| parent | a4f10b37035e781770724661a37a45a83b65c25f (diff) | |
| download | openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.tar.gz openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.tar.bz2 openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.zip | |
let __strerror fill precisely the part of the buffer it can.
okay millert@
Diffstat (limited to 'src/lib/libc/string')
| -rw-r--r-- | src/lib/libc/string/__strerror.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/lib/libc/string/__strerror.c b/src/lib/libc/string/__strerror.c index ccb430247e..87b47b68e4 100644 --- a/src/lib/libc/string/__strerror.c +++ b/src/lib/libc/string/__strerror.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #if defined(LIBC_SCCS) && !defined(lint) | 30 | #if defined(LIBC_SCCS) && !defined(lint) |
| 31 | static char *rcsid = "$OpenBSD: __strerror.c,v 1.11 2004/04/30 17:13:02 espie Exp $"; | 31 | static char *rcsid = "$OpenBSD: __strerror.c,v 1.12 2004/05/01 10:52:59 espie Exp $"; |
| 32 | #endif /* LIBC_SCCS and not lint */ | 32 | #endif /* LIBC_SCCS and not lint */ |
| 33 | 33 | ||
| 34 | #ifdef NLS | 34 | #ifdef NLS |
| @@ -59,11 +59,10 @@ __digits10(unsigned int num) | |||
| 59 | return i; | 59 | return i; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static char * | 62 | void |
| 63 | __itoa(int num, char *buffer, size_t maxlen) | 63 | __itoa(int num, char *buffer, size_t start, size_t end) |
| 64 | { | 64 | { |
| 65 | char *p; | 65 | size_t pos; |
| 66 | size_t len; | ||
| 67 | unsigned int a; | 66 | unsigned int a; |
| 68 | int neg; | 67 | int neg; |
| 69 | 68 | ||
| @@ -76,22 +75,25 @@ __itoa(int num, char *buffer, size_t maxlen) | |||
| 76 | neg = 0; | 75 | neg = 0; |
| 77 | } | 76 | } |
| 78 | 77 | ||
| 79 | len = __digits10(a); | 78 | pos = start + __digits10(a); |
| 80 | if (neg) | 79 | if (neg) |
| 81 | len++; | 80 | pos++; |
| 82 | 81 | ||
| 83 | if (len >= maxlen) | 82 | if (pos < end) |
| 84 | return NULL; | 83 | buffer[pos] = '\0'; |
| 85 | 84 | else | |
| 86 | buffer[len--] = '\0'; | 85 | buffer[end-1] = '\0'; |
| 86 | pos--; | ||
| 87 | do { | 87 | do { |
| 88 | buffer[len--] = (a % 10) + '0'; | 88 | |
| 89 | if (pos < end) | ||
| 90 | buffer[pos] = (a % 10) + '0'; | ||
| 91 | pos--; | ||
| 89 | a /= 10; | 92 | a /= 10; |
| 90 | } while (a != 0); | 93 | } while (a != 0); |
| 91 | if (neg) | 94 | if (neg) |
| 92 | *buffer = '-'; | 95 | if (pos < end) |
| 93 | 96 | buffer[pos] = '-'; | |
| 94 | return buffer; | ||
| 95 | } | 97 | } |
| 96 | 98 | ||
| 97 | /* | 99 | /* |
| @@ -125,8 +127,7 @@ __strerror(int num, char *buf) | |||
| 125 | #else | 127 | #else |
| 126 | len = strlcpy(buf, UPREFIX, NL_TEXTMAX); | 128 | len = strlcpy(buf, UPREFIX, NL_TEXTMAX); |
| 127 | #endif | 129 | #endif |
| 128 | if (len < NL_TEXTMAX) | 130 | __itoa(num, buf, len, NL_TEXTMAX); |
| 129 | __itoa(num, buf + len, NL_TEXTMAX - len); | ||
| 130 | errno = EINVAL; | 131 | errno = EINVAL; |
| 131 | } | 132 | } |
| 132 | 133 | ||
