186 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include "bc_string.h"
 | |
| 
 | |
| /* $Id$ */
 | |
| 
 | |
| #define ok(X)   \
 | |
| 	if (X == 0) \
 | |
| 		return;
 | |
| #define okr(X)  \
 | |
| 	if (X == 0) \
 | |
| 		return (0);
 | |
| 
 | |
| extern char* salloc();
 | |
| 
 | |
| int _length(String* str)
 | |
| {
 | |
| 	okr(str);
 | |
| 	return (str->strlength);
 | |
| }
 | |
| String* _newstr(char* str)
 | |
| {
 | |
| 	String* s;
 | |
| 	okr(str);
 | |
| 	s = (String*)salloc(sizeof(String));
 | |
| 	s->strcount = 1;
 | |
| 	s->strlength = strlen(str);
 | |
| 	s->strval = salloc(s->strlength + 1);
 | |
| 	strcpy(s->strval, str);
 | |
| 	return (s);
 | |
| }
 | |
| void _incstr(String* src)
 | |
| {
 | |
| 	/* one more variable uses the string */
 | |
| 	ok(src);
 | |
| 	src->strcount++;
 | |
| }
 | |
| void _decstr(String* str)
 | |
| {
 | |
| 	ok(str);
 | |
| 	/* Strings in ROM are initialized with this count */
 | |
| 	if (str->strcount == 9999)
 | |
| 		return;
 | |
| 	str->strcount--;
 | |
| 	if (str->strcount <= 0)
 | |
| 		_delstr(str);
 | |
| }
 | |
| void _strcpy(String* dst, String* src)
 | |
| {
 | |
| 	ok(src);
 | |
| 	ok(dst);
 | |
| 	_decstr(dst);
 | |
| 	*dst = *src;
 | |
| 	_incstr(src);
 | |
| }
 | |
| void _delstr(String* src)
 | |
| {
 | |
| 	ok(src);
 | |
| 	sfree(src->strval);
 | |
| 	sfree((char*)src);
 | |
| }
 | |
| String* _concat(String* s1, String* s2)
 | |
| {
 | |
| 	String* s;
 | |
| 	int length;
 | |
| 	okr(s1);
 | |
| 	okr(s2);
 | |
| 	s = (String*)salloc(sizeof(String));
 | |
| 	s->strlength = _length(s1) + _length(s2);
 | |
| 	s->strval = salloc(s->strlength + 1);
 | |
| 	s->strcount = 1;
 | |
| 	strcpy(s->strval, s2->strval);
 | |
| 	strcat(s->strval, s1->strval);
 | |
| 	return (s);
 | |
| }
 | |
| int _strcomp(String* s1, String* s2)
 | |
| {
 | |
| 	okr(s1);
 | |
| 	okr(s2);
 | |
| 	return (strcmp(s2->strval, s1->strval));
 | |
| }
 | |
| 
 | |
| String* _left(int size, String* s)
 | |
| {
 | |
| 	String* ns;
 | |
| 	int i;
 | |
| 
 | |
| 	okr(s);
 | |
| 	if (size < 0 || size > s->strlength)
 | |
| 		error(3);
 | |
| 	ns = (String*)salloc(sizeof(String));
 | |
| 	ns->strval = salloc(size + 1);
 | |
| 	ns->strcount = 1;
 | |
| 	for (i = 0; i < size && s->strval[i]; i++)
 | |
| 		ns->strval[i] = s->strval[i];
 | |
| 	ns->strval[i] = 0;
 | |
| 	ns->strlength = i;
 | |
| 	return (ns);
 | |
| }
 | |
| 
 | |
| String* _space(int d)
 | |
| {
 | |
| 	String* s;
 | |
| 	int i, len;
 | |
| 
 | |
| 	len = d;
 | |
| 	s = (String*)salloc(sizeof(String));
 | |
| 	s->strlength = len;
 | |
| 	s->strcount = 1;
 | |
| 	s->strval = salloc(len + 1);
 | |
| 	for (i = 0; i < len; i++)
 | |
| 		s->strval[i] = ' ';
 | |
| 	s->strval[i] = 0;
 | |
| 	return (s);
 | |
| }
 | |
| 
 | |
| String* _strascii(void)
 | |
| {
 | |
| }
 | |
| String* _string(double f, double d)
 | |
| {
 | |
| 	int i, j;
 | |
| 	String* s;
 | |
| 
 | |
| 	i = d;
 | |
| 	j = f;
 | |
| 	if (i < 0 || i > MAXSTRING)
 | |
| 		error(3);
 | |
| 	s = (String*)salloc(sizeof(String));
 | |
| 	s->strlength = i;
 | |
| 	s->strcount = 1;
 | |
| 	s->strval = salloc(i + 1);
 | |
| 	s->strval[i--] = 0;
 | |
| 	for (; i >= 0; i--)
 | |
| 		s->strval[i] = j;
 | |
| 	return (s);
 | |
| }
 | |
| void _midstmt(String* s2, int i1, int i2, String* s)
 | |
| {
 | |
| 	int l;
 | |
| 
 | |
| 	/*printf("mid called %d %d %s %s\n",i1,i2,s->strval, s2->strval);*/
 | |
| 	if (i2 < 0 || i1 < -1)
 | |
| 		error(3);
 | |
| 	if (s->strlength < i2 || s2->strlength < i1)
 | |
| 		error(3); /* source string too short */
 | |
| 	if (i1 == -1)
 | |
| 		i1 = s2->strlength;
 | |
| 	l = s->strlength - i2 + 1;
 | |
| 	if (i1 > l)
 | |
| 		i1 = l;
 | |
| 	strncpy(s->strval + i2 - 1, s2->strval, i1);
 | |
| }
 | |
| String* _mid(int i1, int i2, String* s)
 | |
| {
 | |
| 	int l;
 | |
| 	String* s2;
 | |
| 
 | |
| 	/*	printf("mid fcn called %d %d %s\n",i1,i2,s->strval);*/
 | |
| 	if (i2 < 0 || i1 < -1)
 | |
| 		return (s2); /* or error? */
 | |
| 	if (i1 == -1)
 | |
| 		i1 = s->strlength;
 | |
| 	s2 = _newstr(s->strval);
 | |
| 	s2->strval[0] = 0;
 | |
| 	if (s->strlength < i2)
 | |
| 		return (s2); /* source string too short */
 | |
| 	l = s->strlength - i2 + 1;
 | |
| 	if (i1 > l)
 | |
| 		i1 = l;
 | |
| 	strncpy(s2->strval, s->strval + i2 - 1, i1);
 | |
| 	s2->strval[i1] = 0;
 | |
| 	return (s2);
 | |
| }
 | |
| 
 | |
| String* _right(int length, String* str)
 | |
| {
 | |
| 	String* s;
 | |
| 	int i;
 | |
| 
 | |
| 	i = _length(str) - length;
 | |
| 	if (i < 0)
 | |
| 		i = 0;
 | |
| 	s = _newstr(str->strval + i);
 | |
| 	return (s);
 | |
| }
 |