add stralloc_diff and stralloc_diffs

master
leitner 22 years ago
parent e108646f26
commit 2cd4641da9

@ -4,6 +4,7 @@
add buffer_putsa, buffer_get_token_sa and buffer_getline_sa add buffer_putsa, buffer_get_token_sa and buffer_getline_sa
extended uudecode test. See comment at top for details. extended uudecode test. See comment at top for details.
fix #include in ndelay*.3 (Hynek Schlawack) fix #include in ndelay*.3 (Hynek Schlawack)
add stralloc_diff and stralloc_diffs (my invention)
0.14: 0.14:
avoid bus errors in byte_copy avoid bus errors in byte_copy

@ -1,6 +1,13 @@
#ifndef STRALLOC_H #ifndef STRALLOC_H
#define STRALLOC_H #define STRALLOC_H
#ifdef __dietlibc__
#include <sys/cdefs.h>
#endif
#ifndef __pure__
#define __pure__
#endif
/* stralloc is the internal data structure all functions are working on. /* stralloc is the internal data structure all functions are working on.
* s is the string. * s is the string.
* len is the used length of the string. * len is the used length of the string.
@ -66,7 +73,17 @@ extern int stralloc_append(stralloc* sa,const char* in); /* beware: this takes a
/* stralloc_starts returns 1 if the \0-terminated string in "in", without /* stralloc_starts returns 1 if the \0-terminated string in "in", without
* the terminating \0, is a prefix of the string stored in sa. Otherwise * the terminating \0, is a prefix of the string stored in sa. Otherwise
* it returns 0. sa must already be allocated. */ * it returns 0. sa must already be allocated. */
extern int stralloc_starts(stralloc* sa,const char* in); extern int stralloc_starts(stralloc* sa,const char* in) __pure__;
/* stralloc_diff returns negative, 0, or positive, depending on whether
* a is lexicographically smaller than, equal to, or greater than the
* string b. */
extern int stralloc_diff(const stralloc* a,const stralloc* b) __pure__;
/* stralloc_diffs returns negative, 0, or positive, depending on whether
* a is lexicographically smaller than, equal to, or greater than the
* string b[0], b[1], ..., b[n]=='\0'. */
extern int stralloc_diffs(const stralloc* a,const char* b) __pure__;
/* stralloc_0 appends \0 */ /* stralloc_0 appends \0 */
#define stralloc_0(sa) stralloc_append(sa,"") #define stralloc_0(sa) stralloc_append(sa,"")

@ -0,0 +1,13 @@
.TH stralloc_diffs 3
.SH NAME
stralloc_diffs \- compare two strallocs
.SH SYNTAX
.B #include <stralloc.h>
int \fBstralloc_diff\fP(const stralloc* \fIa\fR,const stralloc* \fIb\fR);
.SH DESCRIPTION
stralloc_diff returns negative, 0, or positive, depending on whether
\fIa\fR is lexicographically smaller than, equal to, or greater than the
string \fIb\fR.
.SH "SEE ALSO"
stralloc_diffs(3), stralloc_starts(3)

@ -0,0 +1,14 @@
#include "stralloc.h"
#include "byte.h"
#include "str.h"
extern int stralloc_diff(const stralloc* a,const stralloc* b) {
register unsigned int i;
register int j;
for (i=0;;++i) {
if (i==a->len) return i==b->len?0:-1; if (i==b->len) return 1;
if ((j=(a->s[i]-b->s[i]))) return j;
}
return j;
}

@ -0,0 +1,14 @@
.TH stralloc_diffs 3
.SH NAME
stralloc_diffs \- check if string is prefix of stralloc
.SH SYNTAX
.B #include <stralloc.h>
int \fBstralloc_diffs\fP(stralloc* \fIa\fR,const char* \fIb\fR);
.SH DESCRIPTION
stralloc_diffs returns negative, 0, or positive, depending on whether
the \\0-terminated string in \fIa\fR, without
the terminating \\0, is lexicographically smaller than, equal to, or
greater than the string stored in \fIa\fR.
.SH "SEE ALSO"
stralloc_diff(3), stralloc_starts(3), str_diff(3)

@ -0,0 +1,14 @@
#include "stralloc.h"
#include "byte.h"
#include "str.h"
extern int stralloc_diffs(const stralloc* a,const char* b) {
register unsigned int i;
register int j;
for (i=0;;++i) {
if (i==a->len) return (!b[i])?0:-1; if (!b[i]) return 1;
if ((j=(a->s[i]-b[i]))) return j;
}
return j;
}

@ -6,7 +6,7 @@ stralloc_starts \- check if string is prefix of stralloc
int \fBstralloc_starts\fP(stralloc* \fIsa\fR,const char* \fIin\fR); int \fBstralloc_starts\fP(stralloc* \fIsa\fR,const char* \fIin\fR);
.SH DESCRIPTION .SH DESCRIPTION
stralloc_starts returns 1 if the \\0-terminated string in \fIbuf\fR, without stralloc_starts returns 1 if the \\0-terminated string in \fIin\fR, without
the terminating \\0, is a prefix of the string stored in \fIsa\fR. Otherwise the terminating \\0, is a prefix of the string stored in \fIsa\fR. Otherwise
it returns 0. \fIsa\fR must already be allocated. it returns 0. \fIsa\fR must already be allocated.
.SH "SEE ALSO" .SH "SEE ALSO"

18
t.c

@ -22,8 +22,26 @@
__asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx")
int main(int argc,char* argv[]) { int main(int argc,char* argv[]) {
#if 0
static stralloc s,t;
stralloc_copys(&s,"fnord");
stralloc_copys(&t,"abc"); printf("%d\n",stralloc_diff(&s,&t));
stralloc_copys(&t,"fnor"); printf("%d\n",stralloc_diff(&s,&t));
stralloc_copys(&t,"fnord"); printf("%d\n",stralloc_diff(&s,&t));
stralloc_copys(&t,"fnordh"); printf("%d\n",stralloc_diff(&s,&t));
stralloc_copys(&t,"hausen"); printf("%d\n",stralloc_diff(&s,&t));
#endif
static stralloc s;
stralloc_copys(&s,"fnord");
printf("%d\n",stralloc_diffs(&s,"abc"));
printf("%d\n",stralloc_diffs(&s,"fnor"));
printf("%d\n",stralloc_diffs(&s,"fnord"));
printf("%d\n",stralloc_diffs(&s,"fnordh"));
printf("%d\n",stralloc_diffs(&s,"hausen"));
#if 0
printf("%d\n",case_starts("fnordhausen","FnOrD")); printf("%d\n",case_starts("fnordhausen","FnOrD"));
printf("%d\n",case_starts("fnordhausen","blah")); printf("%d\n",case_starts("fnordhausen","blah"));
#endif
#if 0 #if 0
char buf[]="FnOrD"; char buf[]="FnOrD";
case_lowers(buf); case_lowers(buf);

Loading…
Cancel
Save