00001 #include "xi-util.h"
00002
00003 namespace xi {
00004
00005 void
00006 XStr::append(const char *_s)
00007 {
00008 len += strlen(_s);
00009 if ( len >= blklen) {
00010 while ( len >= blklen ) {
00011 blklen += SZ;
00012 }
00013 char *tmp = s;
00014 s = new char[blklen];
00015 strcpy(s, tmp);
00016 delete[] tmp;
00017 }
00018 strcat(s, _s);
00019 }
00020
00021 void
00022 XStr::append(char c)
00023 {
00024 char tmp[2];
00025 tmp[0] = c;
00026 tmp[1] = '\0';
00027 append(tmp);
00028 }
00029
00030 void XStr::initTo(const char *_s)
00031 {
00032 len = strlen(_s);
00033 blklen = SZ;
00034 while ( len >= blklen ) {
00035 blklen += SZ;
00036 }
00037 s = new char[blklen];
00038 strcpy(s, _s);
00039 }
00040
00041 XStr::XStr() {initTo("");}
00042 XStr::XStr(const char *_s) {initTo(_s);}
00043 XStr::XStr(const XStr &_s) {initTo(_s.get_string_const());}
00044
00045 XStr& XStr::operator << (int i) {
00046 char tmp[100];
00047 sprintf(tmp, "%d", i);
00048 append(tmp);
00049 return *this;
00050 }
00051
00052 void XStr::line_append(const char c)
00053 {
00054 XStr xs;
00055 for(unsigned int i=0; i<len; i++) {
00056 if(s[i] == '\n')
00057 xs << c << "\n";
00058 else
00059 xs << s[i];
00060 }
00061 delete[] s;
00062 initTo(xs.charstar());
00063 }
00064
00065 void XStr::line_append_padding(const char c, int lineWidth)
00066 {
00067 XStr xs;
00068 int count = 0;
00069
00070 for(unsigned int i=0; i<len; i++) {
00071 if(s[i] == '\n'){
00072
00073 while(count++ < lineWidth-1)
00074 xs << " ";
00075 xs << c << "\n";
00076 count=0;
00077 } else if(s[i] == '\t') {
00078
00079 xs << " ";
00080 count+=2;
00081 } else {
00082
00083 xs << s[i];
00084 count++;
00085 }
00086 }
00087 delete[] s;
00088 initTo(xs.charstar());
00089 }
00090
00091
00092
00093 void
00094 XStr::spew(const char*b, const char *a1, const char *a2, const char *a3,
00095 const char *a4, const char *a5)
00096 {
00097 using std::cout;
00098 int i,length=strlen(b);
00099 for(i=0; i<length; i++){
00100 switch(b[i]){
00101 case '\001':
00102 if(a1==0) {cout << "Internal Error\n"; abort();} append(a1); break;
00103 case '\002':
00104 if(a2==0) {cout << "Internal Error\n"; abort();} append(a2); break;
00105 case '\003':
00106 if(a3==0) {cout << "Internal Error\n"; abort();} append(a3); break;
00107 case '\004':
00108 if(a4==0) {cout << "Internal Error\n"; abort();} append(a4); break;
00109 case '\005':
00110 if(a5==0) {cout << "Internal Error\n"; abort();} append(a5); break;
00111 default:
00112 append(b[i]);
00113 }
00114 }
00115 }
00116
00117 void XStr::replace (const char a, const char b) {
00118 for(unsigned int i=0; i<len; i++) {
00119 if (s[i] == a) s[i] = b;
00120 }
00121 }
00122
00123 }