change length or size specifiers in APIs from int to long

add array API (http://cr.yp.to/lib/array.html)
master
leitner 22 years ago
parent d1df715971
commit 5226dd010d

@ -1,6 +1,7 @@
0.16: 0.16:
add buffer_fromsa (make buffer from stralloc) add buffer_fromsa (make buffer from stralloc)
add API for integer multiply with overflow detection add API for integer multiply with overflow detection
change length counters from int to long for 64-bit platforms
0.15: 0.15:
man page update (document stralloc return values) man page update (document stralloc return values)

@ -6,25 +6,26 @@
typedef struct { typedef struct {
char* p; char* p;
int64 allocated, initialized; /* in bytes */ int64 allocated; /* in bytes */
uint64 initialized; /* in bytes */
/* p and allocated nonzero: array is allocated */ /* p and allocated nonzero: array is allocated */
/* p zero: array is unallocated */ /* p and allocated zero: array is unallocated */
/* allocated < 0: array is failed */ /* p zero and allocated < 0: array is failed */
} array; } array;
void* array_allocate(array* x,int64 membersize,int64 pos); void* array_allocate(array* x,uint64 membersize,int64 pos);
void* array_get(array* x,int64 membersize,int64 pos); void* array_get(array* x,uint64 membersize,int64 pos);
void* array_start(const array* const x); void* array_start(const array* const x);
int64 array_length(const array* const x,int64 membersize); int64 array_length(const array* const x,uint64 membersize);
int64 array_bytes(const array* const x); int64 array_bytes(const array* const x);
void array_truncate(array* x,int64 membersize,int64 len); void array_truncate(array* x,uint64 membersize,int64 len);
void array_trunc(array* x); void array_trunc(array* x);
void array_reset(array* x); void array_reset(array* x);
void array_fail(array* x); void array_fail(array* x);
int array_equal(const array* const x,const array* const y); int array_equal(const array* const x,const array* const y);
void array_cat(array* to,const array* const from); void array_cat(array* to,const array* const from);
void array_catb(array* to,const char* from,int64 len); void array_catb(array* to,const char* from,uint64 len);
void array_cats(array* to,const char* from); void array_cats(array* to,const char* from);
void array_cats0(array* to,const char* from); void array_cats0(array* to,const char* from);
void array_cat0(array* to); void array_cat0(array* to);

@ -1,4 +1,14 @@
#ifdef __dietlibc__
#include <sys/cdefs.h>
#else
#define __likely(x) x
#define __unlikely(x) x
#endif
#include <sys/types.h>
#include <stdlib.h>
#include "safemult.h"
#include "array.h" #include "array.h"
#include "byte.h"
#if 0 #if 0
static array x; static array x;
@ -39,13 +49,32 @@
that, use array_fail. that, use array_fail.
#endif #endif
void* array_allocate(array* x,int64 membersize,int64 pos) { void* array_allocate(array* x,uint64 membersize,int64 pos) {
int64 wanted; uint64 wanted;
if (membersize<128) if (__unlikely(x->allocated<0)) return 0; /* array is failed */
wanted=(pos+127)&(-128ll); /* round up to multiple of 128 */ if (__unlikely(pos+1<1)) return 0;
/* second case of overflow: pos*membersize too large */
if (__unlikely(umult64(membersize,pos+1,&wanted))) return 0;
if (__unlikely(wanted > x->allocated)) {
/* round up a little */
if (membersize<8)
wanted=(wanted+127)&(-128ll); /* round up to multiple of 128 */
else else
wanted=(pos+4095)&(-4096ll); /* round up to 4k pages */ wanted=(wanted+4095)&(-4096ll); /* round up to 4k pages */
/* detect numeric overflow */
if (wanted<0) return 0; if (__unlikely(wanted<128)) return 0; /* overflow during rounding */
wanted=membersize*(pos+1);
if (sizeof(size_t) != sizeof(int64) && __unlikely((size_t)(wanted) != wanted))
return 0;
{
char* tmp=realloc(x->p,wanted);
if (__unlikely(!tmp)) return 0;
x->p=tmp;
}
x->allocated=wanted;
byte_zero(x->p+x->initialized,x->allocated-x->initialized);
}
x->initialized=pos*membersize;
return x->p+pos*membersize;
} }

@ -0,0 +1,6 @@
#include "array.h"
int64 array_bytes(const array* const x) {
if (x->allocated<0) return -1;
return x->initialized;
}

@ -0,0 +1,10 @@
#include "array.h"
#include "byte.h"
void array_cat(array* to,const array* const from) {
if (from->allocated<0) {
array_fail(to);
return;
}
return array_catb(to,from->p,from->initialized);
}

@ -0,0 +1,6 @@
#include "array.h"
void array_cat0(array* to) {
static char zero;
array_catb(to,&zero,1);
}

@ -0,0 +1,16 @@
#include "array.h"
#include "byte.h"
void array_catb(array* to,const char* from,uint64 len) {
long l;
if (to->allocated<0) return;
if (to->initialized+len<to->initialized) {
fail:
array_fail(to);
return;
}
l=to->initialized;
if (!array_allocate(to,1,to->initialized+len))
goto fail;
byte_copy(to->p+l,to->initialized-l,from);
}

@ -0,0 +1,9 @@
#include "array.h"
void array_cate(array* to,const array* const from,int64 pos,int64 stop) {
if (pos<0 || stop<pos) {
array_fail(to);
return;
}
array_catb(to,from->p+pos,stop-pos);
}

@ -0,0 +1,6 @@
#include "array.h"
#include "str.h"
void array_cats(array* to,const char* from) {
array_catb(to,from,strlen(from));
}

@ -0,0 +1,6 @@
#include "array.h"
#include "str.h"
void array_cats0(array* to,const char* from) {
array_catb(to,from,strlen(from)+1);
}

@ -0,0 +1,7 @@
#include "byte.h"
#include "array.h"
int array_equal(const array* const x,const array* const y) {
if (x->initialized!=y->initialized) return 0;
return byte_equal(x->p,x->initialized,y->p);
}

@ -0,0 +1,9 @@
#include <stdlib.h>
#include "array.h"
void array_fail(array* x) {
if (x->p) free(x->p);
x->p=0;
x->initialized=0;
x->allocated=-1;
}

@ -0,0 +1,30 @@
#ifdef __dietlibc__
#include <sys/cdefs.h>
#else
#define __likely(x) x
#define __unlikely(x) x
#endif
#include "safemult.h"
#include "array.h"
#if 0
static array x;
t *p;
int64 pos;
p = array_get(&x,sizeof(t),pos);
array_get is similar to array_allocate, but it does not allocate any
extra bytes, and it does not initialize any extra bytes. It
returns 0 if x is unallocated, for example, or if fewer than
(pos+1)*sizeof(t) bytes are initialized.
#endif
void* array_get(array* x,uint64 membersize,int64 pos) {
uint64 wanted;
if (__unlikely(pos+1<1)) return 0;
if (__unlikely(umult64(membersize,pos,&wanted))) return 0;
if (__unlikely(wanted > x->allocated)) return 0;
return x->p+pos*membersize;
}

@ -0,0 +1,6 @@
#include "array.h"
int64 array_length(const array* const x,uint64 membersize) {
if (x->allocated<0) return -1;
return x->initialized/membersize;
}

@ -0,0 +1,8 @@
#include <stdlib.h>
#include "array.h"
void array_reset(array* x) {
if (x->p) free(x->p);
x->p=0;
x->allocated=x->initialized=0;
}

@ -0,0 +1,5 @@
#include "array.h"
void* array_start(const array* const x) {
return x->p;
}

@ -0,0 +1,5 @@
#include "array.h"
void array_trunc(array* x) {
x->initialized=0;
}

@ -0,0 +1,17 @@
#ifdef __dietlibc__
#include <sys/cdefs.h>
#else
#define __likely(x) x
#define __unlikely(x) x
#endif
#include "safemult.h"
#include "array.h"
/* I'm not sure I understand what this function is good for */
void array_truncate(array* x,uint64 membersize,int64 len) {
uint64 wanted;
if (__unlikely(len<0)) return;
if (__unlikely(umult64(membersize,len,&wanted))) return;
if (__unlikely(wanted > x->initialized)) return;
x->initialized=wanted;
}

@ -11,29 +11,29 @@
/* byte_chr returns the smallest integer i between 0 and len-1 /* byte_chr returns the smallest integer i between 0 and len-1
* inclusive such that one[i] equals needle, or len if not found. */ * inclusive such that one[i] equals needle, or len if not found. */
unsigned int byte_chr(const void* haystack, unsigned int len, char needle) __pure__; unsigned long byte_chr(const void* haystack, unsigned long len, char needle) __pure__;
/* byte_rchr returns the largest integer i between 0 and len-1 inclusive /* byte_rchr returns the largest integer i between 0 and len-1 inclusive
* such that one[i] equals needle, or len if not found. */ * such that one[i] equals needle, or len if not found. */
unsigned int byte_rchr(const void* haystack,unsigned int len,char needle) __pure__; unsigned long byte_rchr(const void* haystack,unsigned long len,char needle) __pure__;
/* byte_copy copies in[0] to out[0], in[1] to out[1], ... and in[len-1] /* byte_copy copies in[0] to out[0], in[1] to out[1], ... and in[len-1]
* to out[len-1]. */ * to out[len-1]. */
void byte_copy(void* out, unsigned int len, const void* in); void byte_copy(void* out, unsigned long len, const void* in);
/* byte_copyr copies in[len-1] to out[len-1], in[len-2] to out[len-2], /* byte_copyr copies in[len-1] to out[len-1], in[len-2] to out[len-2],
* ... and in[0] to out[0] */ * ... and in[0] to out[0] */
void byte_copyr(void* out, unsigned int len, const void* in); void byte_copyr(void* out, unsigned long len, const void* in);
/* byte_diff returns negative, 0, or positive, depending on whether the /* byte_diff returns negative, 0, or positive, depending on whether the
* string a[0], a[1], ..., a[len-1] is lexicographically smaller * string a[0], a[1], ..., a[len-1] is lexicographically smaller
* than, equal to, or greater than the string b[0], b[1], ..., * than, equal to, or greater than the string b[0], b[1], ...,
* b[len-1]. When the strings are different, byte_diff does not read * b[len-1]. When the strings are different, byte_diff does not read
* bytes past the first difference. */ * bytes past the first difference. */
int byte_diff(const void* a, unsigned int len, const void* b) __pure__; int byte_diff(const void* a, unsigned long len, const void* b) __pure__;
/* byte_zero sets the bytes out[0], out[1], ..., out[len-1] to 0 */ /* byte_zero sets the bytes out[0], out[1], ..., out[len-1] to 0 */
void byte_zero(void* out, unsigned len); void byte_zero(void* out, unsigned long len);
#define byte_equal(s,n,t) (!byte_diff((s),(n),(t))) #define byte_equal(s,n,t) (!byte_diff((s),(n),(t)))

@ -4,7 +4,7 @@ byte_chr \- search for a byte in a string
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
int \fBbyte_chr\fP(const char *\fIhaystack\fR,unsigned int \fIlen\fR,char \fIneedle\fR); long \fBbyte_chr\fP(const char *\fIhaystack\fR,unsigned long \fIlen\fR,char \fIneedle\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_chr\fR returns the smallest integer \fIi\fR between 0 and \fIbyte_chr\fR returns the smallest integer \fIi\fR between 0 and
\fIlen\fR-1 inclusive such that \fIone\fR[\fIi\fR] equals \fIneedle\fR. \fIlen\fR-1 inclusive such that \fIone\fR[\fIi\fR] equals \fIneedle\fR.

@ -2,7 +2,7 @@
/* byte_chr returns the smallest integer i between 0 and len-1 /* byte_chr returns the smallest integer i between 0 and len-1
* inclusive such that one[i] equals needle, or len it not found. */ * inclusive such that one[i] equals needle, or len it not found. */
unsigned int byte_chr(const void* haystack, unsigned int len, char needle) { unsigned long byte_chr(const void* haystack, unsigned long len, char needle) {
register char c=needle; register char c=needle;
register const char* s=haystack; register const char* s=haystack;
register const char* t=s+len; register const char* t=s+len;

@ -4,7 +4,7 @@ byte_copy \- copy a string
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
void \fBbyte_copy\fP(char *\fIout\fR,unsigned int \fIlen\fR,const char *\fIin\fR); void \fBbyte_copy\fP(char *\fIout\fR,unsigned long \fIlen\fR,const char *\fIin\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_copy\fR copies \fIin\fR[0] to \fIout\fR[0], \fIin\fR[1] to \fIbyte_copy\fR copies \fIin\fR[0] to \fIout\fR[0], \fIin\fR[1] to
\fIout\fR[1], etc., and finally \fIin\fR[\fIlen\fR-1] to \fIout\fR[1], etc., and finally \fIin\fR[\fIlen\fR-1] to

@ -2,7 +2,7 @@
/* byte_copy copies in[0] to out[0], in[1] to out[1], ... and in[len-1] /* byte_copy copies in[0] to out[0], in[1] to out[1], ... and in[len-1]
* to out[len-1]. */ * to out[len-1]. */
void byte_copy(void* out, unsigned int len, const void* in) { void byte_copy(void* out, unsigned long len, const void* in) {
register char* s=out; register char* s=out;
register const char* t=in; register const char* t=in;
register const char* u=t+len; register const char* u=t+len;

@ -4,7 +4,7 @@ byte_copyr \- copy a string
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
void \fBbyte_copyr\fP(char *\fIout\fR,unsigned int \fIlen\fR,const char *\fIin\fR); void \fBbyte_copyr\fP(char *\fIout\fR,unsigned long \fIlen\fR,const char *\fIin\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_copyr\fR copies \fIin\fR[\fIlen\fR-1] to \fIout\fR[\fIlen\fR-1], \fIbyte_copyr\fR copies \fIin\fR[\fIlen\fR-1] to \fIout\fR[\fIlen\fR-1],
\fIin\fR[\fIlen\fR-2] to \fIout\fR[\fIlen\fR-2], etc., and \fIin\fR[\fIlen\fR-2] to \fIout\fR[\fIlen\fR-2], etc., and

@ -2,7 +2,7 @@
/* byte_copyr copies in[len-1] to out[len-1], in[len-2] to out[len-2], /* byte_copyr copies in[len-1] to out[len-1], in[len-2] to out[len-2],
* ... and in[0] to out[0] */ * ... and in[0] to out[0] */
void byte_copyr(void* out, unsigned int len, const void* in) { void byte_copyr(void* out, unsigned long len, const void* in) {
register char* s=(char*)out+len; register char* s=(char*)out+len;
register const char* t=in; register const char* t=in;
register const char* u=t+len; register const char* u=t+len;

@ -4,7 +4,7 @@ byte_diff \- compare two strings
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
int \fBbyte_diff\fP(const char *\fIone\fR,unsigned int \fIlen\fR,const char *\fItwo\fR); int \fBbyte_diff\fP(const char *\fIone\fR,unsigned long \fIlen\fR,const char *\fItwo\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_diff\fR returns negative, 0, or positive, depending on whether \fIbyte_diff\fR returns negative, 0, or positive, depending on whether
the string \fIone\fR[0], \fIone\fR[1], ..., \fIone\fR[\fIlen\fR-1] is the string \fIone\fR[0], \fIone\fR[1], ..., \fIone\fR[\fIlen\fR-1] is

@ -5,7 +5,7 @@
* than, equal to, or greater than the string one[0], one[1], ..., * than, equal to, or greater than the string one[0], one[1], ...,
* one[len-1]. When the strings are different, byte_diff does not read * one[len-1]. When the strings are different, byte_diff does not read
* bytes past the first difference. */ * bytes past the first difference. */
int byte_diff(const void* a, unsigned int len, const void* b) { int byte_diff(const void* a, unsigned long len, const void* b) {
register const char* s=a; register const char* s=a;
register const char* t=b; register const char* t=b;
register const char* u=t+len; register const char* u=t+len;

@ -4,7 +4,7 @@ byte_equal \- compare two strings
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
int \fBbyte_equal\fP(const char *\fIone\fR,unsigned int \fIlen\fR,const char *\fItwo\fR); int \fBbyte_equal\fP(const char *\fIone\fR,unsigned long \fIlen\fR,const char *\fItwo\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_equal\fR returns 1 if the strings are equal, 0 otherwise. \fIbyte_equal\fR returns 1 if the strings are equal, 0 otherwise.

@ -4,7 +4,7 @@ byte_rchr \- search for a byte in a string
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
int \fBbyte_rchr\fP(const char *\fIhaystack\fR,unsigned int \fIlen\fR,char \fIneedle\fR); long \fBbyte_rchr\fP(const char *\fIhaystack\fR,unsigned long \fIlen\fR,char \fIneedle\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_chr\fR returns the largest integer \fIi\fR between 0 and \fIbyte_chr\fR returns the largest integer \fIi\fR between 0 and
\fIlen\fR-1 inclusive such that \fIone\fR[\fIi\fR] equals \fIneedle\fR. \fIlen\fR-1 inclusive such that \fIone\fR[\fIi\fR] equals \fIneedle\fR.

@ -2,7 +2,7 @@
/* byte_rchr returns the largest integer i between 0 and len-1 inclusive /* byte_rchr returns the largest integer i between 0 and len-1 inclusive
* such that one[i] equals needle, or len if not found. */ * such that one[i] equals needle, or len if not found. */
unsigned int byte_rchr(const void* haystack,unsigned int len,char needle) { unsigned long byte_rchr(const void* haystack,unsigned long len,char needle) {
register char c=needle; register char c=needle;
register const char* s=haystack; register const char* s=haystack;
register const char* t=s+len; register const char* t=s+len;

@ -4,7 +4,7 @@ byte_zero \- initialize a string
.SH SYNTAX .SH SYNTAX
.B #include <byte.h> .B #include <byte.h>
void \fBbyte_zero\fP(char *\fIout\fR,unsigned int \fIlen\fR); void \fBbyte_zero\fP(char *\fIout\fR,unsigned long \fIlen\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fIbyte_zero\fR sets \fIout\fR[0], \fIout\fR[1], ..., \fIbyte_zero\fR sets \fIout\fR[0], \fIout\fR[1], ...,
\fIout\fR[\fIlen\fR-1] to 0. \fIout\fR[\fIlen\fR-1] to 0.

@ -1,7 +1,7 @@
#include "byte.h" #include "byte.h"
/* byte_zero sets the bytes out[0], out[1], ..., out[len-1] to 0 */ /* byte_zero sets the bytes out[0], out[1], ..., out[len-1] to 0 */
void byte_zero(void* out, unsigned len) { void byte_zero(void* out, unsigned long len) {
register char* s=out; register char* s=out;
register const char* t=s+len; register const char* t=s+len;
for (;;) { for (;;) {

@ -4,12 +4,12 @@
/* turn upper case letters to lower case letters, ASCIIZ */ /* turn upper case letters to lower case letters, ASCIIZ */
extern void case_lowers(char *s); extern void case_lowers(char *s);
/* turn upper case letters to lower case letters, binary */ /* turn upper case letters to lower case letters, binary */
extern void case_lowerb(char *buf,unsigned int len); extern void case_lowerb(char *buf,unsigned long len);
/* like str_diff, ignoring case */ /* like str_diff, ignoring case */
extern int case_diffs(const char *,const char *); extern int case_diffs(const char *,const char *);
/* like byte_diff, ignoring case */ /* like byte_diff, ignoring case */
extern int case_diffb(const char *,unsigned int,const char *); extern int case_diffb(const char *,unsigned long,const char *);
/* like str_start, ignoring case */ /* like str_start, ignoring case */
extern int case_starts(const char *,const char *); extern int case_starts(const char *,const char *);

@ -4,7 +4,7 @@ case_diffb \- compare strings case-insensitively
.SH SYNTAX .SH SYNTAX
.B #include <case.h> .B #include <case.h>
int \fBcase_diffb\fP(const char* \fIa\fR,const char* \fIb\fR); int \fBcase_diffb\fP(const char* \fIa\fR,unsigned long \fIlen\fR,const char* \fIb\fR);
.SH DESCRIPTION .SH DESCRIPTION
case_diffb is similar to byte_diff. The difference is that for the case_diffb is similar to byte_diff. The difference is that for the
comparison 'A' == 'a', 'B' == 'b', ..., 'Z' == 'z'. comparison 'A' == 'a', 'B' == 'b', ..., 'Z' == 'z'.

@ -1,6 +1,6 @@
#include "case.h" #include "case.h"
int case_diffb(register const char *s,register unsigned int len,register const char *t) int case_diffb(register const char *s,register unsigned long len,register const char *t)
{ {
register unsigned char x; register unsigned char x;
register unsigned char y; register unsigned char y;

@ -4,7 +4,7 @@ case_lowerb \- compare strings case-insensitively
.SH SYNTAX .SH SYNTAX
.B #include <case.h> .B #include <case.h>
int \fBcase_lowerb\fP(char* \fIs\fR,unsigned int \fIlen\fR); void \fBcase_lowerb\fP(char* \fIs\fR,unsigned long \fIlen\fR);
.SH DESCRIPTION .SH DESCRIPTION
case_lowerb converts each 'A' to 'a', 'B' to 'b', ..., 'Z' to 'z' in case_lowerb converts each 'A' to 'a', 'B' to 'b', ..., 'Z' to 'z' in
\fIs\fR[0], \fIs\fR[1], ..., \fIs\fR[\fIlen\fR]. \fIs\fR[0], \fIs\fR[1], ..., \fIs\fR[\fIlen\fR].

@ -1,6 +1,6 @@
#include "case.h" #include "case.h"
void case_lowerb(char *s,unsigned int len) { void case_lowerb(char *s,unsigned long len) {
unsigned char x; unsigned char x;
while (len > 0) { while (len > 0) {
--len; --len;

@ -4,7 +4,7 @@ case_lowers \- compare strings case-insensitively
.SH SYNTAX .SH SYNTAX
.B #include <case.h> .B #include <case.h>
int \fBcase_lowers\fP(char* \fIs\fR); void \fBcase_lowers\fP(char* \fIs\fR);
.SH DESCRIPTION .SH DESCRIPTION
case_lowers converts each 'A' to 'a', 'B' to 'b', ..., 'Z' to 'z' for case_lowers converts each 'A' to 'a', 'B' to 'b', ..., 'Z' to 'z' for
each character in \fIs\fR until the first \\0. each character in \fIs\fR until the first \\0.

@ -58,23 +58,23 @@ unsigned int fmt_plusminus(char *dest,int src);
unsigned int fmt_minus(char *dest,int src); unsigned int fmt_minus(char *dest,int src);
/* copy str to dest until \0 byte, return number of copied bytes. */ /* copy str to dest until \0 byte, return number of copied bytes. */
unsigned int fmt_str(char *dest,const char *src); unsigned long fmt_str(char *dest,const char *src);
/* copy str to dest until \0 byte or limit bytes copied. /* copy str to dest until \0 byte or limit bytes copied.
* return number of copied bytes. */ * return number of copied bytes. */
unsigned int fmt_strn(char *dest,const char *src,unsigned int limit); unsigned long fmt_strn(char *dest,const char *src,unsigned long limit);
/* "foo" -> " foo" /* "foo" -> " foo"
* write padlen-srclen spaces, if that is >= 0. Then copy srclen * write padlen-srclen spaces, if that is >= 0. Then copy srclen
* characters from src. Truncate only if total length is larger than * characters from src. Truncate only if total length is larger than
* maxlen. Return number of characters written. */ * maxlen. Return number of characters written. */
unsigned int fmt_pad(char* dest,const char* src,unsigned int srclen,unsigned int padlen,unsigned int maxlen); unsigned long fmt_pad(char* dest,const char* src,unsigned long srclen,unsigned long padlen,unsigned long maxlen);
/* "foo" -> "foo " /* "foo" -> "foo "
* append padlen-srclen spaces after dest, if that is >= 0. Truncate * append padlen-srclen spaces after dest, if that is >= 0. Truncate
* only if total length is larger than maxlen. Return number of * only if total length is larger than maxlen. Return number of
* characters written. */ * characters written. */
unsigned int fmt_fill(char* dest,unsigned int srclen,unsigned int padlen,unsigned int maxlen); unsigned long fmt_fill(char* dest,unsigned long srclen,unsigned long padlen,unsigned long maxlen);
/* 1 -> "1", 4900 -> "4.9k", 2300000 -> "2.3M" */ /* 1 -> "1", 4900 -> "4.9k", 2300000 -> "2.3M" */
unsigned int fmt_human(char* dest,unsigned long long l); unsigned int fmt_human(char* dest,unsigned long long l);

@ -4,9 +4,9 @@ fmt_fill \- append spaces to a string
.SH SYNTAX .SH SYNTAX
.B #include <fmt.h> .B #include <fmt.h>
unsigned int \fBfmt_fill\fP(char *\fIdest\fR, unsigned long \fBfmt_fill\fP(char *\fIdest\fR,
unsigned int \fIsrclen\fR, unsigned int \fIpadlen\fR, unsigned long \fIsrclen\fR, unsigned long \fIpadlen\fR,
unsigned int \fImaxlen\fR); unsigned long \fImaxlen\fR);
.SH DESCRIPTION .SH DESCRIPTION
fmt_fill appends \fIpadlen\fR-\fIsrclen\fR spaces (if that number is fmt_fill appends \fIpadlen\fR-\fIsrclen\fR spaces (if that number is
positive) to \fIdest\fR (which holds \fIsrclen\fR bytes). It truncates positive) to \fIdest\fR (which holds \fIsrclen\fR bytes). It truncates

@ -4,8 +4,8 @@
* append padlen-srclen spaces after dest, if that is >= 0. Truncate * append padlen-srclen spaces after dest, if that is >= 0. Truncate
* only if total length is larger than maxlen. Return number of * only if total length is larger than maxlen. Return number of
* characters written. */ * characters written. */
unsigned int fmt_fill(char* dest,unsigned int srclen,unsigned int padlen,unsigned int maxlen) { unsigned long fmt_fill(char* dest,unsigned long srclen,unsigned long padlen,unsigned long maxlen) {
int todo; long todo;
char* olddest=dest; char* olddest=dest;
char* max=dest+maxlen; char* max=dest+maxlen;
if (dest==0) { if (dest==0) {

@ -4,9 +4,9 @@ fmt_pad \- pad a string with spaces.
.SH SYNTAX .SH SYNTAX
.B #include <fmt.h> .B #include <fmt.h>
unsigned int \fBfmt_pad\fP(char *\fIdest\fR, const char *\fIsource\fR, unsigned long \fBfmt_pad\fP(char *\fIdest\fR, const char *\fIsource\fR,
unsigned int \fIsrclen\fR, unsigned int \fIpadlen\fR, unsigned long \fIsrclen\fR, unsigned long \fIpadlen\fR,
unsigned int \fImaxlen\fR); unsigned long \fImaxlen\fR);
.SH DESCRIPTION .SH DESCRIPTION
fmt_pad writes \fIpadlen\fR-\fIsrclen\fR spaces (if that number is fmt_pad writes \fIpadlen\fR-\fIsrclen\fR spaces (if that number is
positive) and then \fIsrclen\fR characters from \fIsource\fR. It positive) and then \fIsrclen\fR characters from \fIsource\fR. It

@ -4,8 +4,8 @@
* write padlen-srclen spaces, if that is >= 0. Then copy srclen * write padlen-srclen spaces, if that is >= 0. Then copy srclen
* characters from src. Truncate only if total length is larger than * characters from src. Truncate only if total length is larger than
* maxlen. Return number of characters written. */ * maxlen. Return number of characters written. */
unsigned int fmt_pad(char* dest,const char* src,unsigned int srclen,unsigned int padlen,unsigned int maxlen) { unsigned long fmt_pad(char* dest,const char* src,unsigned long srclen,unsigned long padlen,unsigned long maxlen) {
int todo; long todo;
char* olddest=dest; char* olddest=dest;
char* max=dest+maxlen; char* max=dest+maxlen;
todo=padlen-srclen; todo=padlen-srclen;

@ -4,7 +4,7 @@ fmt_str \- write an ASCII string
.SH SYNTAX .SH SYNTAX
.B #include <fmt.h> .B #include <fmt.h>
unsigned int \fBfmt_str\fP(char *\fIdest\fR,const char *\fIsource\fR); unsigned long \fBfmt_str\fP(char *\fIdest\fR,const char *\fIsource\fR);
.SH DESCRIPTION .SH DESCRIPTION
fmt_str copies all leading nonzero bytes from \fIsource\fR to \fIdest\fR fmt_str copies all leading nonzero bytes from \fIsource\fR to \fIdest\fR
and returns the number of bytes it copied. and returns the number of bytes it copied.

@ -1,6 +1,6 @@
#include "fmt.h" #include "fmt.h"
unsigned int fmt_str(char *out,const char *in) { unsigned long fmt_str(char *out,const char *in) {
register char* s=out; register char* s=out;
register const char* t=in; register const char* t=in;
for (;;) { for (;;) {

@ -4,8 +4,8 @@ fmt_strn \- write an ASCII string
.SH SYNTAX .SH SYNTAX
.B #include <fmt.h> .B #include <fmt.h>
unsigned int \fBfmt_strn\fP(char *\fIdest\fR,const char *\fIsource\fR, unsigned long \fBfmt_strn\fP(char *\fIdest\fR,const char *\fIsource\fR,
unsigned int maxlen); unsigned long maxlen);
.SH DESCRIPTION .SH DESCRIPTION
fmt_str copies at most \fImaxlen\fR leading nonzero bytes from fmt_str copies at most \fImaxlen\fR leading nonzero bytes from
\fIsource\fR to \fIdest\fR and returns the number of bytes it copied. \fIsource\fR to \fIdest\fR and returns the number of bytes it copied.

@ -1,6 +1,6 @@
#include "fmt.h" #include "fmt.h"
unsigned int fmt_strn(char *out,const char *in,unsigned int limit) { unsigned long fmt_strn(char *out,const char *in,unsigned long limit) {
register char* s=out; register char* s=out;
register const char* t=in; register const char* t=in;
register const char* u=in+limit; register const char* u=in+limit;

@ -52,18 +52,18 @@ extern unsigned int scan_double(const char *in, double *dest);
extern unsigned int scan_plusminus(const char *src,signed int *dest); extern unsigned int scan_plusminus(const char *src,signed int *dest);
/* return the highest integer n<=limit so that isspace(in[i]) for all 0<=i<=n */ /* return the highest integer n<=limit so that isspace(in[i]) for all 0<=i<=n */
extern unsigned int scan_whitenskip(const char *in,unsigned int limit) __pure__; extern unsigned long scan_whitenskip(const char *in,unsigned long limit) __pure__;
/* return the highest integer n<=limit so that !isspace(in[i]) for all 0<=i<=n */ /* return the highest integer n<=limit so that !isspace(in[i]) for all 0<=i<=n */
extern unsigned int scan_nonwhitenskip(const char *in,unsigned int limit) __pure__; extern unsigned long scan_nonwhitenskip(const char *in,unsigned long limit) __pure__;
/* return the highest integer n<=limit so that in[i] is element of /* return the highest integer n<=limit so that in[i] is element of
* charset (ASCIIZ string) for all 0<=i<=n */ * charset (ASCIIZ string) for all 0<=i<=n */
extern unsigned int scan_charsetnskip(const char *in,const char *charset,unsigned int limit) __pure__; extern unsigned long scan_charsetnskip(const char *in,const char *charset,unsigned long limit) __pure__;
/* return the highest integer n<=limit so that in[i] is not element of /* return the highest integer n<=limit so that in[i] is not element of
* charset (ASCIIZ string) for all 0<=i<=n */ * charset (ASCIIZ string) for all 0<=i<=n */
extern unsigned int scan_noncharsetnskip(const char *in,const char *charset,unsigned int limit) __pure__; extern unsigned long scan_noncharsetnskip(const char *in,const char *charset,unsigned long limit) __pure__;
/* try to parse ASCII GMT date; does not understand time zones. */ /* try to parse ASCII GMT date; does not understand time zones. */
/* example dates: /* example dates:

@ -4,7 +4,7 @@ scan_charsetnskip \- skip characters from set
.SH SYNTAX .SH SYNTAX
.B #include <scan.h> .B #include <scan.h>
int \fBscan_charsetnskip\fP(const char* \fIsrc\fR, const char* \fIcharset\fR, unsigned int* \fIlimit\fR); long \fBscan_charsetnskip\fP(const char* \fIsrc\fR, const char* \fIcharset\fR, unsigned long* \fIlimit\fR);
.SH DESCRIPTION .SH DESCRIPTION
scan_charsetnskip returns the length of the maximum prefix of \fIsrc\fR scan_charsetnskip returns the length of the maximum prefix of \fIsrc\fR
that consists solely of characters that occur in \fIcharset\fR (up to that consists solely of characters that occur in \fIcharset\fR (up to

@ -1,7 +1,7 @@
#include "scan.h" #include "scan.h"
#include <ctype.h> #include <ctype.h>
unsigned int scan_charsetnskip(const char *s,const char *charset,unsigned int limit) { unsigned long scan_charsetnskip(const char *s,const char *charset,unsigned long limit) {
register const char *t=s; register const char *t=s;
register const char *u=t+limit; register const char *u=t+limit;
register const char* i; register const char* i;

@ -4,7 +4,7 @@ scan_noncharsetnskip \- skip characters not from set
.SH SYNTAX .SH SYNTAX
.B #include <scan.h> .B #include <scan.h>
int \fBscan_noncharsetnskip\fP(const char* \fIsrc\fR, const char* \fIcharset\fR, unsigned int* \fIlimit\fR); long \fBscan_noncharsetnskip\fP(const char* \fIsrc\fR, const char* \fIcharset\fR, unsigned long* \fIlimit\fR);
.SH DESCRIPTION .SH DESCRIPTION
scan_noncharsetnskip returns the length of the maximum prefix of \fIsrc\fR scan_noncharsetnskip returns the length of the maximum prefix of \fIsrc\fR
that consists solely of characters that do not occur in \fIcharset\fR that consists solely of characters that do not occur in \fIcharset\fR

@ -1,7 +1,7 @@
#include "scan.h" #include "scan.h"
#include <ctype.h> #include <ctype.h>
unsigned int scan_noncharsetnskip(const char *s,const char *charset,unsigned int limit) { unsigned long scan_noncharsetnskip(const char *s,const char *charset,unsigned long limit) {
register const char *t=s; register const char *t=s;
register const char *u=t+limit; register const char *u=t+limit;
register const char* i; register const char* i;

@ -4,7 +4,7 @@ scan_nonwhitenskip \- skip non-whitespace
.SH SYNTAX .SH SYNTAX
.B #include <scan.h> .B #include <scan.h>
int \fBscan_nonwhitenskip\fP(const char *\fIsrc\fR,unsigned int *\fIlimit\fR); long \fBscan_nonwhitenskip\fP(const char *\fIsrc\fR,unsigned long *\fIlimit\fR);
.SH DESCRIPTION .SH DESCRIPTION
scan_nonwhitenskip returns the length of the maximum prefix of \fIsrc\fR scan_nonwhitenskip returns the length of the maximum prefix of \fIsrc\fR
that consists solely of non-whitespace characters as defined by that consists solely of non-whitespace characters as defined by

@ -1,7 +1,7 @@
#include "scan.h" #include "scan.h"
#include <ctype.h> #include <ctype.h>
unsigned int scan_nonwhitenskip(const char *s,unsigned int limit) { unsigned long scan_nonwhitenskip(const char *s,unsigned long limit) {
register const char *t=s; register const char *t=s;
register const char *u=t+limit; register const char *u=t+limit;
while (t<u && !isspace(*t)) ++t; while (t<u && !isspace(*t)) ++t;

@ -4,7 +4,7 @@ scan_whitenskip \- skip whitespace
.SH SYNTAX .SH SYNTAX
.B #include <scan.h> .B #include <scan.h>
int \fBscan_whitenskip\fP(const char *\fIsrc\fR,unsigned int *\fIlimit\fR); long \fBscan_whitenskip\fP(const char *\fIsrc\fR,unsigned long *\fIlimit\fR);
.SH DESCRIPTION .SH DESCRIPTION
scan_whitenskip returns the length of the maximum prefix of \fIsrc\fR scan_whitenskip returns the length of the maximum prefix of \fIsrc\fR
that consists solely of whitespace characters as defined by that consists solely of whitespace characters as defined by

@ -1,7 +1,7 @@
#include "scan.h" #include "scan.h"
#include <ctype.h> #include <ctype.h>
unsigned int scan_whitenskip(const char *s,unsigned int limit) { unsigned long scan_whitenskip(const char *s,unsigned long limit) {
register const char *t=s; register const char *t=s;
register const char *u=t+limit; register const char *u=t+limit;
while (t<u && isspace(*t)) ++t; while (t<u && isspace(*t)) ++t;

10
str.h

@ -10,7 +10,7 @@
/* str_copy copies leading bytes from in to out until \0. /* str_copy copies leading bytes from in to out until \0.
* return number of copied bytes. */ * return number of copied bytes. */
extern unsigned int str_copy(char *out,const char *in); extern unsigned long str_copy(char *out,const char *in);
/* str_diff returns negative, 0, or positive, depending on whether the /* str_diff returns negative, 0, or positive, depending on whether the
* string a[0], a[1], ..., a[n]=='\0' is lexicographically smaller than, * string a[0], a[1], ..., a[n]=='\0' is lexicographically smaller than,
@ -25,21 +25,21 @@ extern int str_diff(const char *a,const char *b) __pure__;
* If the strings are different, str_diffn does not read bytes past the * If the strings are different, str_diffn does not read bytes past the
* first difference. The strings will be considered equal if the first * first difference. The strings will be considered equal if the first
* limit characters match. */ * limit characters match. */
extern int str_diffn(const char *a,const char *b,unsigned int limit) __pure__; extern int str_diffn(const char *a,const char *b,unsigned long limit) __pure__;
#ifdef __dietlibc__ #ifdef __dietlibc__
#include <string.h> #include <string.h>
#define str_len(foo) strlen(foo) #define str_len(foo) strlen(foo)
#else #else
/* str_len returns the index of \0 in s */ /* str_len returns the index of \0 in s */
extern unsigned int str_len(const char *s) __pure__; extern unsigned long str_len(const char *s) __pure__;
#endif #endif
/* str_chr returns the index of the first occurance of needle or \0 in haystack */ /* str_chr returns the index of the first occurance of needle or \0 in haystack */
extern unsigned int str_chr(const char *haystack,char needle) __pure__; extern unsigned long str_chr(const char *haystack,char needle) __pure__;
/* str_rchr returns the index of the last occurance of needle or \0 in haystack */ /* str_rchr returns the index of the last occurance of needle or \0 in haystack */
extern unsigned int str_rchr(const char *haystack,char needle) __pure__; extern unsigned long str_rchr(const char *haystack,char needle) __pure__;
/* str_start returns 1 if the b is a prefix of a, 0 otherwise */ /* str_start returns 1 if the b is a prefix of a, 0 otherwise */
extern int str_start(const char *a,const char *b) __pure__; extern int str_start(const char *a,const char *b) __pure__;

@ -4,7 +4,7 @@ str_chr \- find character in ASCIIZ string
.SH SYNTAX .SH SYNTAX
.B #include <str.h> .B #include <str.h>
extern int \fBstr_chr\fP(const char* \fIhaystack\fR,char \fIneedle\fR); extern long \fBstr_chr\fP(const char* \fIhaystack\fR,char \fIneedle\fR);
.SH DESCRIPTION .SH DESCRIPTION
str_chr returns the index of the first occurrance of \fIneedle\fR or \\0 in str_chr returns the index of the first occurrance of \fIneedle\fR or \\0 in
\fIstring\fR. \fIstring\fR.

@ -1,6 +1,6 @@
#include "str.h" #include "str.h"
unsigned int str_chr(const char *in, char needle) { unsigned long str_chr(const char *in, char needle) {
register const char* t=in; register const char* t=in;
register const char c=needle; register const char c=needle;
for (;;) { for (;;) {

@ -4,7 +4,7 @@ str_copy \- copy an ASCIIZ string
.SH SYNTAX .SH SYNTAX
.B #include <str.h> .B #include <str.h>
extern int \fBstr_copy\fP(char* \fIout\fR,const char* \fIin\fR); extern long \fBstr_copy\fP(char* \fIout\fR,const char* \fIin\fR);
.SH DESCRIPTION .SH DESCRIPTION
str_copy copies the leading bytes of \fIin\fR to \fIout\fR up to and str_copy copies the leading bytes of \fIin\fR to \fIout\fR up to and
including the first occurrance of \\0. including the first occurrance of \\0.

@ -1,6 +1,6 @@
#include "str.h" #include "str.h"
unsigned int str_copy(char *out,const char *in) { unsigned long str_copy(char *out,const char *in) {
register char* s=out; register char* s=out;
register const char* t=in; register const char* t=in;
for (;;) { for (;;) {

@ -4,7 +4,7 @@ str_diffn \- compare two ASCIIZ strings
.SH SYNTAX .SH SYNTAX
.B #include <str.h> .B #include <str.h>
extern int \fBstr_diffn\fP(const char* \fIa\fR,const char* \fIb\fR,unsigned int \fIlimit\fR); extern int \fBstr_diffn\fP(const char* \fIa\fR,const char* \fIb\fR,unsigned long \fIlimit\fR);
.SH DESCRIPTION .SH DESCRIPTION
\fBstr_diffn\fR returns negative, 0, or positive, depending on whether the \fBstr_diffn\fR returns negative, 0, or positive, depending on whether the
string \fIa\fR[0], \fIa\fR[1], ..., \fIa\fR[n]=='\\0' is string \fIa\fR[0], \fIa\fR[1], ..., \fIa\fR[n]=='\\0' is

@ -5,7 +5,7 @@
* equal to, or greater than the string b[0], b[1], ..., b[m-1]=='\0'. * equal to, or greater than the string b[0], b[1], ..., b[m-1]=='\0'.
* When the strings are different, str_diff does not read bytes past the * When the strings are different, str_diff does not read bytes past the
* first difference. */ * first difference. */
int str_diffn(const char* a, const char* b, unsigned int limit) { int str_diffn(const char* a, const char* b, unsigned long limit) {
register const char* s=a; register const char* s=a;
register const char* t=b; register const char* t=b;
register const char* u=t+limit; register const char* u=t+limit;

@ -4,7 +4,7 @@ str_len \- find length of ASCIIZ string
.SH SYNTAX .SH SYNTAX
.B #include <str.h> .B #include <str.h>
extern int \fBstr_len\fP(const char* \fIstring\fR); extern long \fBstr_len\fP(const char* \fIstring\fR);
.SH DESCRIPTION .SH DESCRIPTION
str_len returns the index of the first occurrance of \\0 in str_len returns the index of the first occurrance of \\0 in
\fIstring\fR. \fIstring\fR.

@ -2,9 +2,9 @@
#ifdef __dietlibc__ #ifdef __dietlibc__
#undef str_len #undef str_len
unsigned int str_len(const char* in) __attribute__((alias("strlen"))); unsigned long str_len(const char* in) __attribute__((alias("strlen")));
#else #else
unsigned int str_len(const char* in) { unsigned long str_len(const char* in) {
register const char* t=in; register const char* t=in;
for (;;) { for (;;) {
if (!*t) break; ++t; if (!*t) break; ++t;

@ -4,7 +4,7 @@ str_rchr \- find character in ASCIIZ string
.SH SYNTAX .SH SYNTAX
.B #include <str.h> .B #include <str.h>
extern int \fBstr_rchr\fP(const char* \fIhaystack\fR,char \fIneedle\fR); extern long \fBstr_rchr\fP(const char* \fIhaystack\fR,char \fIneedle\fR);
.SH DESCRIPTION .SH DESCRIPTION
str_rchr returns the index of the last occurrance of needle or the first str_rchr returns the index of the last occurrance of needle or the first
occurrance of \\0 in \fIstring\fR. occurrance of \\0 in \fIstring\fR.

@ -1,6 +1,6 @@
#include "str.h" #include "str.h"
unsigned int str_rchr(const char *in, char needle) { unsigned long str_rchr(const char *in, char needle) {
register const char* t=in; register const char* t=in;
register const char c=needle; register const char c=needle;
register const char* found=0; register const char* found=0;

@ -0,0 +1,13 @@
#include <assert.h>
#include "array.h"
#include "byte.h"
main() {
static array x,y;
array_cats(&x,"fnord");
array_cats(&y,"foobar");
array_cat(&x,&y);
array_fail(&y);
array_cat(&y,&x);
assert(byte_equal(x.p,11,"fnordfoobar"));
}
Loading…
Cancel
Save