Charj: Construct Range when a range is given.
[charm.git] / src / langs / streams / MStream.C
1 #include "Communicate.h"
2 #include "MStream.h"
3 #include <string.h>
4
5 MIStream::MIStream(Communicate *c, int p, int t)
6 {
7   cobj = c;
8   PE = p;
9   tag = t;
10   msg = (StreamMessage *) 0;
11 }
12
13 MIStream::~MIStream()
14 {
15   if(msg!=0)
16     CmiFree(msg);
17 }
18
19 MOStream::MOStream(Communicate *c, int p, int t, unsigned int size)
20 {
21   cobj = c;
22   PE = p;
23   tag = t;
24   bufLen = size;
25   msgBuf = (StreamMessage *)CmiAlloc(sizeof(StreamMessage)+size);
26   msgBuf->PE = CmiMyPe();
27   msgBuf->tag = tag;
28   msgBuf->len = 0;
29   msgBuf->isLast = 0;
30 }
31
32 MOStream::~MOStream()
33 {
34   if(msgBuf != 0)
35     end();
36 }
37
38 MIStream *MIStream::Get(char *buf, int len)
39 {
40   while(len) {
41     if(msg==0) {
42       msg = (StreamMessage *) cobj->getMessage(PE, tag);
43       currentPos = 0;
44     }
45     if(currentPos+len <= msg->len) {
46       memcpy(buf, &(msg->data[currentPos]), len);
47       currentPos += len;
48       len = 0;
49     } else {
50       int b = msg->len-currentPos;
51       memcpy(buf, &(msg->data[currentPos]), b);
52       len -= b;
53       buf += b;
54       currentPos += b;
55     }
56     if(currentPos == msg->len) {
57       CmiFree(msg);
58       msg = 0;
59     }
60   }
61   return this;
62 }
63
64 MOStream *MOStream::Put(char *buf, int len)
65 {
66   while(len) {
67     if(msgBuf->len + len <= bufLen) {
68       memcpy(&(msgBuf->data[msgBuf->len]), buf, len);
69       msgBuf->len += len;
70       len = 0;
71     } else {
72       int b = bufLen - msgBuf->len;
73       memcpy(&(msgBuf->data[msgBuf->len]), buf, b);
74       msgBuf->len = bufLen;
75       cobj->sendMessage(PE, (void *)msgBuf, bufLen+sizeof(StreamMessage));
76       msgBuf->len = 0;
77       msgBuf->isLast = 0;
78       len -= b;
79       buf += b;
80     }
81   }
82   return this;
83 }
84
85 void MOStream::end(void)
86 {
87   msgBuf->isLast = 1;
88   cobj->sendMessage(PE,(void*)msgBuf,msgBuf->len+sizeof(StreamMessage));
89   msgBuf->len = 0;
90   msgBuf->isLast = 0;
91 }
92