329 lines
7.2 KiB
C
329 lines
7.2 KiB
C
#define NULL 0
|
|
#define st_alloc(size) malloc((size)+2)
|
|
|
|
#if !defined(STRING)
|
|
typedef struct {
|
|
int length;
|
|
char string[80];
|
|
} STRING;
|
|
#endif
|
|
|
|
enum COMPVALUE {LESS, EQUAL, GREATER};
|
|
|
|
STRING *bldstr(s,len)
|
|
char *s;
|
|
int len;
|
|
{
|
|
STRING *ss;
|
|
ss = st_alloc(len);
|
|
if (ss != NULL) {
|
|
ss->length = len;
|
|
memcpy(ss->string,s,len);
|
|
}
|
|
return ss;
|
|
}
|
|
|
|
void getstr(str, arr, len)
|
|
STRING *str;
|
|
char *arr;
|
|
int len;
|
|
{
|
|
int size;
|
|
if (str == NULL) memset(arr,' ',len);
|
|
else {
|
|
if (str->length > len) size = len; else size = str->length;
|
|
memcpy(arr,str->string,size);
|
|
if (size < len) memset(&arr[size],' ',len-size);
|
|
}
|
|
}
|
|
|
|
int len(str)
|
|
STRING *str;
|
|
{
|
|
return str->length;
|
|
}
|
|
|
|
STRING *left$(str, position)
|
|
STRING *str;
|
|
int position;
|
|
{
|
|
int size;
|
|
STRING *s;
|
|
if ((str == NULL) || (position < 0)) size = 0;
|
|
else {
|
|
if (position < str->length) size = position;
|
|
else size = str->length;
|
|
}
|
|
s = st_alloc(size);
|
|
if (s != NULL) {
|
|
s->length = size;
|
|
memcpy(s->string,str->string,size);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
STRING *right$(str, position)
|
|
STRING *str;
|
|
int position;
|
|
{
|
|
int size;
|
|
STRING *s;
|
|
if (str == NULL) size = 0;
|
|
else {
|
|
if (position <= 0 || position > str->length) size = 0;
|
|
else size = str->length-position+1;
|
|
}
|
|
s = st_alloc(size);
|
|
if (s != NULL) {
|
|
s->length = size;
|
|
memcpy(s->string,&str->string[position-1],size);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
STRING *mid$(str, position, length)
|
|
STRING *str;
|
|
int position;
|
|
int length;
|
|
{
|
|
int size;
|
|
STRING *s;
|
|
if (str == NULL) size = 0;
|
|
else {
|
|
if (position <= 0) size = str->length;
|
|
else if (position > str->length) size = 0;
|
|
else size = str->length - position + 1;
|
|
}
|
|
if (length < size) size = length;
|
|
s = st_alloc(size);
|
|
if (s != NULL) {
|
|
s->length = size;
|
|
memcpy(s->string,&str->string[position-1],size);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
STRING *str$(length, ch)
|
|
int length;
|
|
int ch;
|
|
{
|
|
STRING *s;
|
|
s = st_alloc(length);
|
|
if (s != NULL) {
|
|
s->length = length;
|
|
memset(s->string,ch,length);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
char character(s, position)
|
|
STRING *s;
|
|
int position;
|
|
{
|
|
if (s == NULL) return '\r';
|
|
if ((s->length <= 0) || (position <= 0) || (position > s->length))
|
|
return '\r';
|
|
return s->string[position-1];
|
|
}
|
|
|
|
enum COMPVALUE cmpstr(s1, s2)
|
|
STRING *s1;
|
|
STRING *s2;
|
|
{
|
|
int len;
|
|
int cmp;
|
|
if (s1 == s2) return EQUAL;
|
|
if (s1 == NULL) return LESS;
|
|
if (s2 == NULL) return GREATER;
|
|
len = s1->length;
|
|
if (s2->length < len) len = s2->length;
|
|
cmp = memcmp(s1->string,s2->string,len);
|
|
if (cmp < 0) return LESS;
|
|
if (cmp > 0) return GREATER;
|
|
if (s1->length > s2->length) return GREATER;
|
|
if (s1->length < s2->length) return LESS;
|
|
return EQUAL;
|
|
}
|
|
|
|
STRING *conc(s1,s2)
|
|
STRING *s1;
|
|
STRING *s2;
|
|
{
|
|
STRING *s;
|
|
int size1, size2;
|
|
if (s1 == NULL) size1 = 0; else size1 = s1->length;
|
|
if (s2 == NULL) size2 = 0; else size2 = s2->length;
|
|
s = st_alloc(size1+size2);
|
|
if (s != NULL) {
|
|
s->length = size1+size2;
|
|
if (size1) memcpy(s->string,s1->string,size1);
|
|
if (size2) memcpy(&s->string[size1],s2->string,size2);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
STRING *insert(substring, s, position)
|
|
STRING *substring;
|
|
STRING *s;
|
|
int position;
|
|
{
|
|
STRING *st;
|
|
int size1, size2, pos;
|
|
if (s == NULL) size1 = 0; else size1 = s->length;
|
|
if (substring == NULL) size2 = 0; else size2 = substring->length;
|
|
pos = position;
|
|
if (pos <= 0) pos = 1;
|
|
if (pos > size1) pos = size1+1;
|
|
st = st_alloc(size1+size2);
|
|
if (st != NULL) {
|
|
st->length = size1+size2;
|
|
memcpy(st->string,s->string,pos-1);
|
|
memcpy(&st->string[pos-1],substring->string,size2);
|
|
memcpy(&st->string[pos-1+size2],&s->string[pos-1],size1+1-pos);
|
|
}
|
|
return st;
|
|
}
|
|
|
|
STRING *delete(str, position, length)
|
|
STRING *str;
|
|
int position;
|
|
int length;
|
|
|
|
{
|
|
STRING *st;
|
|
int size;
|
|
int pos = position;
|
|
if (pos <= 0) {
|
|
length = length-pos-1;
|
|
pos = 1;
|
|
}
|
|
if (length < 0) length = 0;
|
|
if (str == NULL) size = 0;
|
|
else {
|
|
if (pos > str->length) size = str->length;
|
|
else if (pos+length > str->length) size = pos-1;
|
|
else size = str->length-length;
|
|
}
|
|
st = st_alloc(size);
|
|
if (st != NULL) {
|
|
st->length = size;
|
|
if (pos) memcpy(st->string,str->string,pos-1);
|
|
if (size+1-pos)
|
|
memcpy(&st->string[pos-1],&str->string[length+pos-1],size+1-pos);
|
|
}
|
|
return st;
|
|
}
|
|
|
|
STRING *replace(oldstring, newstring, s)
|
|
STRING *oldstring;
|
|
STRING *newstring;
|
|
STRING *s;
|
|
{
|
|
STRING *st;
|
|
int loc, size;
|
|
int oldsz, newsz;
|
|
loc = find(oldstring,s);
|
|
if (loc == 0) return cpystr(s);
|
|
oldsz = oldstring->length;
|
|
newsz = newstring->length;
|
|
size = s->length+newsz-oldsz;
|
|
st = st_alloc(size);
|
|
if (st != NULL) {
|
|
st->length = size;
|
|
memcpy(st->string,s->string,loc-1);
|
|
memcpy(&st->string[loc-1],newstring->string,newsz);
|
|
memcpy(&st->string[loc-1+newsz],&s->string[loc-1+oldsz],size-newsz-loc+1);
|
|
}
|
|
}
|
|
|
|
int find(substring, s)
|
|
STRING *substring;
|
|
STRING *s;
|
|
{
|
|
int limit, at, size;
|
|
if (s == NULL) return 0;
|
|
if (substring == NULL) return (s->length > 0) ? 1 : 0;
|
|
if (s->length == 0) return 0;
|
|
if (substring->length == 0) return 1;
|
|
limit = s->length - substring->length;
|
|
at = 0;
|
|
size = substring->length;
|
|
while (at <= limit) {
|
|
if (memcmp(&s->string[at],substring->string,size) == 0)
|
|
return at+1;
|
|
++at;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
STRING *cpystr(str)
|
|
STRING *str;
|
|
{
|
|
STRING *s;
|
|
int size;
|
|
if (str == NULL) size = 0; else size = str->length;
|
|
s = st_alloc(size);
|
|
if (s != NULL) {
|
|
s->length = size;
|
|
memcpy(s->string,str->string,size);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
int decodei(str)
|
|
STRING *str;
|
|
{
|
|
int sflag = 1, value = 0;
|
|
int len;
|
|
char c, *p;
|
|
if (str == NULL) return 0;
|
|
len = str->length;
|
|
p = str->string;
|
|
while (isspace(*p) && len != 0) ++p, --len;
|
|
if (len == 0) return 0;
|
|
if (*p == '+' || *p == '-') {
|
|
if (*p == '-') sflag = -1;
|
|
++p;
|
|
--len;
|
|
}
|
|
while (len--) {
|
|
if (*p > 47 && *p < 58) value = 10*value+(*p++ - 48);
|
|
else len = 0;
|
|
}
|
|
return value * sflag;
|
|
}
|
|
|
|
STRING *encodei(value)
|
|
int value;
|
|
{
|
|
STRING *st;
|
|
char *p;
|
|
char sign = ' ';
|
|
int i;
|
|
st = st_alloc(6);
|
|
if (st == NULL) return NULL;
|
|
st->length = 6;
|
|
if (value < 0) {
|
|
if (value == -32768) {
|
|
memcpy(st->string,"-32768",6);
|
|
return st;
|
|
}
|
|
sign = '-';
|
|
value = -value;
|
|
}
|
|
p = &st->string[5];
|
|
*p = (value % 10) + 48;
|
|
value /= 10;
|
|
for (i = 0; i < 5; ++i) {
|
|
if (value == 0) {
|
|
*--p = sign;
|
|
sign = ' ';
|
|
}
|
|
else {
|
|
*--p = (value % 10) + 48;
|
|
value /= 10;
|
|
}
|
|
}
|
|
return st;
|
|
}
|