180b7b0aaSCameron Smith #include <stdlib.h>
2a486e66cSCameron Smith #include <string>
3a486e66cSCameron Smith #include <sstream>
4a486e66cSCameron Smith #include <phastaIO.h>
5*8f9016f6SCameron Smith #include "phiotimer.h" //phastaio_add[Open|Close]Time
6ecf8d2a9SCameron Smith #include "phio_stream.h"
710a6d6f7SCameron Smith
810a6d6f7SCameron Smith #define PHIO_STREAM_TRACING 0
9a486e66cSCameron Smith namespace {
appendPosix(const char * phrase)10a486e66cSCameron Smith std::string appendPosix(const char* phrase) {
11a486e66cSCameron Smith std::stringstream ss;
12a486e66cSCameron Smith ss << phrase << "?";
13a486e66cSCameron Smith return ss.str();
14a486e66cSCameron Smith }
traceEnter(const char * key,const char * aux="")15a486e66cSCameron Smith void traceEnter(const char* key, const char* aux="") {
1610a6d6f7SCameron Smith if(PHIO_STREAM_TRACING)
17a486e66cSCameron Smith fprintf(stderr, "CAKE entering %s %s\n", key, aux);
18a486e66cSCameron Smith }
traceExit(const char * key)19a486e66cSCameron Smith void traceExit(const char* key) {
2010a6d6f7SCameron Smith if(PHIO_STREAM_TRACING)
21a486e66cSCameron Smith fprintf(stderr, "CAKE exiting %s\n", key);
22a486e66cSCameron Smith }
23a486e66cSCameron Smith }
24a486e66cSCameron Smith
stream_openfile(const char filename[],phio_fp f)25ecf8d2a9SCameron Smith void stream_openfile(
26ecf8d2a9SCameron Smith const char filename[],
27ecf8d2a9SCameron Smith phio_fp f) {
28a486e66cSCameron Smith traceEnter(__func__, filename);
29ecf8d2a9SCameron Smith stream_fp sf = (stream_fp) f;
30*8f9016f6SCameron Smith phastaioTime t0,t1;
3163735940SCameron Smith phastaio_time(&t0);
32ecf8d2a9SCameron Smith if(sf->mode == 'w' && sf->rs != NULL)
33ecf8d2a9SCameron Smith sf->file = (int*) openRStreamWrite(sf->rs);
344f733f0bSCameron Smith else if(sf->mode == 'r' && sf->rs != NULL)
354f733f0bSCameron Smith sf->file = (int*) openRStreamRead(sf->rs);
36ecf8d2a9SCameron Smith else if(sf->mode == 'r' && sf->grs != NULL)
37ecf8d2a9SCameron Smith sf->file = (int*) openGRStreamRead(sf->grs, filename);
38ecf8d2a9SCameron Smith else
39ecf8d2a9SCameron Smith fprintf(stderr,
40ecf8d2a9SCameron Smith "ERROR %s type of stream %s is unknown... exiting\n",
41ecf8d2a9SCameron Smith __func__, filename);
4263735940SCameron Smith phastaio_time(&t1);
4363735940SCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1);
4463735940SCameron Smith phastaio_addOpenTime(elapsed);
45a486e66cSCameron Smith traceExit(__func__);
46a486e66cSCameron Smith }
47ea868eb1SCameron Smith
stream_readheader(int * fileDescriptor,const char keyphrase[],void * valueArray,int * nItems,const char datatype[],const char iotype[])48a486e66cSCameron Smith void stream_readheader(
49a486e66cSCameron Smith int* fileDescriptor,
50a486e66cSCameron Smith const char keyphrase[],
51a486e66cSCameron Smith void* valueArray,
52a486e66cSCameron Smith int* nItems,
53a486e66cSCameron Smith const char datatype[],
54a486e66cSCameron Smith const char iotype[] ) {
55a486e66cSCameron Smith traceEnter(__func__, keyphrase);
56f03ad52dSCameron Smith readHeader((FILE*)fileDescriptor, keyphrase,
57a486e66cSCameron Smith (int*)valueArray, *nItems, iotype);
58a486e66cSCameron Smith traceExit(__func__);
59a486e66cSCameron Smith }
60a486e66cSCameron Smith
stream_writeheader(const int * fileDescriptor,const char keyphrase[],const void * valueArray,const int * nItems,const int * ndataItems,const char datatype[],const char iotype[])61ea868eb1SCameron Smith void stream_writeheader(
62ea868eb1SCameron Smith const int* fileDescriptor,
63ea868eb1SCameron Smith const char keyphrase[],
64ea868eb1SCameron Smith const void* valueArray,
65ea868eb1SCameron Smith const int* nItems,
66ea868eb1SCameron Smith const int* ndataItems,
67ea868eb1SCameron Smith const char datatype[],
68ea868eb1SCameron Smith const char iotype[] ) {
69ea868eb1SCameron Smith traceEnter(__func__, keyphrase);
70f03ad52dSCameron Smith writeHeader((FILE*)fileDescriptor, keyphrase,
71ea868eb1SCameron Smith (int*)valueArray, *nItems, *ndataItems, datatype, iotype);
72ea868eb1SCameron Smith traceExit(__func__);
73ea868eb1SCameron Smith }
74ea868eb1SCameron Smith
stream_readdatablock(int * fileDescriptor,const char *,void * valueArray,int * nItems,const char datatype[],const char iotype[])75a486e66cSCameron Smith void stream_readdatablock(
76a486e66cSCameron Smith int* fileDescriptor,
77a486e66cSCameron Smith const char*,
78a486e66cSCameron Smith void* valueArray,
79a486e66cSCameron Smith int* nItems,
80a486e66cSCameron Smith const char datatype[],
81a486e66cSCameron Smith const char iotype[] ) {
82a486e66cSCameron Smith traceEnter(__func__);
83a486e66cSCameron Smith readDataBlock((FILE*)fileDescriptor, valueArray, *nItems,
84a486e66cSCameron Smith datatype, iotype);
85a486e66cSCameron Smith traceExit(__func__);
86ecf8d2a9SCameron Smith }
87ecf8d2a9SCameron Smith
stream_writedatablock(const int * fileDescriptor,const char *,const void * valueArray,const int * nItems,const char datatype[],const char iotype[])88ea868eb1SCameron Smith void stream_writedatablock(
89ea868eb1SCameron Smith const int* fileDescriptor,
90ea868eb1SCameron Smith const char*,
91ea868eb1SCameron Smith const void* valueArray,
92ea868eb1SCameron Smith const int* nItems,
93ea868eb1SCameron Smith const char datatype[],
94ea868eb1SCameron Smith const char iotype[]) {
95ea868eb1SCameron Smith traceEnter(__func__);
96ea868eb1SCameron Smith writeDataBlock((FILE*)fileDescriptor, valueArray,
97ea868eb1SCameron Smith *nItems, datatype, iotype);
98ea868eb1SCameron Smith traceExit(__func__);
99ea868eb1SCameron Smith }
100ea868eb1SCameron Smith
stream_closefile(phio_fp f)101ecf8d2a9SCameron Smith void stream_closefile(phio_fp f) {
102a486e66cSCameron Smith traceEnter(__func__);
103ecf8d2a9SCameron Smith stream_fp sf = (stream_fp) f;
104*8f9016f6SCameron Smith phastaioTime t0,t1;
10563735940SCameron Smith phastaio_time(&t0);
106ecf8d2a9SCameron Smith fclose((FILE*)sf->file);
10763735940SCameron Smith phastaio_time(&t1);
10863735940SCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1);
10963735940SCameron Smith phastaio_addCloseTime(elapsed);
11080b7b0aaSCameron Smith free(f);
111a486e66cSCameron Smith traceExit(__func__);
112ecf8d2a9SCameron Smith }
113ecf8d2a9SCameron Smith
stream_constructname(const char * in,char * out)114ecf8d2a9SCameron Smith void stream_constructname(const char* in, char* out) {
115a486e66cSCameron Smith traceEnter(__func__);
116ecf8d2a9SCameron Smith sprintf(out, "%s", in);
117a486e66cSCameron Smith traceExit(__func__);
118ecf8d2a9SCameron Smith }
119