bbbank.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "std.h"
  2. #include "bbbank.h"
  3. #include "bbstream.h"
  4. struct bbBank{
  5. char *data;
  6. int size,capacity;
  7. bbBank( int sz ):size(sz){
  8. capacity=(size+15)&~15;
  9. data=d_new char[capacity];
  10. memset( data,0,size );
  11. }
  12. virtual ~bbBank(){
  13. delete[] data;
  14. }
  15. void resize( int n ){
  16. if( n>size ){
  17. if( n>capacity ){
  18. capacity=capacity*3/2;
  19. if( n>capacity ) capacity=n;
  20. capacity=(capacity+15)&~15;
  21. char *p=d_new char[capacity];
  22. memcpy( p,data,size );
  23. delete[] data;
  24. data=p;
  25. }else memset( data+size,0,n-size );
  26. }
  27. size=n;
  28. }
  29. };
  30. static set<bbBank*> bank_set;
  31. static inline void debugBank( bbBank *b ){
  32. if( debug ){
  33. if( !bank_set.count( b ) ) RTEX( "bbBank does not exist" );
  34. }
  35. }
  36. static inline void debugBank( bbBank *b,int offset ){
  37. if( debug ){
  38. debugBank( b );
  39. if( offset>=b->size ) RTEX( "Offset out of range" );
  40. }
  41. }
  42. bbBank *bbCreateBank( int size ){
  43. bbBank *b=d_new bbBank( size );
  44. bank_set.insert( b );
  45. return b;
  46. }
  47. void bbFreeBank( bbBank *b ){
  48. if( bank_set.erase( b ) ) delete b;
  49. }
  50. int bbBankSize( bbBank *b ){
  51. debugBank( b );
  52. return b->size;
  53. }
  54. void bbResizeBank( bbBank *b,int size ){
  55. debugBank( b );
  56. b->resize( size );
  57. }
  58. void bbCopyBank( bbBank *src,int src_p,bbBank *dest,int dest_p,int count ){
  59. if( debug ){ debugBank( src,src_p+count-1 );debugBank( dest,dest_p+count-1 ); }
  60. memmove( dest->data+dest_p,src->data+src_p,count );
  61. }
  62. int bbPeekByte( bbBank *b,int offset ){
  63. debugBank( b,offset );
  64. return *(unsigned char*)(b->data+offset);
  65. }
  66. int bbPeekShort( bbBank *b,int offset ){
  67. debugBank( b,offset+1 );
  68. return *(unsigned short*)(b->data+offset);
  69. }
  70. int bbPeekInt( bbBank *b,int offset ){
  71. debugBank( b,offset+3 );
  72. return *(int*)(b->data+offset);
  73. }
  74. float bbPeekFloat( bbBank *b,int offset ){
  75. debugBank( b,offset+3 );
  76. return *(float*)(b->data+offset);
  77. }
  78. void bbPokeByte( bbBank *b,int offset,int value ){
  79. debugBank( b,offset );
  80. *(char*)(b->data+offset)=value;
  81. }
  82. void bbPokeShort( bbBank *b,int offset,int value ){
  83. debugBank( b,offset );
  84. *(unsigned short*)(b->data+offset)=value;
  85. }
  86. void bbPokeInt( bbBank *b,int offset,int value ){
  87. debugBank( b,offset );
  88. *(int*)(b->data+offset)=value;
  89. }
  90. void bbPokeFloat( bbBank *b,int offset,float value ){
  91. debugBank( b,offset );
  92. *(float*)(b->data+offset)=value;
  93. }
  94. int bbReadBytes( bbBank *b,bbStream *s,int offset,int count ){
  95. if( debug ){
  96. debugBank( b,offset+count-1 );
  97. debugStream( s );
  98. }
  99. return s->read( b->data+offset,count );
  100. }
  101. int bbWriteBytes( bbBank *b,bbStream *s,int offset,int count ){
  102. if( debug ){
  103. debugBank( b,offset+count-1 );
  104. debugStream( s );
  105. }
  106. return s->write( b->data+offset,count );
  107. }
  108. int bbCallDLL( BBStr *dll,BBStr *fun,bbBank *in,bbBank *out ){
  109. if( debug ){
  110. if( in ) debugBank( in );
  111. if( out ) debugBank( out );
  112. }
  113. int t=gx_runtime->callDll( *dll,*fun,
  114. in ? in->data : 0,in ? in->size : 0,
  115. out ? out->data : 0,out ? out->size : 0 );
  116. delete dll;delete fun;
  117. return t;
  118. }
  119. bool bank_create(){
  120. return true;
  121. }
  122. bool bank_destroy(){
  123. while( bank_set.size() ) bbFreeBank( *bank_set.begin() );
  124. return true;
  125. }
  126. void bank_link( void(*rtSym)(const char*,void*) ){
  127. rtSym( "%CreateBank%size=0",bbCreateBank );
  128. rtSym( "FreeBank%bank",bbFreeBank );
  129. rtSym( "%BankSize%bank",bbBankSize );
  130. rtSym( "ResizeBank%bank%size",bbResizeBank );
  131. rtSym( "CopyBank%src_bank%src_offset%dest_bank%dest_offset%count",bbCopyBank );
  132. rtSym( "%PeekByte%bank%offset",bbPeekByte );
  133. rtSym( "%PeekShort%bank%offset",bbPeekShort );
  134. rtSym( "%PeekInt%bank%offset",bbPeekInt );
  135. rtSym( "#PeekFloat%bank%offset",bbPeekFloat );
  136. rtSym( "PokeByte%bank%offset%value",bbPokeByte );
  137. rtSym( "PokeShort%bank%offset%value",bbPokeShort );
  138. rtSym( "PokeInt%bank%offset%value",bbPokeInt );
  139. rtSym( "PokeFloat%bank%offset#value",bbPokeFloat );
  140. rtSym( "%ReadBytes%bank%file%offset%count",bbReadBytes );
  141. rtSym( "%WriteBytes%bank%file%offset%count",bbWriteBytes );
  142. rtSym( "%CallDLL$dll_name$func_name%in_bank=0%out_bank=0",bbCallDLL );
  143. }