00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _XI_UTIL_H
00009 #define _XI_UTIL_H
00010
00011 #include <string.h>
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 #include "conv-config.h"
00015
00016 #if CMK_STL_USE_DOT_H
00017 # include <iostream.h>
00018 #else
00019 # include <iostream>
00020 using namespace std;
00021 #endif
00022
00023
00024 #define SZ 1024
00025
00026 class XStr {
00027 private:
00028 char *s;
00029 unsigned int len, blklen;
00030 void initTo(const char *_s);
00031 void operator=(const XStr &str);
00032 public:
00033
00034
00035
00036
00037 void append(const char *_s);
00038 void append(char c);
00039
00040
00041 void print(int indent) {
00042 for (int i=0; i<indent; i++) cout << " ";
00043 cout << get_string();
00044 }
00045
00046
00047 void line_append(const char c);
00048
00049 void replace (const char a, const char b);
00050 public:
00051 XStr();
00052 XStr(const char *_s);
00053 XStr(const XStr &_s);
00054 ~XStr() { delete[] s; }
00055 char *get_string(void) { return s; }
00056 const char *get_string_const(void) const { return s; }
00057
00058
00059 char *charstar(void) { return get_string(); }
00060
00061 operator char *() {return get_string();}
00062
00063 int operator==(XStr &s2) const {return 0==strcmp(s,s2.s);}
00064 int operator!=(XStr &s2) const {return 0!=strcmp(s,s2.s);}
00065 int operator==(const char *s2) const {return 0==strcmp(s,s2);}
00066 int operator!=(const char *s2) const {return 0!=strcmp(s,s2);}
00067
00068 XStr operator+ (const XStr &s2) const {XStr ret(*this);ret.append(s2.s); return ret;}
00069
00070 XStr& operator << (const char *_s) { append(_s); return *this;}
00071
00072 XStr& operator << (char c) { append(c); return *this;}
00073 XStr& operator << (int i) ;
00074 XStr& operator << (const XStr& x) { append(x.get_string_const()); return *this; }
00075 void spew(const char*b, const char *a1 = 0, const char *a2 = 0,
00076 const char *a3 = 0, const char *a4 = 0, const char *a5 = 0);
00077 };
00078
00079 #define endx "\n"
00080
00081 class Printable {
00082 public:
00083 virtual void print(XStr& str) = 0;
00084
00085 operator XStr () {XStr ret;print(ret);return ret;}
00086
00087 friend XStr & operator << (XStr &str,Printable &p) {p.print(str);return str;}
00088 friend XStr & operator << (XStr &str,Printable *p) {p->print(str);return str;}
00089 };
00090
00091 #endif