int goc_memPipeReadChar(GOC_MemPipeStream* pipe) { int c = -1; CHECK_NULL(pipe); // sprawdzenie, czy mamy strumien danych wejsciowych if ( pipe->istream ) { c = goc_isReadChar(pipe->istream); // strumien danych wejsciowych jeszcze cos ma if ( c != -1 ) return c; // strumien wejsciowy skonczyl sie - zamknij go goc_isClose(pipe->istream); pipe->istream = NULL; } // czy mamy nastepne dane do odczytu if ( !pipe->ostream ) return -1; // zalozenie nowego strumienia wejsciowego z danych wyjsciowych pipe->istream = goc_memIStreamOpen( goc_memOStreamGet(pipe->ostream), goc_memOStreamSize(pipe->ostream)); // zamknij strumien do zapisu goc_osClose(pipe->ostream); pipe->ostream = NULL; // wykonaj ponowny odczyt z pipe return goc_memPipeReadChar(pipe); }
int main(int argc, char **argv) { GOC_IStream *is = NULL; GOC_OStream *os = NULL; int c; // unsigned char *pBuff; // unsigned int nBuff; char *line; if ( argc < 2 ) { GOC_ERROR("No input file name"); return -1; } os = goc_memOStreamOpen(); GOC_INFO("--- GOC_FileIStream test"); is = goc_fileIStreamOpen(argv[1]); // nBuff = goc_isAvailable(is); // pBuff = malloc(nBuff); GOC_BINFO("Available: %d\n", goc_isAvailable(is)); // nBuff = 0; while ( (c = goc_isReadChar(is)) > 0 ) { goc_osWriteByte(os, (unsigned char)c); // pBuff[nBuff++] = c; putchar(c); } goc_isClose(is); GOC_INFO("--- GOC_MemIStream test\n"); is = goc_memIStreamAttach(goc_memOStreamGet(os), goc_memOStreamSize(os)); // nBuff = goc_isAvailable(is); GOC_BINFO("Available: %d\n", goc_isAvailable(is)); while ( (c = goc_isReadChar(is)) > 0 ) putchar(c); goc_isClose(is); GOC_INFO("--- GOC_FileIStream readLine test"); is = goc_fileIStreamOpen(argv[1]); while ( (line = goc_isReadLine(is)) ) { printf("%s\n", line); } goc_isClose(is); return 0; }
int goc_memPipeReadArray(GOC_MemPipeStream *pipe, unsigned char *pBuffer, unsigned int nBuffer) { int c; int cnt = -1; CHECK_NULL(pipe); CHECK_NULL(pBuffer); // sprawdzenie, czy mamy strumien danych wejsciowych if ( pipe->istream ) { cnt = goc_isReadArray(pipe->istream, pBuffer, nBuffer); // strumien danych wejsciowych jeszcze cos ma if (( cnt != -1 ) && ( cnt == nBuffer )) return cnt; // strumien wejsciowy skonczyl sie - zamknij go goc_isClose(pipe->istream); pipe->istream = NULL; } // czy mamy nastepne dane do odczytu if ( !pipe->ostream ) return cnt; if ( cnt == -1 ) cnt ^= cnt; // zalozenie nowego strumienia wejsciowego z danych wyjsciowych pipe->istream = goc_memIStreamOpen( goc_memOStreamGet(pipe->ostream), goc_memOStreamSize(pipe->ostream)); // zamknij strumien do zapisu goc_osClose(pipe->ostream); pipe->ostream = NULL; // wykonaj dalszy odczyt danych c = goc_isReadArray(pipe->istream, pBuffer + cnt, nBuffer); if ( c > 0 ) cnt += c; if ( cnt < nBuffer ) { goc_isClose(pipe->istream); pipe->istream = NULL; } return cnt; }