bbstring.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "std.h"
  2. #include "bbsys.h"
  3. #include <time.h>
  4. #define CHKPOS(x) if( (x)<0 ) RTEX( "parameter must be positive" );
  5. #define CHKOFF(x) if( (x)<=0 ) RTEX( "parameter must be greater than 0" );
  6. BBStr *bbString( BBStr *s,int n ){
  7. BBStr *t=d_new BBStr();
  8. while( n-->0 ) *t+=*s;
  9. delete s;return t;
  10. }
  11. BBStr *bbLeft( BBStr *s,int n ){
  12. CHKPOS( n );
  13. *s=s->substr( 0,n );return s;
  14. }
  15. BBStr *bbRight( BBStr *s,int n ){
  16. CHKPOS( n );
  17. n=s->size()-n;if( n<0 ) n=0;
  18. *s=s->substr( n );return s;
  19. }
  20. BBStr *bbReplace( BBStr *s,BBStr *from,BBStr *to ){
  21. int n=0,from_sz=from->size(),to_sz=to->size();
  22. while( n<s->size() && (n=s->find( *from,n ))!=string::npos ){
  23. s->replace( n,from_sz,*to );
  24. n+=to_sz;
  25. }
  26. delete from;delete to;return s;
  27. }
  28. int bbInstr( BBStr *s,BBStr *t,int from ){
  29. CHKOFF( from );--from;
  30. int n=s->find( *t,from );
  31. delete s;delete t;
  32. return n==string::npos ? 0 : n+1;
  33. }
  34. BBStr *bbMid( BBStr *s,int o,int n ){
  35. CHKOFF( o );--o;
  36. if( o>s->size() ) o=s->size();
  37. if( n>=0 ) *s=s->substr( o,n );
  38. else *s=s->substr( o );
  39. return s;
  40. }
  41. BBStr *bbUpper( BBStr *s ){
  42. for( int k=0;k<s->size();++k ) (*s)[k]=toupper( (*s)[k] );
  43. return s;
  44. }
  45. BBStr *bbLower( BBStr *s ){
  46. for( int k=0;k<s->size();++k ) (*s)[k]=tolower( (*s)[k] );
  47. return s;
  48. }
  49. BBStr *bbTrim( BBStr *s ){
  50. int n=0,p=s->size();
  51. while( n<s->size() && !isgraph( (*s)[n] ) ) ++n;
  52. while( p>n && !isgraph( (*s)[p-1] ) ) --p;
  53. *s=s->substr( n,p-n );return s;
  54. }
  55. BBStr *bbLSet( BBStr *s,int n ){
  56. CHKPOS(n);
  57. if( s->size()>n ) *s=s->substr( 0,n );
  58. else{
  59. while( s->size()<n ) *s+=' ';
  60. }
  61. return s;
  62. }
  63. BBStr *bbRSet( BBStr *s,int n ){
  64. CHKPOS(n);
  65. if( s->size()>n ) *s=s->substr( s->size()-n );
  66. else{
  67. while( s->size()<n ) *s=' '+*s;
  68. }
  69. return s;
  70. }
  71. BBStr *bbChr( int n ){
  72. BBStr *t=d_new BBStr();
  73. *t+=(char)n;return t;
  74. }
  75. BBStr *bbHex( int n ){
  76. char buff[12];
  77. for( int k=7;k>=0;n>>=4,--k ){
  78. int t=(n&15)+'0';
  79. buff[k]=t>'9' ? t+='A'-'9'-1 : t;
  80. }
  81. buff[8]=0;
  82. return d_new BBStr( buff );
  83. }
  84. BBStr *bbBin( int n ){
  85. char buff[36];
  86. for( int k=31;k>=0;n>>=1,--k ){
  87. buff[k]=n&1 ? '1' : '0';
  88. }
  89. buff[32]=0;
  90. return d_new BBStr( buff );
  91. }
  92. int bbAsc( BBStr *s ){
  93. int n=s->size() ? (*s)[0] & 255 : -1;
  94. delete s;return n;
  95. }
  96. int bbLen( BBStr *s ){
  97. int n=s->size();
  98. delete s;return n;
  99. }
  100. BBStr *bbCurrentDate(){
  101. time_t t;
  102. time( &t );
  103. char buff[256];
  104. strftime( buff,256,"%d %b %Y",localtime( &t ) );
  105. return d_new BBStr( buff );
  106. }
  107. BBStr *bbCurrentTime(){
  108. time_t t;
  109. time( &t );
  110. char buff[256];
  111. strftime( buff,256,"%H:%M:%S",localtime( &t ) );
  112. return d_new BBStr( buff );
  113. }
  114. bool string_create(){
  115. return true;
  116. }
  117. bool string_destroy(){
  118. return true;
  119. }
  120. void string_link( void(*rtSym)(const char*,void*) ){
  121. rtSym( "$String$string%repeat",bbString );
  122. rtSym( "$Left$string%count",bbLeft );
  123. rtSym( "$Right$string%count",bbRight );
  124. rtSym( "$Replace$string$from$to",bbReplace );
  125. rtSym( "%Instr$string$find%from=1",bbInstr );
  126. rtSym( "$Mid$string%start%count=-1",bbMid );
  127. rtSym( "$Upper$string",bbUpper );
  128. rtSym( "$Lower$string",bbLower );
  129. rtSym( "$Trim$string",bbTrim );
  130. rtSym( "$LSet$string%size",bbLSet );
  131. rtSym( "$RSet$string%size",bbRSet );
  132. rtSym( "$Chr%ascii",bbChr );
  133. rtSym( "%Asc$string",bbAsc );
  134. rtSym( "%Len$string",bbLen );
  135. rtSym( "$Hex%value",bbHex );
  136. rtSym( "$Bin%value",bbBin );
  137. rtSym( "$CurrentDate",bbCurrentDate );
  138. rtSym( "$CurrentTime",bbCurrentTime );
  139. }