Revert tracking chare constructor definitions in the grammar
[charm.git] / src / xlat-i / xi-util.h
1 #ifndef _XI_UTIL_H
2 #define _XI_UTIL_H
3
4 #include <iostream>
5 #include <string.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include "conv-config.h"
9
10 namespace xi {
11
12 #if CMK_ISATTY_DECL
13 #ifdef __cplusplus
14 extern "C" int isatty (int );
15 #endif
16 #endif
17
18 #define SZ 1024
19
20 class XStr {
21   private:
22     char *s;
23     unsigned int len, blklen;
24     void initTo(const char *_s);
25     void operator=(const XStr &str); //<- don't use this
26   public:
27     // MAB: following append methods were earlier private. However,
28     // in order to minimize changes to sdag translator, they have been made
29     // public. Once the sdag translator is fully embedded in charmxi,
30     // they will be made private again.
31     void append(const char *_s);
32     void append(char c);
33     // MAB: the print method is needed for debugging sdag translator.
34     // this too will go away later.
35     void print(int indent) {
36       for (int i=0; i<indent; i++) std::cout << "  ";
37       std::cout << get_string();
38     }
39     /// Appends character c to every line
40     void line_append(const char c);
41     /// pads with spaces and appends character c to every line. Also converts tabs to spaces.
42     void line_append_padding(const char c, int lineWidth=80);
43     // Replace all occurences of character "a" in string with character "b"
44     void replace (const char a, const char b);
45   public:
46     XStr();
47     XStr(const char *_s);
48     XStr(const XStr &_s); //Copy constructor
49     ~XStr() { delete[] s; }
50     char *get_string(void) const { return s; }
51     const char *get_string_const(void) const { return s; }
52     // this is to allow XStr to be substituted for CString in
53     // structured dagger translator without a lot of changes
54     char *charstar(void) const { return get_string(); }
55     //This operator allows us to use XStr's interchangably with char *'s:
56     operator char *() {return get_string();}
57     //Comparison operators
58     int operator==(XStr &s2) const {return 0==strcmp(s,s2.s);}
59     int operator!=(XStr &s2) const {return 0!=strcmp(s,s2.s);}
60     int operator==(const char *s2) const {return 0==strcmp(s,s2);}
61     int operator!=(const char *s2) const {return 0!=strcmp(s,s2);}
62     //Addition operator
63     XStr operator+ (const XStr &s2) const {XStr ret(*this);ret.append(s2.s); return ret;}
64     //Insertion operators
65     XStr& operator << (const char *_s) { append(_s); return *this;}
66 //      XStr& operator << (const string & _s) { append(_s.c_str()); return *this;}
67     XStr& operator << (char c) { append(c); return *this;}
68     XStr& operator << (int i) ;
69     XStr& operator << (const XStr& x) { append(x.get_string_const()); return *this; }
70     XStr& operator << (const XStr* x) { append(x->get_string_const()); return *this; }
71     void spew(const char*b, const char *a1 = 0, const char *a2 = 0, 
72               const char *a3 = 0, const char *a4 = 0, const char *a5 = 0);
73 };
74
75 #define endx "\n"
76
77 class Printable {
78   public:
79     virtual void print(XStr& str) = 0;
80     //This lets us cast printables to XStr
81     operator XStr () {XStr ret;print(ret);return ret;}
82     //These let us stream Printables to XStr.
83     friend XStr & operator << (XStr &str,Printable &p) {p.print(str);return str;}
84     friend XStr & operator << (XStr &str,Printable *p) {p->print(str);return str;}
85 };
86
87 void templateGuardBegin(bool templateOnly, XStr &str);
88 void templateGuardEnd(XStr &str);
89
90 }
91
92 #endif