bbstream.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "std.h"
  2. #include "bbstream.h"
  3. static set<bbStream*> stream_set;
  4. void debugStream( bbStream *s ){
  5. if( stream_set.count(s) ) return;
  6. RTEX( "Stream does not exist" );
  7. }
  8. bbStream::bbStream(){
  9. stream_set.insert( this );
  10. }
  11. bbStream::~bbStream(){
  12. stream_set.erase( this );
  13. }
  14. int bbEof( bbStream *s ){
  15. if( debug ) debugStream( s );
  16. return s->eof();
  17. }
  18. int bbReadAvail( bbStream *s ){
  19. if( debug ) debugStream( s );
  20. return s->avail();
  21. }
  22. int bbReadByte( bbStream *s ){
  23. if( debug ) debugStream( s );
  24. int n=0;
  25. s->read( (char*)&n,1 );
  26. return n;
  27. }
  28. int bbReadShort( bbStream *s ){
  29. if( debug ) debugStream( s );
  30. int n=0;
  31. s->read( (char*)&n,2 );
  32. return n;
  33. }
  34. int bbReadInt( bbStream *s ){
  35. if( debug ) debugStream( s );
  36. int n=0;
  37. s->read( (char*)&n,4 );
  38. return n;
  39. }
  40. float bbReadFloat( bbStream *s ){
  41. if( debug ) debugStream( s );
  42. float n=0;
  43. s->read( (char*)&n,4 );
  44. return n;
  45. }
  46. BBStr *bbReadString( bbStream *s ){
  47. if( debug ) debugStream( s );
  48. int len;
  49. BBStr *str=d_new BBStr();
  50. if( s->read( (char*)&len,4 ) ){
  51. char *buff=d_new char[len];
  52. if( s->read( buff,len ) ){
  53. *str=string( buff,len );
  54. }
  55. delete[] buff;
  56. }
  57. return str;
  58. }
  59. BBStr *bbReadLine( bbStream *s ){
  60. if( debug ) debugStream( s );
  61. unsigned char c;
  62. BBStr *str=d_new BBStr();
  63. for(;;){
  64. if( s->read( (char*)&c,1 )!=1 ) break;
  65. if( c=='\n' ) break;
  66. if( c!='\r' ) *str+=c;
  67. }
  68. return str;
  69. }
  70. void bbWriteByte( bbStream *s,int n ){
  71. if( debug ) debugStream( s );
  72. s->write( (char*)&n,1 );
  73. }
  74. void bbWriteShort( bbStream *s,int n ){
  75. if( debug ) debugStream( s );
  76. s->write( (char*)&n,2 );
  77. }
  78. void bbWriteInt( bbStream *s,int n ){
  79. if( debug ) debugStream( s );
  80. s->write( (char*)&n,4 );
  81. }
  82. void bbWriteFloat( bbStream *s,float n ){
  83. if( debug ) debugStream( s );
  84. s->write( (char*)&n,4 );
  85. }
  86. void bbWriteString( bbStream *s,BBStr *t ){
  87. if( debug ) debugStream( s );
  88. int n=t->size();
  89. s->write( (char*)&n,4 );
  90. s->write( t->data(),t->size() );
  91. delete t;
  92. }
  93. void bbWriteLine( bbStream *s,BBStr *t ){
  94. if( debug ) debugStream( s );
  95. s->write( t->data(),t->size() );
  96. s->write( "\r\n",2 );
  97. delete t;
  98. }
  99. void bbCopyStream( bbStream *s,bbStream *d,int buff_size ){
  100. if( debug ){
  101. debugStream( s );debugStream( d );
  102. if( buff_size<1 || buff_size>1024*1024 ) RTEX( "Illegal buffer size" );
  103. }
  104. char *buff=d_new char[buff_size];
  105. while( s->eof()==0 && d->eof()==0 ){
  106. int n=s->read( buff,buff_size );
  107. d->write( buff,n );
  108. if( n<buff_size ) break;
  109. }
  110. delete buff;
  111. }
  112. bool stream_create(){
  113. return true;
  114. }
  115. bool stream_destroy(){
  116. return true;
  117. }
  118. void stream_link( void(*rtSym)(const char*,void*) ){
  119. rtSym( "%Eof%stream",bbEof );
  120. rtSym( "%ReadAvail%stream",bbReadAvail );
  121. rtSym( "%ReadByte%stream",bbReadByte );
  122. rtSym( "%ReadShort%stream",bbReadShort );
  123. rtSym( "%ReadInt%stream",bbReadInt );
  124. rtSym( "#ReadFloat%stream",bbReadFloat );
  125. rtSym( "$ReadString%stream",bbReadString );
  126. rtSym( "$ReadLine%stream",bbReadLine );
  127. rtSym( "WriteByte%stream%byte",bbWriteByte );
  128. rtSym( "WriteShort%stream%short",bbWriteShort );
  129. rtSym( "WriteInt%stream%int",bbWriteInt );
  130. rtSym( "WriteFloat%stream#float",bbWriteFloat );
  131. rtSym( "WriteString%stream$string",bbWriteString );
  132. rtSym( "WriteLine%stream$string",bbWriteLine );
  133. rtSym( "CopyStream%src_stream%dest_stream%buffer_size=16384",bbCopyStream );
  134. }