Text.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527
  1. //---Include---
  2. #include "Text.h"
  3. #include <sstream>
  4. #include <iomanip>
  5. #ifndef WIN32
  6. #include <string.h>
  7. #endif
  8. using namespace Framework;
  9. // inhalt der Text Klasse aus Text.h
  10. // Konstruktor
  11. Text::Text()
  12. : txt( 0 ),
  13. suchGBeg( 0 ),
  14. suchGEnd( 0 ),
  15. precision( 0 ),
  16. ref( 1 )
  17. {
  18. setText( "" );
  19. }
  20. Text::Text( const Text &txt )
  21. : txt( 0 ),
  22. suchGBeg( 0 ),
  23. suchGEnd( 0 ),
  24. precision( 0 ),
  25. ref( 1 )
  26. {
  27. setText( txt );
  28. }
  29. Text::Text( const char *t )
  30. : txt( 0 ),
  31. suchGBeg( 0 ),
  32. suchGEnd( 0 ),
  33. precision( 0 ),
  34. ref( 1 )
  35. {
  36. setText( t ); // Text setzen
  37. }
  38. Text::Text( int zahl )
  39. : txt( 0 ),
  40. suchGBeg( 0 ),
  41. suchGEnd( 0 ),
  42. precision( 0 ),
  43. ref( 1 )
  44. {
  45. *this = zahl;
  46. }
  47. // Erstellt ein neues Text Objekt mit einer zahl als text
  48. // num: Die Zahl, die im Text sein soll
  49. Text::Text( double num )
  50. : txt( 0 ),
  51. suchGBeg( 0 ),
  52. suchGEnd( 0 ),
  53. precision( 0 ),
  54. ref( 1 )
  55. {
  56. *this = num;
  57. }
  58. // Erstellt ein neues Text Objekt mit einer zahl als text
  59. // num: Die Zahl, die im Text sein soll
  60. Text::Text( float num )
  61. : txt( 0 ),
  62. suchGBeg( 0 ),
  63. suchGEnd( 0 ),
  64. precision( 0 ),
  65. ref( 1 )
  66. {
  67. *this = num;
  68. }
  69. // Destruktor
  70. Text::~Text()
  71. {
  72. delete[]txt;
  73. }
  74. // nicht constant
  75. void Text::setSuchGrenzen( char gBeg, char gEnd ) // sucht bei jeder suchfunktion nicht zwischen den Zeichen gBeg und gEnd
  76. {
  77. suchGBeg = gBeg;
  78. suchGEnd = gEnd;
  79. }
  80. void Text::setText( const char *t ) // ersetzt den Text
  81. {
  82. delete[]txt; // alter Text löschen
  83. int l = (int)strlen( t ); // Länge des neuen Textes ermitteln
  84. txt = new char[ l + 1 ]; // neuen Text erstellen
  85. for( int i = 0; i < l; ++i ) // Text befüllen
  86. txt[ i ] = t[ i ];
  87. txt[ l ] = '\0'; // Textende Festlegen
  88. }
  89. // unconstant
  90. void Text::setText( const char *t, int l ) // ersetzt den Text
  91. {
  92. delete[]txt; // alter Text löschen
  93. txt = new char[ l + 1 ]; // neuen Text erstellen
  94. for( int i = 0; i < l; ++i ) // Text befüllen
  95. txt[ i ] = t[ i ];
  96. txt[ l ] = '\0'; // Textende Festlegen
  97. }
  98. void Text::setText( Text *t )
  99. {
  100. setText( t->getText() ); // Text setzen
  101. t = t->release(); // übergabe loslassen
  102. }
  103. void Text::append( char c ) // hängt an den Text an
  104. {
  105. append( &c, 1 );
  106. }
  107. void Text::append( const char *t ) // hängt an den Text an
  108. {
  109. int tl = (int)strlen( t ); // länge der übergabe
  110. int txl = getLength(); // länge des Textes
  111. char *res = new char[ tl + txl + 1 ]; // neuen Text erstellen
  112. for( int i = 0; i < txl; ++i ) // mit jetzigem Text füllen
  113. res[ i ] = txt[ i ];
  114. for( int i = 0; i < tl; ++i ) // Übergabe anhängen
  115. res[ txl + i ] = t[ i ];
  116. res[ txl + tl ] = '\0'; // Textende festlegen
  117. setText( res ); // Test setzen
  118. delete[] res; // Speicher freigeben
  119. }
  120. void Text::appendHex( int num ) // hängt die zahl in hex anden Text an
  121. {
  122. int l = getLength();
  123. char *res = new char[ l + 9 ];
  124. for( int i = 0; i < l; ++i )
  125. res[ i ] = txt[ i ];
  126. std::stringstream stream;
  127. stream << std::setfill( '0' ) << std::setw( (int)sizeof( int ) * 2 ) << std::hex << num;
  128. std::string str = stream.str();
  129. for( int i = l; i < l + 8; ++i )
  130. res[ i ] = str.c_str()[ i - l ];
  131. res[ l + 8 ] = 0;
  132. setText( res );
  133. delete[] res;
  134. }
  135. void Text::appendColor( int fc ) // setzt die Farbe des folgenden Textes
  136. {
  137. int l = getLength();
  138. char *res = new char[ l + 12 ];
  139. for( int i = 0; i < l; ++i )
  140. res[ i ] = txt[ i ];
  141. res[ l ] = '\r';
  142. res[ l + 1 ] = '0';
  143. res[ l + 2 ] = 'x';
  144. std::stringstream stream;
  145. stream << std::setfill( '0' ) << std::setw( (int)sizeof( int ) * 2 ) << std::hex << fc;
  146. std::string str = stream.str();
  147. for( int i = l + 3; i < l + 11; ++i )
  148. res[ i ] = str.c_str()[ i - ( l + 3 ) ];
  149. res[ l + 11 ] = 0;
  150. setText( res );
  151. delete[] res;
  152. }
  153. void Text::append( const char *t, int l ) // hängt an den Text an
  154. {
  155. int txl = getLength(); // länge des Textes
  156. char *res = new char[ l + txl + 1 ]; // neuen Text erstellen
  157. for( int i = 0; i < txl; ++i ) // mit jetzigem Text füllen
  158. res[ i ] = txt[ i ];
  159. for( int i = 0; i < l; ++i ) // Übergabe anhängen
  160. res[ txl + i ] = t[ i ];
  161. res[ txl + l ] = '\0'; // Textende festlegen
  162. setText( res, txl + l ); // Test setzen
  163. delete[] res; // Speicher freigeben
  164. }
  165. void Text::append( Text *t )
  166. {
  167. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  168. append( t->getText() ); // Text anhängen
  169. t = t->release(); // Übergabe loslassen
  170. }
  171. void Text::append( int num )
  172. {
  173. std::stringstream ss;
  174. ss << num;
  175. append( ss.str().c_str() );
  176. }
  177. // Hängt eine Zahl ans Ende Des Textes an
  178. // num: Die Zahl, die in einen Text umgewandelt und am Ende angehängt werden soll
  179. void Text::append( __int64 num )
  180. {
  181. std::stringstream ss;
  182. ss << num;
  183. append( ss.str().c_str() );
  184. }
  185. void Text::append( unsigned int num )
  186. {
  187. std::stringstream ss;
  188. ss << num;
  189. append( ss.str().c_str() );
  190. }
  191. void Text::append( double num )
  192. {
  193. std::stringstream ss;
  194. ss.precision( precision );
  195. ss << num;
  196. append( ss.str().c_str() );
  197. }
  198. void Text::append( float num )
  199. {
  200. std::stringstream ss;
  201. ss.precision( precision );
  202. ss << num;
  203. append( ss.str().c_str() );
  204. }
  205. void Text::insert( int p, char c ) // Fügt an stelle p ein
  206. {
  207. if( p > getLength() || p < 0 ) // Auf unsinnige übergabe prüfen
  208. return;
  209. int txl = getLength(); // Länge des Textes
  210. char *res = new char[ txl + 2 ]; // neuer Text erstellen
  211. for( int i = 0; i < p; ++i ) // Text füllen
  212. res[ i ] = txt[ i ];
  213. res[ p ] = c;
  214. for( int i = p; i < txl; ++i ) // Text füllen
  215. res[ i + 1 ] = txt[ i ];
  216. res[ txl + 1 ] = '\0'; // Text ende festlegen
  217. setText( res ); // Text setzen
  218. delete[] res; // Speicher freigeben
  219. }
  220. void Text::insert( int p, const char *t ) // Fügt an stelle p ein
  221. {
  222. if( p > getLength() || p < 0 || strlen( t ) <= 0 ) // Auf unsinnige übergabe prüfen
  223. return;
  224. int tl = (int)strlen( t ); // Länge der übergabe
  225. int txl = getLength(); // Länge des Textes
  226. char *res = new char[ tl + txl + 1 ]; // neuer Text erstellen
  227. for( int i = 0; i < p; ++i ) // Text füllen
  228. res[ i ] = txt[ i ];
  229. for( int i = 0; i < tl; ++i ) // Text einfügen
  230. res[ i + p ] = t[ i ];
  231. for( int i = p; i < txl; ++i ) // Text füllen
  232. res[ i + tl ] = txt[ i ];
  233. res[ tl + txl ] = '\0'; // Text ende festlegen
  234. setText( res ); // Text setzen
  235. delete[] res; // Speicher freigeben
  236. }
  237. void Text::insert( int p, Text *t )
  238. {
  239. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  240. insert( p, t->getText() ); // Text einfügen
  241. t = t->release(); // Übergabe loslassen
  242. }
  243. void Text::ersetzen( int p1, int p2, const char *t ) // Ersetzt den Text von p1 bis p2
  244. {
  245. if( p1 > p2 )
  246. {
  247. int x = p1; // p1 und p2 tauschen
  248. p1 = p2;
  249. p2 = x;
  250. }
  251. remove( p1, p2 ); // Textabschnitt von p1 zu p2 löschen
  252. insert( p1, t ); // Übergabe bei p1 einfügen
  253. }
  254. void Text::ersetzen( int p1, int p2, Text *t )
  255. {
  256. if( t->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
  257. ersetzen( p1, p2, t->getText() ); // Text ersetzen
  258. t = t->release(); // Übergabe loslassen
  259. }
  260. void Text::ersetzen( char c1, char c2 ) // ersetzt jedes c1 durch c2
  261. {
  262. if( c1 == '\0' || c2 == '\0' ) // Auf unsinnige übergabe prüfen
  263. return;
  264. if( !hat( c1 ) ) // prüfen ob c1 vorhanden
  265. return;
  266. int l = getLength(); // Text Länge
  267. int suchGCount = 0;
  268. for( int i = 0; i < l; ++i ) // Text durchsuchen
  269. {
  270. bool b = suchGCount != 0;
  271. if( txt[ i ] == c1 && !suchGCount )
  272. txt[ i ] = c2; // Text ersetzen
  273. if( txt[ i ] == suchGBeg )
  274. ++suchGCount;
  275. if( txt[ i ] == suchGEnd )
  276. --suchGCount;
  277. if( txt[ i ] == c1 && !suchGCount && b )
  278. txt[ i ] = c2; // Text ersetzen
  279. }
  280. }
  281. void Text::ersetzen( const char *t1, const char *t2 ) // ersetzt jedes t1 durch t2
  282. {
  283. int txl = getLength(); // Text Länge
  284. int t1l = (int)strlen( t1 ); // Länge der Übergaben
  285. int t2l = (int)strlen( t2 );
  286. if( t1l > txl || t1l <= 0 ) // Auf unsinnige übergabe prüfen
  287. return;
  288. if( !hat( t1 ) ) // prüfen ob t1 vorhanden
  289. return;
  290. int anz = anzahlVon( t1 ); // Anzahl von t1 im Text
  291. int *begin = new int[ anz ];
  292. int *end = new int[ anz ];
  293. for( int i = 0; i < anz; ++i ) // Positionen von t1 speichern
  294. {
  295. begin[ i ] = positionVon( t1, i );
  296. end[ i ] = begin[ i ] + t1l;
  297. }
  298. int resl = ( txl - ( anz * t1l ) ) + ( anz * t2l ) + 1; // Länge des Ergebneses
  299. char *res = new char[ resl ]; // neuer Text erstellen
  300. int rep = 0; // Speichert bei welchen t1 man sich befindet
  301. int last = 0; // Füllposition von txt
  302. int neu = 0; // Füllporition von res
  303. for( ; neu < resl; ++neu ) // Text befüllen
  304. {
  305. if( rep < anz && last == begin[ rep ] ) // Text ersetzen
  306. {
  307. last = end[ rep ];
  308. ++rep;
  309. for( int ii = 0; ii < t2l; ++ii )
  310. {
  311. if( neu >= resl )
  312. break;
  313. res[ neu ] = t2[ ii ];
  314. ++neu;
  315. }
  316. if( neu >= resl )
  317. break;
  318. --neu;
  319. }
  320. else // Text Kopieren
  321. {
  322. res[ neu ] = txt[ last ];
  323. ++last;
  324. }
  325. }
  326. res[ resl - 1 ] = '\0'; // Textende festlegen
  327. setText( res ); // Text setzen
  328. delete[]begin; // Speicher freigeben
  329. delete[]end;
  330. delete[] res;
  331. }
  332. void Text::ersetzen( Text *t1, const char *t2 )
  333. {
  334. if( t1->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  335. ersetzen( t1->getText(), t2 ); // ersetzen
  336. t1 = t1->release(); // Übergabe loslassen
  337. }
  338. void Text::ersetzen( const char *t1, Text *t2 )
  339. {
  340. if( t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
  341. ersetzen( t1, t2->getText() ); // ersetzen
  342. t2 = t2->release(); // Übergabe loslassen
  343. }
  344. void Text::ersetzen( Text *t1, Text *t2 )
  345. {
  346. if( t1->getLength() > 0 && t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
  347. ersetzen( t1->getText(), t2->getText() ); // ersetzen
  348. t1 = t1->release(); // Übergaben loslassen
  349. t2 = t2->release();
  350. }
  351. void Text::ersetzen( int index, char c1, char c2 ) // ersetzt das i-te c1 durch c2
  352. {
  353. if( c1 == '\0' || c2 == '\0' || index < 0 ) // Auf unsinnige übergabe prüfen
  354. return;
  355. if( !hat( c1 ) ) // prüfen ob c1 vorhanden
  356. return;
  357. int anz = anzahlVon( c1 );
  358. if( index >= anz ) // prüfen ob es ein i-tes c1 gibt
  359. return;
  360. txt[ positionVon( c1, index ) ] = c2;
  361. }
  362. void Text::ersetzen( int index, const char *t1, const char *t2 ) // ersetzt das i-te t1 durch t2
  363. {
  364. int txl = getLength(); // Text Länge
  365. int t1l = (int)strlen( t1 ); // Länge der Übergaben
  366. if( t1l >= txl || t1l <= 0 || index < 0 ) // Auf unsinnige übergabe prüfen
  367. return;
  368. if( !hat( t1 ) ) // prüfen ob t1 vorhanden
  369. return;
  370. int anz = anzahlVon( t1 ); // Anzahl von t1 im Text
  371. if( index >= anz ) // prüfen ob es ein i-tes t1 gibt
  372. return;
  373. int begin = positionVon( t1, index );
  374. int end = begin + t1l;
  375. ersetzen( begin, end, t2 ); // ersetzen
  376. }
  377. void Text::ersetzen( int i, Text *t1, const char *t2 )
  378. {
  379. if( t1->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  380. ersetzen( i, t1->getText(), t2 ); // ersetzen
  381. t1 = t1->release(); // Übergabe loslassen
  382. }
  383. void Text::ersetzen( int i, const char *t1, Text *t2 )
  384. {
  385. if( t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
  386. ersetzen( i, t1, t2->getText() ); // ersetzen
  387. t2 = t2->release(); // Übergabe loslassen
  388. }
  389. void Text::ersetzen( int i, Text *t1, Text *t2 )
  390. {
  391. if( t1->getLength() > 0 || t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
  392. ersetzen( i, t1->getText(), t2->getText() ); // ersetzen
  393. t1 = t1->release(); // Übergaben loslassen
  394. t2 = t2->release();
  395. }
  396. void Text::fillText( char c, int len ) // setzt den Text zu so vielen c wie län groß ist
  397. {
  398. char *res = new char[ len + 1 ];
  399. for( int i = 0; i < len; ++i )
  400. res[ i ] = c;
  401. res[ len ] = '\0';
  402. setText( res );
  403. delete[] res;
  404. }
  405. void Text::remove( int p ) // löscht p
  406. {
  407. int l = getLength(); // Text Länge
  408. if( p < 0 || p >= l ) // Auf unsinnige übergabe prüfen
  409. return;
  410. char *res = new char[ l ]; // neuen Text anlegen
  411. for( int i = 0; i < p && i < l; ++i ) // Text befüllen
  412. res[ i ] = txt[ i ];
  413. for( int i = p + 1; i < l; ++i )
  414. res[ i - 1 ] = txt[ i ];
  415. res[ l - 1 ] = 0;
  416. setText( res ); // Text setzen
  417. delete[] res; // Speicher freigeben
  418. }
  419. void Text::remove( int p1, int p2 ) // löscht von p1 zu p2 ( p2 bleibt )
  420. {
  421. if( p1 > p2 ) // p1 und p2 tauschen
  422. {
  423. int x = p1;
  424. p1 = p2;
  425. p2 = x;
  426. }
  427. int l = getLength(); // Länge des Testes
  428. if( p1 < 0 || p2 > l ) // Auf unsinnige übergabe prüfen
  429. return;
  430. int resl = l - ( p2 - p1 ); // Länge vom Ergebnis
  431. char *res = new char[ resl + 1 ]; // Neuen Text erstellen
  432. for( int i = 0; i < p1; ++i ) // Text füllen
  433. res[ i ] = txt[ i ];
  434. for( int i = p2; i < l; ++i )
  435. res[ i - ( p2 - p1 ) ] = txt[ i ];
  436. res[ resl ] = '\0'; // Testende festlegen
  437. setText( res ); // Text setzen
  438. delete[] res; // Speicher freigeben
  439. }
  440. void Text::remove( char c ) // löscht jetes c
  441. {
  442. if( !hat( c ) ) // prüfen ob c vorhanden
  443. return;
  444. int l = getLength(); // Länge des Textes
  445. int anz = anzahlVon( c ); // Anzahl von c
  446. char *res = new char[ l - anz + 1 ]; // neuen Text erstellen
  447. int anz2 = 0;
  448. int suchGCount = 0;
  449. for( int i = 0; i < l; ++i ) // Text befüllen
  450. {
  451. bool b = suchGCount != 0;
  452. if( txt[ i ] == c && !suchGCount )
  453. ++anz2;
  454. else
  455. res[ i - anz2 ] = txt[ i ];
  456. if( txt[ i ] == suchGBeg )
  457. ++suchGCount;
  458. if( txt[ i ] == suchGEnd )
  459. --suchGCount;
  460. if( b )
  461. {
  462. if( txt[ i ] == c && !suchGCount )
  463. ++anz2;
  464. else
  465. res[ i - anz2 ] = txt[ i ];
  466. }
  467. }
  468. res[ l - anz ] = '\0'; // Textende festlegen
  469. setText( res ); // Text setzen
  470. delete[] res; // Speicher freigeben
  471. }
  472. void Text::remove( const char *t ) // löscht jetes t
  473. {
  474. int tl = (int)strlen( t ); // Länge der Übergabe
  475. int txl = getLength(); // Länge des Textes
  476. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  477. return;
  478. if( !hat( t ) ) // prüfen ob Text ein t enthält
  479. return;
  480. int anz = anzahlVon( t ); // anzahl von t
  481. int *begin = new int[ anz ];
  482. for( int i = 0; i < anz; ++i ) // begin aller t-s finden
  483. begin[ i ] = positionVon( t, i );
  484. int resl = txl - ( anz * tl ); // Länge vom Ergebnes
  485. char *res = new char[ resl + 1 ]; // neuen Text erzeugen
  486. int del = 0;
  487. for( int i = 0; i < txl; ++i ) // Text befüllen
  488. {
  489. if( del < anz && i == begin[ del ] ) // Text auslassen
  490. {
  491. i += tl - 1;
  492. ++del;
  493. }
  494. else
  495. res[ i - ( del * tl ) ] = txt[ i ]; // Text befüllen
  496. }
  497. res[ resl ] = '\0'; // Text ende festlegen
  498. setText( res ); // Text setzen
  499. delete[]begin;
  500. delete[] res; // Speicher freigeben
  501. }
  502. void Text::remove( Text *t )
  503. {
  504. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  505. remove( t->getText() ); // löschen
  506. t = t->release(); // Übergabe loslassen
  507. }
  508. void Text::remove( int index, char c )
  509. {
  510. if( index < 0 || !hat( c ) ) // Auf unsinnige übergabe prüfen
  511. return;
  512. int anz = anzahlVon( c ); // anzahl der i-s
  513. if( index >= anz ) // prüfen ob ein i-tes c vorhanden ist
  514. return;
  515. int pos = positionVon( c, index ); // Position vom i-ten c
  516. if( pos < 0 )
  517. return;
  518. int l = getLength(); // Länge des Textes
  519. if( !l )
  520. return;
  521. char *res = new char[ l ]; // neuen Text erzeugen
  522. for( int i = 0; i < pos && i < l; ++i ) // Text befüllen
  523. res[ i ] = txt[ i ];
  524. for( int i = pos + 1; i < l; ++i )
  525. res[ i - 1 ] = txt[ i ];
  526. res[ l - 1 ] = '\0'; // Text ende festlegen
  527. setText( res ); // Text setzen
  528. delete[] res; // Speicher freigeben
  529. }
  530. void Text::remove( int index, const char *t ) // löscht das i-te t
  531. {
  532. int tl = (int)strlen( t ); // Länge der Übergabe
  533. if( index < 0 || !hat( t ) || tl <= 0 ) // Auf unsinnige übergabe prüfen
  534. return;
  535. int anz = anzahlVon( t ); // anzahl der i-s
  536. if( index >= anz ) // prüfen ob ein i-tes c vorhanden ist
  537. return;
  538. int pos = positionVon( t, index ); // Position vom i-ten c
  539. if( pos < 0 )
  540. return;
  541. int l = getLength(); // Länge des Textes
  542. if( !l )
  543. return;
  544. char *res = new char[ l - tl + 1 ]; // neuen Text erzeugen
  545. for( int i = 0; i < pos && i < l - tl + 1; ++i ) // Text befüllen
  546. res[ i ] = txt[ i ];
  547. for( int i = pos + tl; i < l; ++i )
  548. res[ i - tl ] = txt[ i ];
  549. res[ l - tl ] = '\0'; // Text ende festlegen
  550. setText( res ); // Text setzen
  551. delete[] res; // Speicher freigeben
  552. }
  553. void Text::remove( int i, Text *t )
  554. {
  555. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  556. remove( i, t->getText() ); // löschen
  557. t = t->release(); // Übergabe loslassen
  558. }
  559. void Text::setPrecision( int p ) // setzt die Anzahl der Nachkommastellen bei doubles
  560. {
  561. precision = p;
  562. }
  563. // constant
  564. int Text::getLength() const // gibt die Text länge zurück
  565. {
  566. if( !txt )
  567. return -1;
  568. int ret = 0;
  569. for( ; txt[ ret ] != '\0'; ++ret ); // zählen
  570. return ret;
  571. }
  572. int Text::getLKick( int pos ) const
  573. {
  574. if( txt[ pos - 1 ] == ' ' )
  575. {
  576. int ret = 1;
  577. for( ; ret < pos && txt[ pos - ret - 1 ] == ' ' && txt[ pos - ret - 1 ] != '\n'; ++ret );
  578. return pos - ret;
  579. }
  580. else
  581. {
  582. int ret = 1;
  583. for( ; ret < pos && txt[ pos - ret - 1 ] != ' ' && txt[ pos - ret - 1 ] != '\n'; ++ret );
  584. return pos - ret;
  585. }
  586. }
  587. int Text::getOKick( int pos ) const
  588. {
  589. if( !hat( '\n' ) )
  590. return 0;
  591. int lpos = 0;
  592. while( pos - lpos - 1 > 0 && txt[ pos - lpos - 1 ] != '\n' )
  593. ++lpos;
  594. int vllen = 1;
  595. while( pos - lpos - vllen - 1 >= 0 && txt[ pos - lpos - vllen - 1 ] != '\n' )
  596. ++vllen;
  597. if( vllen > lpos )
  598. return pos - vllen;
  599. else
  600. return pos - lpos - 1;
  601. }
  602. int Text::getRKick( int pos ) const
  603. {
  604. int tl = getLength();
  605. if( txt[ pos ] == ' ' )
  606. {
  607. int ret = 1;
  608. for( ; ret + pos < tl && txt[ pos + ret ] == ' ' && txt[ pos + ret ] != '\n'; ++ret );
  609. return pos + ret;
  610. }
  611. else
  612. {
  613. int ret = 1;
  614. for( ; ret + pos < tl && txt[ pos + ret ] != ' '&& txt[ pos + ret ] != '\n'; ++ret );
  615. return pos + ret;
  616. }
  617. }
  618. int Text::getUKick( int pos ) const
  619. {
  620. if( !hat( '\n' ) )
  621. return getLength();
  622. int lpos = 0;
  623. while( pos - lpos > 0 && txt[ pos - lpos - 1 ] != '\n' )
  624. ++lpos;
  625. int llen = 1;
  626. while( pos + llen - 1 < getLength() && txt[ pos + llen - 1 ] != '\n' )
  627. ++llen;
  628. int vllen = 1;
  629. while( pos + llen + vllen - 1 < getLength() && txt[ pos + llen + vllen - 1 ] != '\n' )
  630. ++vllen;
  631. if( vllen == 1 )
  632. return pos + llen < getLength() ? pos + llen : getLength();
  633. if( vllen < lpos )
  634. return pos + llen + vllen - 1;
  635. return pos + llen + lpos;
  636. }
  637. bool Text::hat( Text *t ) const // enthält der Text t
  638. {
  639. bool ret = 0;
  640. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  641. ret = hat( t->getText() ); // prüfen
  642. t = t->release(); // Übergabe loslassen
  643. return ret;
  644. }
  645. bool Text::hat( const char *t ) const
  646. {
  647. int tl = (int)strlen( t ); // Länge der Übergabe
  648. int txl = getLength(); // Länge des Textes
  649. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  650. return 0;
  651. int suchGCount = 0;
  652. for( int i = 0; i + tl <= txl; ++i ) // Text durchsuchen
  653. {
  654. if( !suchGCount )
  655. {
  656. bool b = 1;
  657. for( int ii = 0; ii < tl; ++ii ) // Text überprüfen
  658. b &= txt[ i + ii ] == t[ ii ];
  659. if( b )
  660. return 1;
  661. }
  662. if( txt[ i ] == suchGBeg )
  663. ++suchGCount;
  664. if( txt[ i ] == suchGEnd )
  665. --suchGCount;
  666. if( !suchGCount )
  667. {
  668. bool b = 1;
  669. for( int ii = 0; ii < tl; ++ii ) // Text überprüfen
  670. b &= txt[ i + ii ] == t[ ii ];
  671. if( b )
  672. return 1;
  673. }
  674. }
  675. return 0;
  676. }
  677. bool Text::hat( char c ) const // enthält c
  678. {
  679. int l = getLength(); // Text Länge
  680. bool ret = 0;
  681. int suchGCount = 0;
  682. for( int i = 0; i < l; ++i ) // suchen
  683. {
  684. bool b = suchGCount != 0;
  685. if( !suchGCount ) // überprüfen
  686. ret |= txt[ i ] == c;
  687. if( txt[ i ] == suchGBeg )
  688. ++suchGCount;
  689. if( txt[ i ] == suchGEnd )
  690. --suchGCount;
  691. if( !suchGCount && b ) // überprüfen
  692. ret |= txt[ i ] == c;
  693. }
  694. return ret;
  695. }
  696. bool Text::istGleich( const char *t ) const // prüft ob det Text gleich t ist
  697. {
  698. int txl = getLength(); // Text Länge
  699. int tl = (int)strlen( t ); // Länge der Übergabe
  700. if( txl != tl ) // Auf unsinniege Übergabe prüfen
  701. return 0;
  702. if( txl == -1 )
  703. return 1;
  704. bool ret = true;
  705. for( int i = 0; i < tl; ++i ) // prüfen
  706. ret &= txt[ i ] == t[ i ];
  707. return ret;
  708. }
  709. bool Text::istGleich( Text *t ) const
  710. {
  711. bool ret = istGleich( t->getText() ); // prüfen
  712. t->release(); // Übergabe loslassen
  713. return ret;
  714. }
  715. char *Text::getText() const // gibt Text zurück
  716. {
  717. return txt;
  718. }
  719. int Text::anzahlVon( char c ) const // gibt die Anzahl von c im Text zurück
  720. {
  721. int ret = 0;
  722. int l = getLength(); // Text Länge
  723. int suchGCount = 0;
  724. for( int i = 0; i < l; ++i ) // suchen
  725. {
  726. bool b = suchGCount != 0;
  727. ret += txt[ i ] == c && !suchGCount; // zählen
  728. if( txt[ i ] == suchGBeg )
  729. ++suchGCount;
  730. if( txt[ i ] == suchGEnd )
  731. --suchGCount;
  732. ret += txt[ i ] == c && !suchGCount && b; // zählen
  733. }
  734. return ret;
  735. }
  736. int Text::anzahlVon( const char *t ) const // gibt die Anzahl von t im Text zurück
  737. {
  738. int tl = (int)strlen( t ); // Länge der Übergabe
  739. int txl = getLength(); // Länge des Textes
  740. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  741. return 0;
  742. int ret = 0;
  743. int suchGCount = 0;
  744. for( int i = 0; i + tl <= txl; ++i ) // suchen
  745. {
  746. bool b = suchGCount != 0;
  747. if( !suchGCount )
  748. {
  749. bool b = 1;
  750. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  751. b &= txt[ i + ii ] == t[ ii ];
  752. if( b )
  753. ++ret; // zählen
  754. }
  755. if( txt[ i ] == suchGBeg )
  756. ++suchGCount;
  757. if( txt[ i ] == suchGEnd )
  758. --suchGCount;
  759. if( !suchGCount && b )
  760. {
  761. bool b = 1;
  762. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  763. b &= txt[ i + ii ] == t[ ii ];
  764. if( b )
  765. ++ret; // zählen
  766. }
  767. }
  768. return ret;
  769. }
  770. int Text::anzahlVon( Text *t ) const
  771. {
  772. int ret = 0;
  773. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  774. ret = anzahlVon( t->getText() ); // zählen
  775. t = t->release(); // Übergabe loslassen
  776. return ret;
  777. }
  778. int Text::positionVon( char c ) const // gibt die Position des ersten c zurück
  779. {
  780. int l = getLength(); // Text Länge
  781. int suchGCount = 0;
  782. for( int i = 0; i < l; ++i ) // suchen
  783. {
  784. bool b = suchGCount != 0;
  785. if( txt[ i ] == c && !suchGCount ) // überprüfen
  786. return i;
  787. if( txt[ i ] == suchGBeg )
  788. ++suchGCount;
  789. if( txt[ i ] == suchGEnd )
  790. --suchGCount;
  791. if( txt[ i ] == c && !suchGCount && b ) // überprüfen
  792. return i;
  793. }
  794. return -1;
  795. }
  796. int Text::positionVon( const char *t ) const // gibt die Position des ersten t zurück
  797. {
  798. int tl = (int)strlen( t ); // Länge der Übergabe
  799. int txl = getLength(); // Länge des Textes
  800. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  801. return -1;
  802. int suchGCount = 0;
  803. for( int i = 0; i + tl <= txl; ++i ) // suchen
  804. {
  805. bool b = suchGCount != 0;
  806. if( !suchGCount )
  807. {
  808. bool b = 1;
  809. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  810. b &= txt[ i + ii ] == t[ ii ];
  811. if( b )
  812. return i;
  813. }
  814. if( txt[ i ] == suchGBeg )
  815. ++suchGCount;
  816. if( txt[ i ] == suchGEnd )
  817. --suchGCount;
  818. if( !suchGCount && b )
  819. {
  820. bool b = 1;
  821. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  822. b &= txt[ i + ii ] == t[ ii ];
  823. if( b )
  824. return i;
  825. }
  826. }
  827. return -1;
  828. }
  829. int Text::positionVon( Text *t ) const
  830. {
  831. int ret = 0;
  832. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  833. ret = positionVon( t->getText() ); // position ermitteln
  834. t = t->release(); // Übergabe loslassen
  835. return ret;
  836. }
  837. int Text::positionVon( char c, int index ) const // gibt die Position des i-ten c zurück
  838. {
  839. int l = getLength(); // Text Länge
  840. int ii = 0;
  841. int suchGCount = 0;
  842. for( int i = 0; i < l; ++i ) // suchen
  843. {
  844. bool b = suchGCount != 0;
  845. if( txt[ i ] == c && !suchGCount ) // überprüfen
  846. {
  847. if( ii == index )
  848. return i;
  849. else
  850. ++ii;
  851. }
  852. if( txt[ i ] == suchGBeg )
  853. ++suchGCount;
  854. if( txt[ i ] == suchGEnd )
  855. --suchGCount;
  856. if( txt[ i ] == c && !suchGCount && b ) // überprüfen
  857. {
  858. if( ii == index )
  859. return i;
  860. else
  861. ++ii;
  862. }
  863. }
  864. return -1;
  865. }
  866. int Text::positionVon( const char *t, int index ) const // gibt die Position des i-ten t zurück
  867. {
  868. int tl = (int)strlen( t ); // Länge der Übergabe
  869. int txl = getLength(); // Länge des Textes
  870. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  871. return 0;
  872. int i2 = 0;
  873. int suchGCount = 0;
  874. for( int i = 0; i + tl <= txl; ++i ) // suchen
  875. {
  876. bool b = suchGCount != 0;
  877. if( !suchGCount )
  878. {
  879. bool b = 1;
  880. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  881. b &= txt[ i + ii ] == t[ ii ];
  882. if( b )
  883. {
  884. if( i2 == index )
  885. return i;
  886. else
  887. ++i2;
  888. }
  889. }
  890. if( txt[ i ] == suchGBeg )
  891. ++suchGCount;
  892. if( txt[ i ] == suchGEnd )
  893. --suchGCount;
  894. if( !suchGCount && b )
  895. {
  896. bool b = 1;
  897. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  898. b &= txt[ i + ii ] == t[ ii ];
  899. if( b )
  900. {
  901. if( i2 == index )
  902. return i;
  903. else
  904. ++i2;
  905. }
  906. }
  907. }
  908. return -1;
  909. }
  910. int Text::positionVon( Text *t, int i ) const
  911. {
  912. int ret = 0;
  913. if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
  914. ret = positionVon( t->getText(), i ); // position ermitteln
  915. t = t->release(); // Übergabe loslassen
  916. return ret;
  917. }
  918. Text *Text::getTeilText( int p1, int p2 ) const // gibt den Text von p1 bis p2 zurück
  919. {
  920. if( p1 > p2 ) // p1 und p2 tauschen
  921. {
  922. int x = p1;
  923. p1 = p2;
  924. p2 = x;
  925. }
  926. int l = getLength(); // Text Länge
  927. if( p1 < 0 || p2 > l ) // Auf unsinnige übergabe prüfen
  928. return new Text( "" );
  929. char *cp = new char[ p2 - p1 + 1 ]; // neuen Text erstellen
  930. for( int i = p1; i < p2; ++i ) // Text befüllen
  931. {
  932. cp[ i - p1 ] = txt[ i ];
  933. }
  934. cp[ p2 - p1 ] = '\0';
  935. Text *t = new Text( cp ); // Text zurückgeben
  936. delete[]cp;
  937. return t;
  938. }
  939. Text *Text::getTeilText( int p ) const // gibt den Text von p bis zum Ende zurück
  940. {
  941. return getTeilText( p, getLength() ); // Text zurückgeben
  942. }
  943. // Reference Counting
  944. Text *Text::getThis()
  945. {
  946. ++ref;
  947. return this;
  948. }
  949. Text *Text::release()
  950. {
  951. --ref;
  952. if( ref < 1 )
  953. delete this;
  954. return 0;
  955. }
  956. // Operatoren
  957. Text &Text::operator+=( const int num )
  958. {
  959. append( num );
  960. return *this;
  961. }
  962. // Hängt eine Zahl ans Ende des Textes an
  963. Text &Text::operator+=( const __int64 num )
  964. {
  965. append( num );
  966. return *this;
  967. }
  968. Text &Text::operator+=( const double num )
  969. {
  970. append( num );
  971. return *this;
  972. }
  973. Text &Text::operator+=( const float num )
  974. {
  975. append( num );
  976. return *this;
  977. }
  978. Text &Text::operator+=( const char *txt )
  979. {
  980. append( txt );
  981. return *this;
  982. }
  983. Text &Text::operator+=( const Text &txt )
  984. {
  985. append( txt.getText() );
  986. return *this;
  987. }
  988. Text &Text::operator=( const int num )
  989. {
  990. setText( "" );
  991. append( num );
  992. return *this;
  993. }
  994. Text &Text::operator=( const double num )
  995. {
  996. setText( "" );
  997. append( num );
  998. return *this;
  999. }
  1000. Text &Text::operator=( const float num )
  1001. {
  1002. setText( "" );
  1003. append( num );
  1004. return *this;
  1005. }
  1006. Text &Text::operator=( const char *txt )
  1007. {
  1008. setText( txt );
  1009. return *this;
  1010. }
  1011. Text &Text::operator=( const Text &txt )
  1012. {
  1013. setText( txt.getText() );
  1014. return *this;
  1015. }
  1016. Text::operator char*( ) const
  1017. {
  1018. return txt;
  1019. }
  1020. Text::operator int() const
  1021. {
  1022. if( getLength() > 2 && txt[ 0 ] == '0' && txt[ 1 ] == 'x' )
  1023. return TextZuInt( ( txt + 2 ), 16 );
  1024. return TextZuInt( txt, 10 );
  1025. }
  1026. Text::operator __int64() const
  1027. {
  1028. if( getLength() > 2 && txt[ 0 ] == '0' && txt[ 1 ] == 'x' )
  1029. return TextZuInt64( ( txt + 2 ), 16 );
  1030. return TextZuInt64( txt, 10 );
  1031. }
  1032. Text::operator double() const
  1033. {
  1034. return TextZuDouble( txt );
  1035. }
  1036. Text::operator float() const
  1037. {
  1038. return TextZuFloat( txt );
  1039. }
  1040. bool Text::operator>( Text &t ) const
  1041. {
  1042. int len1 = getLength();
  1043. int len2 = t.getLength();
  1044. char *txt2 = t;
  1045. for( int i = 0; i < len1 && i < len2; ++i )
  1046. {
  1047. if( txt[ i ] > txt2[ i ] )
  1048. return 1;
  1049. if( txt[ i ] < txt2[ i ] )
  1050. return 0;
  1051. }
  1052. if( len1 > len2 )
  1053. return 1;
  1054. return 0;
  1055. }
  1056. bool Text::operator<( Text &t ) const
  1057. {
  1058. int len1 = getLength();
  1059. int len2 = t.getLength();
  1060. char *txt2 = t;
  1061. for( int i = 0; i < len1 && i < len2; ++i )
  1062. {
  1063. if( txt[ i ] < txt2[ i ] )
  1064. return 1;
  1065. if( txt[ i ] > txt2[ i ] )
  1066. return 0;
  1067. }
  1068. if( len1 < len2 )
  1069. return 1;
  1070. return 0;
  1071. }
  1072. // Inhalt der TextReader Klasse
  1073. // Konstructor
  1074. // txt: Der Text der gelesen werden soll. Er wird nicht kopiert sondern direkt gelesen.
  1075. TextReader::TextReader( Text *txt )
  1076. {
  1077. this->txt = txt;
  1078. lPos = 0;
  1079. ref = 1;
  1080. }
  1081. // Destructor
  1082. TextReader::~TextReader()
  1083. {
  1084. txt->release();
  1085. }
  1086. // Setzt die Position des Bytes, das als nächstes gelesen werden soll
  1087. // pos: Der Index des Bytes
  1088. // ende: 1, wenn der Index vom ende des Textes zählt. 0, wenn der Index vom Beginn des Textes zählt
  1089. void TextReader::setLPosition( __int64 pos, bool ende )
  1090. {
  1091. int l = txt->getLength();
  1092. lPos = ende ? l - pos : pos;
  1093. if( lPos < 0 )
  1094. lPos = 0;
  1095. if( lPos > l )
  1096. lPos = l;
  1097. }
  1098. // Ließt aus der Datei
  1099. // bytes: Ein Array, der mit Bytes aus dem Text gefüllt werden soll
  1100. // len: Wie viele Bytes aus dem Text gelesen werden sollen
  1101. void TextReader::lese( char *bytes, int len )
  1102. {
  1103. int l = txt->getLength();
  1104. len = (int)MIN( l - lPos, len );
  1105. for( __int64 i = lPos; i < lPos + len; i++ )
  1106. bytes[ i - lPos ] = txt->getText()[ i ];
  1107. lPos += len;
  1108. }
  1109. // Ließt die nächste zeile des Textes ein
  1110. // return: Die gelesene Zeile als Text mit zeilenumbruch
  1111. Text *TextReader::leseZeile()
  1112. {
  1113. if( istEnde() )
  1114. return 0;
  1115. Text *ret = new Text( "" );
  1116. __int64 len = txt->getLength();
  1117. for( char c = 0; c != '\n' && lPos < len; )
  1118. {
  1119. lese( &c, 1 );
  1120. if( c )
  1121. ret->append( (const char*)&c, 1 );
  1122. }
  1123. return ret;
  1124. }
  1125. // Prüft, ob die Resource vollständig gelesen wurde
  1126. // return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
  1127. bool TextReader::istEnde() const
  1128. {
  1129. return lPos >= txt->getLength();
  1130. }
  1131. // Gibt den Index des Bytes aus dem Text zurück, welches als nächstes gelesen werden würde
  1132. // return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
  1133. __int64 TextReader::getLPosition() const
  1134. {
  1135. return lPos;
  1136. }
  1137. // Erhöht den Reference Counting Zähler.
  1138. // return: this.
  1139. TextReader *TextReader::getThis()
  1140. {
  1141. ref++;
  1142. return this;
  1143. }
  1144. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  1145. // return: 0.
  1146. TextReader *TextReader::release()
  1147. {
  1148. if( !--ref )
  1149. delete this;
  1150. return 0;
  1151. }
  1152. // char* operationen
  1153. int Framework::stringPositionVonChar( char *string, char c, int num ) // sucht die position des num-ten c-s in string, -1 bei nicht gefunden
  1154. {
  1155. int gef = 0;
  1156. int p = 0;
  1157. for( char cc = *string; *string; ++string )
  1158. {
  1159. if( cc == c )
  1160. {
  1161. if( gef == num )
  1162. return p;
  1163. else
  1164. ++gef;
  1165. }
  1166. ++p;
  1167. }
  1168. return -1;
  1169. }
  1170. int Framework::stringPositionVonString( char *string, char *suche, int sBegPos ) // sucht die position von 'suche' in 'string' ab der Position 'sBegPos', -1 bei nicht gefunden
  1171. {
  1172. for( int i = 0; i < sBegPos; ++i )
  1173. {
  1174. if( !*string )
  1175. return -1;
  1176. ++string;
  1177. }
  1178. int tl = textLength( suche ); // Länge der Übergabe
  1179. int txl = textLength( string ); // Länge des Textes
  1180. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  1181. return -1;
  1182. for( int i = 0; i + tl <= txl; ++i ) // suchen
  1183. {
  1184. bool b = 1;
  1185. for( int ii = 0; ii < tl; ++ii ) // überprüfen
  1186. if( b )
  1187. b = string[ i + ii ] == suche[ ii ];
  1188. if( b )
  1189. return i + sBegPos;
  1190. }
  1191. return -1;
  1192. }
  1193. //---Andere Funktionen---
  1194. void Framework::TextKopieren( const char *txt ) // kopiert den Text in den Zwischenspeicher
  1195. {
  1196. #ifdef WIN32
  1197. int län = textLength( txt ) + 1;
  1198. if( län == 1 )
  1199. return;
  1200. HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, län );
  1201. if( !hMem )
  1202. return;
  1203. memcpy( GlobalLock( hMem ), txt, län );
  1204. GlobalUnlock( hMem );
  1205. OpenClipboard( 0 );
  1206. EmptyClipboard();
  1207. SetClipboardData( CF_TEXT, hMem );
  1208. CloseClipboard();
  1209. #endif
  1210. }
  1211. char *Framework::TextInsert() // gibt den Text aus der Zwischenablage zurück
  1212. {
  1213. #ifdef WIN32
  1214. if( !OpenClipboard( 0 ) )
  1215. return "";
  1216. HANDLE hClipData = GetClipboardData( CF_TEXT );
  1217. char *cBuffer = (char*)GlobalLock( hClipData );
  1218. GlobalUnlock( hClipData );
  1219. CloseClipboard();
  1220. return cBuffer;
  1221. #else
  1222. return 0;
  1223. #endif
  1224. }
  1225. char Framework::smallOrBig( char c, bool gr )
  1226. {
  1227. int ret = c;
  1228. if( gr )
  1229. {
  1230. if( c >= 'a' && c <= 'z' )
  1231. ret -= 32;
  1232. else
  1233. {
  1234. switch( c )
  1235. {
  1236. case '^':
  1237. return '°';
  1238. case '1':
  1239. return '!';
  1240. case '<':
  1241. return '>';
  1242. case '2':
  1243. return '\"';
  1244. case '3':
  1245. return '§';
  1246. case '4':
  1247. return '$';
  1248. case '5':
  1249. return '%';
  1250. case '6':
  1251. return '&';
  1252. case '7':
  1253. return '/';
  1254. case '8':
  1255. return '(';
  1256. case '9':
  1257. return ')';
  1258. case '0':
  1259. return '=';
  1260. case ',':
  1261. return ';';
  1262. case '.':
  1263. return ':';
  1264. case 'ß':
  1265. return '?';
  1266. case '-':
  1267. return '_';
  1268. case '´':
  1269. return '`';
  1270. case '+':
  1271. return '*';
  1272. case '#':
  1273. return '\'';
  1274. case 'ü':
  1275. return 'Ü';
  1276. case 'ö':
  1277. return 'Ö';
  1278. case 'ä':
  1279. return 'Ä';
  1280. }
  1281. }
  1282. }
  1283. else
  1284. {
  1285. if( c >= 'A' && c <= 'Z' )
  1286. ret += 32;
  1287. else
  1288. {
  1289. switch( c )
  1290. {
  1291. case '°':
  1292. return '^';
  1293. case '!':
  1294. return '1';
  1295. case '>':
  1296. return '<';
  1297. case '\"':
  1298. return '2';
  1299. case '§':
  1300. return '3';
  1301. case '$':
  1302. return '4';
  1303. case '%':
  1304. return '5';
  1305. case '&':
  1306. return '6';
  1307. case '/':
  1308. return '7';
  1309. case '(':
  1310. return '8';
  1311. case ')':
  1312. return '9';
  1313. case '=':
  1314. return '0';
  1315. case ';':
  1316. return ',';
  1317. case ':':
  1318. return '.';
  1319. case '?':
  1320. return 'ß';
  1321. case '_':
  1322. return '-';
  1323. case '`':
  1324. return '´';
  1325. case '*':
  1326. return '+';
  1327. case '\'':
  1328. return '#';
  1329. case 'Ü':
  1330. return 'ü';
  1331. case 'Ö':
  1332. return 'ö';
  1333. case 'Ä':
  1334. return 'ä';
  1335. }
  1336. }
  1337. }
  1338. return (char)ret;
  1339. }
  1340. bool Framework::istSchreibbar( unsigned char zeichen ) // prüft, ob zeichen ein Schreibbarer Buchstabe ist
  1341. {
  1342. if( zeichen > 32 && zeichen < 127 )
  1343. return 1;
  1344. if( zeichen == 128 || zeichen == 181 || zeichen == 178 || zeichen == 179 )
  1345. return 1;
  1346. if( zeichen > 191 && zeichen < 198 )
  1347. return 1;
  1348. if( zeichen > 199 && zeichen < 208 )
  1349. return 1;
  1350. if( zeichen > 209 && zeichen < 215 )
  1351. return 1;
  1352. if( zeichen > 216 && zeichen < 221 )
  1353. return 1;
  1354. if( zeichen > 222 && zeichen < 230 )
  1355. return 1;
  1356. if( zeichen > 231 && zeichen < 240 )
  1357. return 1;
  1358. if( zeichen > 241 && zeichen < 247 )
  1359. return 1;
  1360. if( zeichen > 248 && zeichen < 253 )
  1361. return 1;
  1362. if( zeichen == ' ' || zeichen == '\t' )
  1363. return 1;
  1364. return 0;
  1365. }
  1366. unsigned int Framework::TextZuInt( char *c, int system ) // Konvertiert c zu int
  1367. {
  1368. if( system == 16 )
  1369. return (unsigned int)strtoul( c, 0, system );
  1370. return (unsigned int)strtol( c, 0, system );
  1371. }
  1372. unsigned int Framework::TextZuInt( char *c, char **c_ende, int system )
  1373. {
  1374. if( system == 16 )
  1375. return (unsigned int)strtoul( c, c_ende, system );
  1376. return (unsigned int)strtol( c, c_ende, system );
  1377. }
  1378. unsigned __int64 Framework::TextZuInt64( char *c, int system )
  1379. {
  1380. if( system == 16 )
  1381. return strtoull( c, 0, system );
  1382. return (unsigned __int64)strtoll( c, 0, system );
  1383. }
  1384. unsigned __int64 Framework::TextZuInt64( char *c, char **c_ende, int system )
  1385. {
  1386. if( system == 16 )
  1387. return strtoull( c, c_ende, system );
  1388. return (unsigned __int64)strtoll( c, c_ende, system );
  1389. }
  1390. double Framework::TextZuDouble( char *c ) // Konvertiert c zu double
  1391. {
  1392. return strtod( c, 0 );
  1393. }
  1394. float Framework::TextZuFloat( char *c ) // Konvertiert c zu double
  1395. {
  1396. return strtof( c, 0 );
  1397. }
  1398. double Framework::TextZuDouble( char *c, char **c_ende )
  1399. {
  1400. return strtod( c, c_ende );
  1401. }
  1402. float Framework::TextZuFloat( char *c, char **c_ende )
  1403. {
  1404. return strtof( c, c_ende );
  1405. }
  1406. int Framework::textLength( const char *txt ) // gibt die Länge von txt zurück
  1407. {
  1408. if( !txt )
  1409. return 0;
  1410. int ret = 0;
  1411. for( ; txt[ ret ] != 0; ++ret );
  1412. return ret;
  1413. }