string.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "bc_string.h"
  2. /* $Id$ */
  3. #define ok(X) if( X ==0) return;
  4. #define okr(X) if( X ==0) return(0);
  5. extern char *salloc() ;
  6. _length(str)
  7. String *str;
  8. {
  9. okr(str);
  10. return(str->strlength);
  11. }
  12. String *_newstr(str)
  13. char *str;
  14. {
  15. String *s;
  16. okr(str);
  17. s= (String *) salloc(sizeof(String));
  18. s->strcount=1;
  19. s->strlength= strlen(str);
  20. s->strval= salloc(s->strlength+1);
  21. strcpy(s->strval,str);
  22. return(s);
  23. }
  24. _incstr(src)
  25. String *src;
  26. {
  27. /* one more variable uses the string */
  28. ok(src);
  29. src->strcount++;
  30. }
  31. _decstr(str)
  32. String *str;
  33. {
  34. ok(str);
  35. /* Strings in ROM are initialized with this count */
  36. if ( str->strcount==9999 ) return ;
  37. str->strcount--;
  38. if(str->strcount<=0) _delstr(str);
  39. }
  40. _strcpy(dst,src)
  41. String *src,*dst;
  42. {
  43. ok(src);
  44. ok(dst);
  45. _decstr(dst);
  46. *dst = *src;
  47. _incstr(src);
  48. }
  49. _delstr(src)
  50. String *src;
  51. {
  52. ok(src);
  53. sfree(src->strval);
  54. sfree((char *)src);
  55. }
  56. String *_concat(s1,s2)
  57. String *s1,*s2;
  58. {
  59. String *s;
  60. int length;
  61. okr(s1); okr(s2);
  62. s= (String *) salloc(sizeof(String));
  63. s->strlength= _length(s1)+_length(s2);
  64. s->strval= salloc(s->strlength+1);
  65. s->strcount = 1;
  66. strcpy(s->strval,s2->strval);
  67. strcat(s->strval,s1->strval);
  68. return(s);
  69. }
  70. _strcomp(s1,s2)
  71. String *s1,*s2;
  72. {
  73. okr(s1);okr(s2);
  74. return(strcmp(s2->strval,s1->strval));
  75. }
  76. String *_left(size,s)
  77. String *s;
  78. int size;
  79. {
  80. String *ns;
  81. int i;
  82. okr(s);
  83. if( size <0 || size >s->strlength) error(3);
  84. ns= (String *) salloc(sizeof(String));
  85. ns->strval= salloc(size+1);
  86. ns->strcount=1;
  87. for(i=0; i<size && s->strval[i];i++)
  88. ns->strval[i]= s->strval[i];
  89. ns->strval[i]=0;
  90. ns->strlength= i;
  91. return(ns);
  92. }
  93. String *_space(d)
  94. int d;
  95. {
  96. String *s;
  97. int i,len;
  98. len= d;
  99. s= (String *) salloc(sizeof(String));
  100. s->strlength= len;
  101. s->strcount=1;
  102. s->strval= salloc(len+1);
  103. for(i=0;i<len;i++)
  104. s->strval[i]= ' ';
  105. s->strval[i]=0;
  106. return(s);
  107. }
  108. String *_strascii()
  109. {
  110. }
  111. String *_string(f, d)
  112. double d,f;
  113. {
  114. int i,j;
  115. String *s;
  116. i=d;j=f;
  117. if( i<0 || i>MAXSTRING) error(3);
  118. s= (String *) salloc(sizeof(String));
  119. s->strlength= i;
  120. s->strcount=1;
  121. s->strval= salloc(i+1);
  122. s->strval[i--]=0;
  123. for(; i>=0;i--)
  124. s->strval[i]= j;
  125. return(s);
  126. }
  127. _midstmt(s2,i1,i2,s)
  128. int i1,i2;
  129. String *s, *s2;
  130. {
  131. int l;
  132. /*printf("mid called %d %d %s %s\n",i1,i2,s->strval, s2->strval);*/
  133. if (i2 < 0 || i1 < -1) error(3);
  134. if( s->strlength<i2 || s2->strlength < i1) error(3); /* source string too short */
  135. if( i1== -1) i1= s2->strlength;
  136. l= s->strlength - i2+1;
  137. if( i1>l ) i1=l;
  138. strncpy(s->strval+i2-1,s2->strval,i1);
  139. }
  140. String *_mid(i1,i2,s)
  141. int i1,i2;
  142. String *s;
  143. {
  144. int l;
  145. String *s2;
  146. /* printf("mid fcn called %d %d %s\n",i1,i2,s->strval);*/
  147. if (i2 < 0 || i1 < -1) return(s2); /* or error? */
  148. if( i1 == -1) i1= s->strlength;
  149. s2= _newstr(s->strval);
  150. s2->strval[0]=0;
  151. if( s->strlength<i2) return(s2); /* source string too short */
  152. l= s->strlength - i2+1;
  153. if( i1>l ) i1=l;
  154. strncpy(s2->strval,s->strval+i2-1,i1);
  155. s2->strval[i1]=0;
  156. return(s2);
  157. }
  158. String *_right(length,str)
  159. String *str;
  160. int length;
  161. {
  162. String *s;
  163. int i;
  164. i= _length(str)-length;
  165. if(i<0) i=0;
  166. s= _newstr(str->strval+i);
  167. return(s);
  168. }