96 lines
1.2 KiB
C
96 lines
1.2 KiB
C
#include "dat.h"
|
|
#include "fn.h"
|
|
|
|
void
|
|
sinit(Str *s, char *src, int n)
|
|
{
|
|
int len;
|
|
|
|
s->n = 0;
|
|
if(n < 0 || (n > 0 && src == nil))
|
|
return;
|
|
while(n > 0 && s->n < Maxrunes){
|
|
if(!fullrune(src, n))
|
|
break;
|
|
len = chartorune(&s->r[s->n], src);
|
|
if(len > n)
|
|
break;
|
|
s->n++;
|
|
src += len;
|
|
n -= len;
|
|
}
|
|
}
|
|
|
|
void
|
|
sclear(Str *s)
|
|
{
|
|
s->n = 0;
|
|
}
|
|
|
|
void
|
|
sputr(Str *s, Rune r)
|
|
{
|
|
/* Str is a capped value; appends at capacity leave it unchanged. */
|
|
if(s->n >= Maxrunes)
|
|
return;
|
|
s->r[s->n++] = r;
|
|
}
|
|
|
|
void
|
|
spopr(Str *s)
|
|
{
|
|
if(s->n > 0)
|
|
s->r[--s->n] = 0;
|
|
}
|
|
|
|
void
|
|
sappend(Str *dst, Str *src)
|
|
{
|
|
int i, n;
|
|
|
|
n = src->n;
|
|
for(i = 0; i < n && dst->n < Maxrunes; i++)
|
|
dst->r[dst->n++] = src->r[i];
|
|
}
|
|
|
|
int
|
|
scmp(Str *a, Str *b)
|
|
{
|
|
int i;
|
|
|
|
if(a->n != b->n)
|
|
return 1;
|
|
for(i = 0; i < a->n; i++)
|
|
if(a->r[i] != b->r[i])
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
stoutf(Str *s, char *buf, int sz)
|
|
{
|
|
char tmp[UTFmax];
|
|
int i, n, len;
|
|
|
|
if(sz <= 0)
|
|
return 0;
|
|
n = 0;
|
|
for(i = 0; i < s->n; i++){
|
|
len = runetochar(tmp, &s->r[i]);
|
|
if(len > sz - n - 1)
|
|
break;
|
|
memmove(buf + n, tmp, len);
|
|
n += len;
|
|
}
|
|
buf[n] = '\0';
|
|
return n;
|
|
}
|
|
|
|
Rune
|
|
slastr(Str *s)
|
|
{
|
|
if(s->n < 1)
|
|
return 0;
|
|
return s->r[s->n-1];
|
|
}
|