Merge nodehelper lib and example codes into charm
[charm.git] / src / xlat-i / xi-util.C
1 #include "xi-util.h"
2
3 namespace xi {
4
5 void 
6 XStr::append(const char *_s) 
7 {
8   len += strlen(_s);
9   if ( len >= blklen) {
10     while ( len >= blklen ) {
11       blklen += SZ;
12     }
13     char *tmp = s;
14     s = new char[blklen];
15     strcpy(s, tmp);
16     delete[] tmp;
17   }
18   strcat(s, _s);
19 }
20
21 void 
22 XStr::append(char c) 
23 {
24   char tmp[2];
25   tmp[0] = c;
26   tmp[1] = '\0';
27   append(tmp);
28 }
29
30 void XStr::initTo(const char *_s)
31 {
32   len = strlen(_s);
33   blklen = SZ;
34   while ( len >= blklen ) {
35     blklen += SZ;
36   }
37   s = new char[blklen];
38   strcpy(s, _s);
39 }
40
41 XStr::XStr() {initTo("");}
42 XStr::XStr(const char *_s) {initTo(_s);}
43 XStr::XStr(const XStr &_s) {initTo(_s.get_string_const());}
44
45 XStr& XStr::operator << (int i) {
46       char tmp[100]; 
47       sprintf(tmp, "%d", i); 
48       append(tmp); 
49       return *this;
50 }
51
52 void XStr::line_append(const char c)
53 {
54   XStr xs;
55   for(unsigned int i=0; i<len; i++) {
56     if(s[i] == '\n')
57       xs << c << "\n";
58     else
59       xs << s[i];
60   }
61   delete[] s;
62   initTo(xs.charstar());
63 }
64
65 void XStr::line_append_padding(const char c, int lineWidth)
66 {
67   XStr xs;
68   int count = 0;
69
70   for(unsigned int i=0; i<len; i++) {
71     if(s[i] == '\n'){
72       // found line ending
73       while(count++ < lineWidth-1)
74         xs << " ";
75       xs << c << "\n";
76       count=0;
77     } else if(s[i] == '\t') {
78       // found tab, convert to 2 spaces
79       xs << "  ";
80       count+=2;
81     } else {
82       // found non-line ending
83       xs << s[i];
84       count++;
85     }
86   }
87   delete[] s;
88   initTo(xs.charstar());
89 }
90
91
92
93 void 
94 XStr::spew(const char*b, const char *a1, const char *a2, const char *a3, 
95            const char *a4, const char *a5)
96 {
97   using std::cout;
98   int i,length=strlen(b);
99   for(i=0; i<length; i++){
100     switch(b[i]){
101     case '\001':
102       if(a1==0) {cout << "Internal Error\n"; abort();} append(a1); break;
103     case '\002':
104       if(a2==0) {cout << "Internal Error\n"; abort();} append(a2); break;
105     case '\003':
106       if(a3==0) {cout << "Internal Error\n"; abort();} append(a3); break;
107     case '\004':
108       if(a4==0) {cout << "Internal Error\n"; abort();} append(a4); break;
109     case '\005':
110       if(a5==0) {cout << "Internal Error\n"; abort();} append(a5); break;
111     default:
112       append(b[i]);
113     }
114   }
115 }
116
117 void XStr::replace (const char a, const char b) {
118   for(unsigned int i=0; i<len; i++) {
119     if (s[i] == a) s[i] = b;
120   }
121 }
122
123 }