Text.cpp 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  1. //---Include---
  2. #include "Text.h"
  3. #include <sstream>
  4. #include <string>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <Windows.h>
  8. using namespace Framework;
  9. // inhalt der Text Klasse aus Text.h
  10. // Konstruktor
  11. Text::Text()
  12. {
  13. txt = 0;
  14. ref = 1;
  15. }
  16. Text::Text( const char *t )
  17. {
  18. txt = 0;
  19. setText( t ); // Text setzen
  20. ref = 1;
  21. }
  22. // Destruktor
  23. Text::~Text()
  24. {
  25. delete []txt;
  26. }
  27. // nicht constant
  28. void Text::setText( const char *t ) // ersetzt den Text
  29. {
  30. delete []txt; // alter Text löschen
  31. int l = (int)strlen( t ); // Länge des neuen Textes ermitteln
  32. txt = new char[ l + 1 ]; // neuen Text erstellen
  33. for( int i = 0; i < l; i++ ) // Text befüllen
  34. txt[ i ] = t[ i ];
  35. txt[ l ] = '\0'; // Textende Festlegen
  36. }
  37. // unconstant
  38. void Text::setText( const char *t, int l ) // ersetzt den Text
  39. {
  40. delete []txt; // alter Text löschen
  41. txt = new char[ l + 1 ]; // neuen Text erstellen
  42. for( int i = 0; i < l; i++ ) // Text befüllen
  43. txt[ i ] = t[ i ];
  44. txt[ l ] = '\0'; // Textende Festlegen
  45. }
  46. void Text::setText( Text *t )
  47. {
  48. setText( t->getText() ); // Text setzen
  49. t = t->release(); // übergabe loslassen
  50. }
  51. void Text::anhängen( const char *t ) // hängt an den Text an
  52. {
  53. int tl = (int)strlen( t ); // länge der übergabe
  54. int txl = getLänge(); // länge des Textes
  55. char *res = new char[ tl + txl + 1 ]; // neuen Text erstellen
  56. for( int i = 0; i < txl; i++ ) // mit jetzigem Text füllen
  57. res[ i ] = txt[ i ];
  58. for( int i = 0; i < tl; i++ ) // Übergabe anhängen
  59. res[ txl + i ] = t[ i ];
  60. res[ txl + tl ] = '\0'; // Textende festlegen
  61. setText( res ); // Test setzen
  62. delete []res; // Speicher freigeben
  63. }
  64. void Text::anhängen( const char *t, int l ) // hängt an den Text an
  65. {
  66. int txl = getLänge(); // länge des Textes
  67. char *res = new char[ l + txl + 1 ]; // neuen Text erstellen
  68. for( int i = 0; i < txl; i++ ) // mit jetzigem Text füllen
  69. res[ i ] = txt[ i ];
  70. for( int i = 0; i < l; i++ ) // Übergabe anhängen
  71. res[ txl + i ] = t[ i ];
  72. res[ txl + l ] = '\0'; // Textende festlegen
  73. setText( res, txl + l ); // Test setzen
  74. delete []res; // Speicher freigeben
  75. }
  76. void Text::anhängen( Text *t )
  77. {
  78. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  79. anhängen( t->getText() ); // Text anhängen
  80. t = t->release(); // Übergabe loslassen
  81. }
  82. void Text::anhängen( int num )
  83. {
  84. std::stringstream ss;
  85. ss << num;
  86. anhängen( ss.str().c_str() );
  87. }
  88. void Text::anhängen( unsigned int num )
  89. {
  90. std::stringstream ss;
  91. ss << num;
  92. anhängen( ss.str().c_str() );
  93. }
  94. void Text::einfügen( int p, char c ) // Fügt an stelle p ein
  95. {
  96. if( p > getLänge() || p < 0 ) // Auf unsinnige übergabe prüfen
  97. return;
  98. int txl = getLänge(); // Länge des Textes
  99. char *res = new char[ txl + 2 ]; // neuer Text erstellen
  100. for( int i = 0; i < p; i++ ) // Text füllen
  101. res[ i ] = txt[ i ];
  102. res[ p ] = c;
  103. for( int i = p; i < txl; i++ ) // Text füllen
  104. res[ i + 1 ] = txt[ i ];
  105. res[ txl + 1 ] = '\0'; // Text ende festlegen
  106. setText( res ); // Text setzen
  107. delete res; // Speicher freigeben
  108. }
  109. void Text::einfügen( int p, const char *t ) // Fügt an stelle p ein
  110. {
  111. if( p >= getLänge() || p < 0 || strlen( t ) <= 0 ) // Auf unsinnige übergabe prüfen
  112. return;
  113. int tl = (int)strlen( t ); // Länge der übergabe
  114. int txl = getLänge(); // Länge des Textes
  115. char *res = new char[ tl + txl + 1 ]; // neuer Text erstellen
  116. for( int i = 0; i < p; i++ ) // Text füllen
  117. res[ i ] = txt[ i ];
  118. for( int i = 0; i < tl; i++ ) // Text einfügen
  119. res[ i + p ] = t[ i ];
  120. for( int i = p; i < txl; i++ ) // Text füllen
  121. res[ i + tl ] = txt[ i ];
  122. res[ tl + txl ] = '\0'; // Text ende festlegen
  123. setText( res ); // Text setzen
  124. delete res; // Speicher freigeben
  125. }
  126. void Text::einfügen( int p, Text *t )
  127. {
  128. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  129. einfügen( p, t->getText() ); // Text einfügen
  130. t = t->release(); // Übergabe loslassen
  131. }
  132. void Text::ersetzen( int p1, int p2, const char *t ) // Ersetzt den Text von p1 bis p2
  133. {
  134. if( p1 > p2 )
  135. {
  136. int x = p1; // p1 und p2 tauschen
  137. p1 = p2;
  138. p2 = x;
  139. }
  140. löschen( p1, p2 ); // Textabschnitt von p1 zu p2 löschen
  141. einfügen( p1, t ); // Übergabe bei p1 einfügen
  142. }
  143. void Text::ersetzen( int p1, int p2, Text *t )
  144. {
  145. if( t->getLänge() >= 0 ) // Auf unsinnige übergabe prüfen
  146. ersetzen( p1, p2, t->getText() ); // Text ersetzen
  147. t = t->release(); // Übergabe loslassen
  148. }
  149. void Text::ersetzen( char c1, char c2 ) // ersetzt jedes c1 durch c2
  150. {
  151. if( c1 == '\0' || c2 == '\0' ) // Auf unsinnige übergabe prüfen
  152. return;
  153. if( !hat( c1 ) ) // prüfen ob c1 vorhanden
  154. return;
  155. int l = getLänge(); // Text Länge
  156. for( int i = 0; i < l; i++ ) // Text durchsuchen
  157. if( txt[ i ] == c1 )
  158. txt[ i ] = c2; // Text ersetzen
  159. }
  160. void Text::ersetzen( const char *t1, const char *t2 ) // ersetzt jedes t1 durch t2
  161. {
  162. int txl = getLänge(); // Text Länge
  163. int t1l = (int)strlen( t1 ); // Länge der Übergaben
  164. int t2l = (int)strlen( t2 );
  165. if( t1l >= txl || t1l <= 0 ) // Auf unsinnige übergabe prüfen
  166. return;
  167. if( !hat( t1 ) ) // prüfen ob t1 vorhanden
  168. return;
  169. int anz = anzahlVon( t1 ); // Anzahl von t1 im Text
  170. int *begin = new int[ anz ];
  171. int *end = new int[ anz ];
  172. for( int i = 0; i < anz; i++ ) // Positionen von t1 speichern
  173. {
  174. begin[ i ] = positionVon( t1, i );
  175. end[ i ] = begin[ i ] + t1l;
  176. }
  177. int resl = ( txl - ( anz * t1l ) ) + ( anz * t2l ) + 1; // Länge des Ergebneses
  178. char *res = new char[ resl ]; // neuer Text erstellen
  179. int rep = 0; // Speichert bei welchen t1 man sich befindet
  180. int last = 0; // Füllposition von txt
  181. int neu = 0; // Füllporition von res
  182. for( ; neu < resl; neu++ ) // Text befüllen
  183. {
  184. if( last == begin[ rep ] ) // Text ersetzen
  185. {
  186. last = end[ rep ];
  187. rep++;
  188. for( int ii = 0; ii < t2l; ii++ )
  189. {
  190. res[ neu ] = t2[ ii ];
  191. neu++;
  192. }
  193. neu--;
  194. }
  195. else // Text Kopieren
  196. {
  197. res[ neu ] = txt[ last ];
  198. last++;
  199. }
  200. }
  201. res[ resl - 1 ] = '\0'; // Textende festlegen
  202. setText( res ); // Text setzen
  203. delete []begin; // Speicher freigeben
  204. delete []end;
  205. delete []res;
  206. }
  207. void Text::ersetzen( Text *t1, const char *t2 )
  208. {
  209. if( t1->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  210. ersetzen( t1->getText(), t2 ); // ersetzen
  211. t1 = t1->release(); // Übergabe loslassen
  212. }
  213. void Text::ersetzen( const char *t1, Text *t2 )
  214. {
  215. if( t2->getLänge() >= 0 ) // Auf unsinnige übergabe prüfen
  216. ersetzen( t1, t2->getText() ); // ersetzen
  217. t2 = t2->release(); // Übergabe loslassen
  218. }
  219. void Text::ersetzen( Text *t1, Text *t2 )
  220. {
  221. if( t1->getLänge() > 0 && t2->getLänge() >= 0 ) // Auf unsinnige übergabe prüfen
  222. ersetzen( t1->getText(), t2->getText() ); // ersetzen
  223. t1 = t1->release(); // Übergaben loslassen
  224. t2 = t2->release();
  225. }
  226. void Text::ersetzen( int index, char c1, char c2 ) // ersetzt das i-te c1 durch c2
  227. {
  228. if( c1 == '\0' || c2 == '\0' || index < 0 ) // Auf unsinnige übergabe prüfen
  229. return;
  230. if( !hat( c1 ) ) // prüfen ob c1 vorhanden
  231. return;
  232. int l = getLänge(); // Text Länge
  233. int anz = anzahlVon( c1 );
  234. if( index >= anz ) // prüfen ob es ein i-tes c1 gibt
  235. return;
  236. txt[ positionVon( c1, index ) ] = c2;
  237. }
  238. void Text::ersetzen( int index, const char *t1, const char *t2 ) // ersetzt das i-te t1 durch t2
  239. {
  240. int txl = getLänge(); // Text Länge
  241. int t1l = (int)strlen( t1 ); // Länge der Übergaben
  242. int t2l = (int)strlen( t2 );
  243. if( t1l >= txl || t1l <= 0 || index < 0 ) // Auf unsinnige übergabe prüfen
  244. return;
  245. if( !hat( t1 ) ) // prüfen ob t1 vorhanden
  246. return;
  247. int anz = anzahlVon( t1 ); // Anzahl von t1 im Text
  248. if( index >= anz ) // prüfen ob es ein i-tes t1 gibt
  249. return;
  250. int begin = positionVon( t1, index );
  251. int end = begin + t1l;
  252. ersetzen( begin, end, t2 ); // ersetzen
  253. }
  254. void Text::ersetzen( int i, Text *t1, const char *t2 )
  255. {
  256. if( t1->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  257. ersetzen( i, t1->getText(), t2 ); // ersetzen
  258. t1 = t1->release(); // Übergabe loslassen
  259. }
  260. void Text::ersetzen( int i, const char *t1, Text *t2 )
  261. {
  262. if( t2->getLänge() >= 0 ) // Auf unsinnige übergabe prüfen
  263. ersetzen( i, t1, t2->getText() ); // ersetzen
  264. t2 = t2->release(); // Übergabe loslassen
  265. }
  266. void Text::ersetzen( int i, Text *t1, Text *t2 )
  267. {
  268. if( t1->getLänge() > 0 || t2->getLänge() >= 0 ) // Auf unsinnige übergabe prüfen
  269. ersetzen( i, t1->getText(), t2->getText() ); // ersetzen
  270. t1 = t1->release(); // Übergaben loslassen
  271. t2 = t2->release();
  272. }
  273. void Text::füllText( char c, int län ) // setzt den Text zu so vielen c wie län groß ist
  274. {
  275. char *res = new char[ län + 1 ];
  276. for( int i = 0; i < län; i++ )
  277. res[ i ] = c;
  278. res[ län ] = '\0';
  279. setText( res );
  280. delete []res;
  281. }
  282. void Text::löschen( int p ) // löscht p
  283. {
  284. int l = getLänge(); // Text Länge
  285. if( p < 0 || p > l ) // Auf unsinnige übergabe prüfen
  286. return;
  287. char *res = new char[ l ]; // neuen Text anlegen
  288. for( int i = 0; i < p; i ++ ) // Text befüllen
  289. res[ i ] = txt[ i ];
  290. for( int i = p + 1; i < l; i++ )
  291. res[ i - 1 ] = txt[ i ];
  292. res[ l - 1 ] = 0;
  293. setText( res ); // Text setzen
  294. delete []res; // Speicher freigeben
  295. }
  296. void Text::löschen( int p1, int p2 ) // löscht von p1 zu p2 ( p2 bleibt )
  297. {
  298. if( p1 > p2 ) // p1 und p2 tauschen
  299. {
  300. int x = p1;
  301. p1 = p2;
  302. p2 = x;
  303. }
  304. int l = getLänge(); // Länge des Testes
  305. if( p1 < 0 || p2 > l ) // Auf unsinnige übergabe prüfen
  306. return;
  307. int resl = l - ( p2 - p1 ); // Länge vom Ergebnis
  308. char *res = new char[ resl + 1 ]; // Neuen Text erstellen
  309. for( int i = 0; i < p1; i++ ) // Text füllen
  310. res[ i ] = txt[ i ];
  311. for( int i = p2; i < l; i++ )
  312. res[ i - ( p2 - p1 ) ] = txt[ i ];
  313. res[ resl ] = '\0'; // Testende festlegen
  314. setText( res ); // Text setzen
  315. delete []res; // Speicher freigeben
  316. }
  317. void Text::löschen( char c ) // löscht jetes c
  318. {
  319. if( !hat( c ) ) // prüfen ob c vorhanden
  320. return;
  321. int l = getLänge(); // Länge des Textes
  322. int anz = anzahlVon( c ); // Anzahl von c
  323. char *res = new char[ l - anz + 1 ]; // neuen Text erstellen
  324. anz = 0;
  325. for( int i = 0; i < l; i++ ) // Text befüllen
  326. if( txt[ i ] == c )
  327. anz++;
  328. else
  329. res[ i - anz ] = txt[ i ];
  330. res[ l - anz ] = '\0'; // Textende festlegen
  331. setText( res ); // Text setzen
  332. delete []res; // Speicher freigeben
  333. }
  334. void Text::löschen( const char *t ) // löscht jetes t
  335. {
  336. int tl = (int)strlen( t ); // Länge der Übergabe
  337. int txl = getLänge(); // Länge des Textes
  338. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  339. return;
  340. if( !hat( t ) ) // prüfen ob Text ein t enthält
  341. return;
  342. int anz = anzahlVon( t ); // anzahl von t
  343. int *begin = new int[ anz ];
  344. for( int i = 0; i < anz; i++ ) // begin aller t-s finden
  345. begin[ i ] = positionVon( t, i );
  346. int resl = txl - ( anz * tl ); // Länge vom Ergebnes
  347. char *res = new char[ resl + 1 ]; // neuen Text erzeugen
  348. int del = 0;
  349. for( int i = 0; i < txl; i++ ) // Text befüllen
  350. {
  351. if( i == begin[ del ] ) // Text auslassen
  352. {
  353. i += tl - 1;
  354. del++;
  355. }
  356. else
  357. res[ i - ( del * tl ) ] = txt[ i ]; // Text befüllen
  358. }
  359. res[ resl ] = '\0'; // Text ende festlegen
  360. setText( res ); // Text setzen
  361. delete []begin;
  362. delete []res; // Speicher freigeben
  363. }
  364. void Text::löschen( Text *t )
  365. {
  366. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  367. löschen( t->getText() ); // löschen
  368. t = t->release(); // Übergabe loslassen
  369. }
  370. void Text::löschen( int index, char c )
  371. {
  372. if( index < 0 || !hat( c ) ) // Auf unsinnige übergabe prüfen
  373. return;
  374. int anz = anzahlVon( c ); // anzahl der i-s
  375. if( index >= anz ) // prüfen ob ein i-tes c vorhanden ist
  376. return;
  377. int pos = positionVon( c, index ); // Position vom i-ten c
  378. int l = getLänge(); // Länge des Textes
  379. char *res = new char[ l ]; // neuen Text erzeugen
  380. for( int i = 0; i < pos; i++ ) // Text befüllen
  381. res[ i ] = txt[ i ];
  382. for( int i = pos + 1; i < l; i++ )
  383. res[ i - 1 ] = txt[ i ];
  384. res[ l - 1 ] = '\0'; // Text ende festlegen
  385. setText( res ); // Text setzen
  386. delete []res; // Speicher freigeben
  387. }
  388. void Text::löschen( int index, const char *t ) // löscht das i-te t
  389. {
  390. int tl = (int)strlen( t ); // Länge der Übergabe
  391. if( index < 0 || !hat( t ) || tl <= 0 ) // Auf unsinnige übergabe prüfen
  392. return;
  393. int anz = anzahlVon( t ); // anzahl der i-s
  394. if( index >= anz ) // prüfen ob ein i-tes c vorhanden ist
  395. return;
  396. int pos = positionVon( t, index ); // Position vom i-ten c
  397. int l = getLänge(); // Länge des Textes
  398. char *res = new char[ l - tl + 1 ]; // neuen Text erzeugen
  399. for( int i = 0; i < pos; i++ ) // Text befüllen
  400. res[ i ] = txt[ i ];
  401. for( int i = pos + tl; i < l; i++ )
  402. res[ i - 1 ] = txt[ i ];
  403. res[ l - tl ] = '\0'; // Text ende festlegen
  404. setText( res ); // Text setzen
  405. delete []res; // Speicher freigeben
  406. }
  407. void Text::löschen( int i, Text *t )
  408. {
  409. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  410. löschen( i, t->getText() ); // löschen
  411. t = t->release(); // Übergabe loslassen
  412. }
  413. // constant
  414. int Text::getLänge() const // gibt die Text länge zurück
  415. {
  416. if( !txt )
  417. return -1;
  418. int ret = 0;
  419. for( ; txt[ ret ] != '\0'; ret++ ); // zählen
  420. return ret;
  421. }
  422. int Text::getLKick( int pos )
  423. {
  424. if( txt[ pos - 1 ] == ' ' )
  425. {
  426. int ret = 1;
  427. for( ; ret < pos && txt[ pos - ret - 1 ] == ' ' && txt[ pos + ret ] != '\n'; ret++ );
  428. return pos - ret;
  429. }
  430. else
  431. {
  432. int ret = 1;
  433. for( ; ret < pos && txt[ pos - ret - 1 ] != ' ' && txt[ pos + ret ] != '\n'; ret++ );
  434. return pos - ret;
  435. }
  436. }
  437. int Text::getOKick( int pos )
  438. {
  439. if( !hat( '\n' ) )
  440. return 0;
  441. int lpos = 1;
  442. while( txt[ pos - lpos ] != '\n' && pos - lpos >= 0 )
  443. lpos++;
  444. int vllän = 0;
  445. while( txt[ pos - lpos - vllän - 1 ] != '\n' && pos - lpos - vllän - 1 >= 0 )
  446. vllän++;
  447. if( !vllän ||vllän < lpos )
  448. return pos - lpos;
  449. return pos - lpos - ( vllän - lpos ) - 1;
  450. }
  451. int Text::getRKick( int pos )
  452. {
  453. int tl = getLänge();
  454. if( txt[ pos ] == ' ' )
  455. {
  456. int ret = 1;
  457. for( ; ret + pos < tl && txt[ pos + ret ] == ' ' && txt[ pos + ret ] != '\n'; ret++ );
  458. return pos + ret;
  459. }
  460. else
  461. {
  462. int ret = 1;
  463. for( ; ret + pos < tl && txt[ pos + ret ] != ' '&& txt[ pos + ret ] != '\n'; ret++ );
  464. return pos + ret;
  465. }
  466. }
  467. int Text::getUKick( int pos )
  468. {
  469. if( !hat( '\n' ) )
  470. return getLänge();
  471. int lpos = 0;
  472. while( txt[ pos - lpos - 1 ] != '\n' && pos - lpos >= 0 )
  473. lpos++;
  474. int llän = 0;
  475. while( txt[ pos + llän ] != '\n' && pos + llän < getLänge() )
  476. llän++;
  477. int vllän = 0;
  478. while( txt[ pos + llän + vllän + 1 ] != '\n' && pos + llän + vllän + 1 < getLänge() )
  479. vllän++;
  480. if( !vllän )
  481. return pos + llän;
  482. if( vllän < lpos )
  483. return pos + llän + vllän + 1;
  484. return pos + llän + lpos;
  485. }
  486. bool Text::hat( Text *t ) const // enthält der Text t
  487. {
  488. bool ret = 0;
  489. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  490. ret = hat( t->getText() ); // prüfen
  491. t = t->release(); // Übergabe loslassen
  492. return ret;
  493. }
  494. bool Text::hat( const char *t ) const
  495. {
  496. int tl = (int)strlen( t ); // Länge der Übergabe
  497. int txl = getLänge(); // Länge des Textes
  498. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  499. return 0;
  500. for( int i = 0; i + tl <= txl; i++ ) // Text durchsuchen
  501. {
  502. bool b = 1;
  503. for( int ii = 0; ii < tl; ii++ ) // Text überprüfen
  504. if( b )
  505. b = txt[ i + ii ] == t[ ii ];
  506. if( b )
  507. return 1;
  508. }
  509. return 0;
  510. }
  511. bool Text::hat( char c ) const // enthält c
  512. {
  513. int l = getLänge(); // Text Länge
  514. bool ret = 0;
  515. for( int i = 0; i < l; i++ ) // suchen
  516. if( !ret ) // überprüfen
  517. ret = txt[ i ] == c;
  518. return ret;
  519. }
  520. bool Text::istGleich( const char *t ) const // prüft ob det Text gleich t ist
  521. {
  522. int txl = getLänge(); // Text Länge
  523. int tl = (int)strlen( t ); // Länge der Übergabe
  524. if( txl != tl ) // Auf unsinniege Übergabe prüfen
  525. return 0;
  526. if( txl == -1 )
  527. return 1;
  528. bool ret = true;
  529. for( int i = 0; i < tl; i++ ) // prüfen
  530. if( ret )
  531. ret = txt[ i ] == t[ i ];
  532. return ret;
  533. }
  534. bool Text::istGleich( Text *t ) const
  535. {
  536. bool ret = istGleich( t->getText() ); // prüfen
  537. t->release(); // Übergabe loslassen
  538. return ret;
  539. }
  540. char *Text::getText() const // gibt Text zurück
  541. {
  542. return txt;
  543. }
  544. int Text::anzahlVon( char c ) const // gibt die Anzahl von c im Text zurück
  545. {
  546. int ret = 0;
  547. int l = getLänge(); // Text Länge
  548. for( int i = 0; i < l; i++ ) // suchen
  549. if( txt[ i ] == c ) // überprüfen
  550. ret++; // zählen
  551. return ret;
  552. }
  553. int Text::anzahlVon( const char *t ) const // gibt die Anzahl von t im Text zurück
  554. {
  555. int tl = (int)strlen( t ); // Länge der Übergabe
  556. int txl = getLänge(); // Länge des Textes
  557. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  558. return 0;
  559. int ret = 0;
  560. for( int i = 0; i + tl <= txl; i++ ) // suchen
  561. {
  562. bool b = 1;
  563. for( int ii = 0; ii < tl; ii++ ) // überprüfen
  564. if( b )
  565. b = txt[ i + ii ] == t[ ii ];
  566. if( b )
  567. ret++; // zählen
  568. }
  569. return ret;
  570. }
  571. int Text::anzahlVon( Text *t ) const
  572. {
  573. int ret = 0;
  574. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  575. ret = anzahlVon( t->getText() ); // zählen
  576. t = t->release(); // Übergabe loslassen
  577. return ret;
  578. }
  579. int Text::positionVon( char c ) const // gibt die Position des ersten c zurück
  580. {
  581. int l = getLänge(); // Text Länge
  582. for( int i = 0; i < l; i++ ) // suchen
  583. if( txt[ i ] == c ) // überprüfen
  584. return i;
  585. return -1;
  586. }
  587. int Text::positionVon( const char *t ) const // gibt die Position des ersten t zurück
  588. {
  589. int tl = (int)strlen( t ); // Länge der Übergabe
  590. int txl = getLänge(); // Länge des Textes
  591. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  592. return -1;
  593. for( int i = 0; i + tl <= txl; i++ ) // suchen
  594. {
  595. bool b = 1;
  596. for( int ii = 0; ii < tl; ii++ ) // überprüfen
  597. if( b )
  598. b = txt[ i + ii ] == t[ ii ];
  599. if( b )
  600. return i;
  601. }
  602. return -1;
  603. }
  604. int Text::positionVon( Text *t ) const
  605. {
  606. int ret = 0;
  607. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  608. ret = positionVon( t->getText() ); // position ermitteln
  609. t = t->release(); // Übergabe loslassen
  610. return ret;
  611. }
  612. int Text::positionVon( char c, int index ) const // gibt die Position des i-ten c zurück
  613. {
  614. int l = getLänge(); // Text Länge
  615. int ii = 0;
  616. for( int i = 0; i < l; i++ ) // suchen
  617. if( txt[ i ] == c ) // überprüfen
  618. if( ii == index )
  619. return i;
  620. else
  621. ii++;
  622. return -1;
  623. }
  624. int Text::positionVon( const char *t, int index ) const // gibt die Position des i-ten t zurück
  625. {
  626. int tl = (int)strlen( t ); // Länge der Übergabe
  627. int txl = getLänge(); // Länge des Textes
  628. if( tl <= 0 || tl > txl ) // Auf unsinnige übergabe prüfen
  629. return 0;
  630. int i2 = 0;
  631. for( int i = 0; i + tl <= txl; i++ ) // suchen
  632. {
  633. bool b = 1;
  634. for( int ii = 0; ii < tl; ii++ ) // überprüfen
  635. if( b )
  636. b = txt[ i + ii ] == t[ ii ];
  637. if( b )
  638. if( i2 == index )
  639. return i;
  640. else
  641. i2++;
  642. }
  643. return -1;
  644. }
  645. int Text::positionVon( Text *t, int i ) const
  646. {
  647. int ret = 0;
  648. if( t->getLänge() > 0 ) // Auf unsinnige übergabe prüfen
  649. ret = positionVon( t->getText(), i ); // position ermitteln
  650. t = t->release(); // Übergabe loslassen
  651. return ret;
  652. }
  653. Text *Text::getTeilText( int p1, int p2 ) const // gibt den Text von p1 bis p2 zurück
  654. {
  655. if( p1 > p2 ) // p1 und p2 tauschen
  656. {
  657. int x = p1;
  658. p1 = p2;
  659. p2 = x;
  660. }
  661. int l = getLänge(); // Text Länge
  662. if( p1 < 0 || p2 > l ) // Auf unsinnige übergabe prüfen
  663. return new Text( "" );
  664. char *cp = new char[ p2 - p1 + 1 ]; // neuen Text erstellen
  665. for( int i = p1; i < p2; i++ ) // Text befüllen
  666. {
  667. cp[ i - p1 ] = txt[ i ];
  668. }
  669. cp[ p2 - p1 ] = '\0';
  670. Text *t = new Text( cp ); // Text zurückgeben
  671. delete []cp;
  672. return t;
  673. }
  674. Text *Text::getTeilText( int p ) const // gibt den Text von p bis zum Ende zurück
  675. {
  676. return getTeilText( p, getLänge() ); // Text zurückgeben
  677. }
  678. // Reference Counting
  679. Text *Text::getThis()
  680. {
  681. ref++;
  682. return this;
  683. }
  684. Text *Text::release()
  685. {
  686. ref--;
  687. if( ref < 1 )
  688. delete this;
  689. return 0;
  690. }
  691. // inhalt der TextArray Klasse aus Text.h
  692. // konstruktor
  693. TextArray::TextArray()
  694. {
  695. This = 0;
  696. next = 0;
  697. index = 0;
  698. }
  699. // destruktor
  700. TextArray::~TextArray()
  701. {
  702. if( next )
  703. delete next;
  704. }
  705. // nicht constant
  706. void TextArray::addText( Text *txt ) // fügt einen Text hinzu
  707. {
  708. if( !This )
  709. {
  710. This = txt;
  711. return;
  712. }
  713. if( !next )
  714. next = new TextArray();
  715. next->addText( txt );
  716. }
  717. void TextArray::addText( const char *txt )
  718. {
  719. Text *text = new Text( txt );
  720. addText( text );
  721. }
  722. bool TextArray::löscheText( Text *txt, bool eins ) // löscht einen Text
  723. {
  724. if( This == txt )
  725. {
  726. This = This->release();
  727. txt->release();
  728. if( eins && next )
  729. {
  730. This = next->getThis();
  731. TextArray *tmp = next->getNext();
  732. next->setNext0();
  733. delete next;
  734. next = tmp;
  735. }
  736. return 1;
  737. }
  738. if( next )
  739. {
  740. if( next->löscheText( txt, 0 ) )
  741. {
  742. TextArray *tmp = next->getNext();
  743. next->setNext0();
  744. delete next;
  745. next = tmp;
  746. }
  747. }
  748. return 0;
  749. }
  750. bool TextArray::löscheText( unsigned char *txt, bool eins )
  751. {
  752. if( This->istGleich( (const char *)&txt ) )
  753. {
  754. This = This->release();
  755. if( eins && next )
  756. {
  757. This = next->getThis();
  758. TextArray *tmp = next->getNext();
  759. next->setNext0();
  760. delete next;
  761. next = tmp;
  762. }
  763. return 1;
  764. }
  765. if( next )
  766. {
  767. if( next->löscheText( txt, 0 ) )
  768. {
  769. TextArray *tmp = next->getNext();
  770. next->setNext0();
  771. delete next;
  772. next = tmp;
  773. }
  774. }
  775. return 0;
  776. }
  777. bool TextArray::löscheText( int index, bool eins )
  778. {
  779. if( this->index == index )
  780. {
  781. This = This->release();
  782. if( eins && next )
  783. {
  784. This = next->getThis();
  785. TextArray *tmp = next->getNext();
  786. next->setNext0();
  787. delete next;
  788. next = tmp;
  789. }
  790. return 1;
  791. }
  792. if( next )
  793. {
  794. next->setIndex( this->index + 1 );
  795. if( next->löscheText( index, 0 ) )
  796. {
  797. TextArray *tmp = next->getNext();
  798. next->setNext0();
  799. delete next;
  800. next = tmp;
  801. }
  802. }
  803. return 0;
  804. }
  805. void TextArray::setNext0() // setzt den next Zeiger auf null
  806. {
  807. next = 0;
  808. }
  809. void TextArray::setIndex( int i ) // setzt den index
  810. {
  811. index = i;
  812. }
  813. // constant
  814. Text *TextArray::getText( int index ) const // gibt den i-ten Text zurück
  815. {
  816. if( this->index == index )
  817. return This->getThis();
  818. if( next )
  819. {
  820. next->setIndex( this->index + 1 );
  821. return next->getText( index );
  822. }
  823. return 0;
  824. }
  825. Text *TextArray::zText( int index ) const
  826. {
  827. if( this->index == index )
  828. return This;
  829. if( next )
  830. {
  831. next->setIndex( this->index + 1 );
  832. return next->getText( index );
  833. }
  834. return 0;
  835. }
  836. TextArray *TextArray::getNext() const // gibt den next Zeiger zurück
  837. {
  838. return next;
  839. }
  840. Text *TextArray::getThis() const // gibt den This zeiger zurück
  841. {
  842. return This;
  843. }
  844. //---Andere Funktionen---
  845. void Framework::ZuWCharT( const char *txt, wchar_t *res ) // wandelt in wchar_t um
  846. {
  847. for( unsigned int i = 0; i < strlen( txt ); i++ )
  848. {
  849. switch( txt[ i ] )
  850. {
  851. case 'ü':
  852. res[ i ] = L'ü';
  853. break;
  854. case 'ö':
  855. res[ i ] = L'ö';
  856. break;
  857. case 'ä':
  858. res[ i ] = L'ä';
  859. break;
  860. case 'ß':
  861. res[ i ] = L'ß';
  862. break;
  863. default:
  864. res[ i ] = ( wchar_t )txt[ i ];
  865. }
  866. }
  867. res[ strlen( txt ) ] = '\0';
  868. }
  869. void Framework::ZuChar( const wchar_t *txt, char *res ) // wandelt in char um
  870. {
  871. for( unsigned int i = 0; i < wcslen( txt ); i++ )
  872. {
  873. switch( txt[ i ] )
  874. {
  875. case L'ü':
  876. res[ i ] = 'ü';
  877. break;
  878. case L'ö':
  879. res[ i ] = 'ö';
  880. break;
  881. case L'ä':
  882. res[ i ] = 'ä';
  883. break;
  884. case L'ß':
  885. res[ i ] = 'ß';
  886. break;
  887. default:
  888. res[ i ] = ( char )txt[ i ];
  889. }
  890. }
  891. res[ wcslen( txt ) ] = '\0';
  892. }
  893. char Framework::KleinOrGroß( char c, bool gr )
  894. {
  895. int ret = c;
  896. if( gr )
  897. {
  898. if( c >= 'a' && c <= 'z' )
  899. ret -= 32;
  900. else
  901. {
  902. switch( c )
  903. {
  904. case '^':
  905. return '°';
  906. case '1':
  907. return '!';
  908. case '<':
  909. return '>';
  910. case '2':
  911. return '\"';
  912. case '3':
  913. return '§';
  914. case '4':
  915. return '$';
  916. case '5':
  917. return '%';
  918. case '6':
  919. return '&';
  920. case '7':
  921. return '/';
  922. case '8':
  923. return '(';
  924. case '9':
  925. return ')';
  926. case '0':
  927. return '=';
  928. case ',':
  929. return ';';
  930. case '.':
  931. return ':';
  932. case 'ß':
  933. return '?';
  934. case '-':
  935. return '_';
  936. case '´':
  937. return '`';
  938. case '+':
  939. return '*';
  940. case '#':
  941. return '\'';
  942. case 'ü':
  943. return 'Ü';
  944. case 'ö':
  945. return 'Ö';
  946. case 'ä':
  947. return 'Ä';
  948. }
  949. }
  950. }
  951. else
  952. {
  953. if( c >= 'A' && c <= 'Z' )
  954. ret += 32;
  955. else
  956. {
  957. switch( c )
  958. {
  959. case '°':
  960. return '^';
  961. case '!':
  962. return '1';
  963. case '>':
  964. return '<';
  965. case '\"':
  966. return '2';
  967. case '§':
  968. return '3';
  969. case '$':
  970. return '4';
  971. case '%':
  972. return '5';
  973. case '&':
  974. return '6';
  975. case '/':
  976. return '7';
  977. case '(':
  978. return '8';
  979. case ')':
  980. return '9';
  981. case '=':
  982. return '0';
  983. case ';':
  984. return ',';
  985. case ':':
  986. return '.';
  987. case '?':
  988. return 'ß';
  989. case '_':
  990. return '-';
  991. case '`':
  992. return '´';
  993. case '*':
  994. return '+';
  995. case '\'':
  996. return '#';
  997. case 'Ü':
  998. return 'ü';
  999. case 'Ö':
  1000. return 'ö';
  1001. case 'Ä':
  1002. return 'ä';
  1003. }
  1004. }
  1005. }
  1006. return ret;
  1007. }
  1008. bool Framework::istSchreibbar( unsigned char zeichen ) // prüft, ob zeichen ein Schreibbarer Buchstabe ist
  1009. {
  1010. if( zeichen > 32 && zeichen < 127 )
  1011. return 1;
  1012. if( zeichen == 128 || zeichen == 181 || zeichen == 178 || zeichen == 179 )
  1013. return 1;
  1014. if( zeichen > 191 && zeichen < 198 )
  1015. return 1;
  1016. if( zeichen > 199 && zeichen < 208 )
  1017. return 1;
  1018. if( zeichen > 209 && zeichen < 215 )
  1019. return 1;
  1020. if( zeichen > 216 && zeichen < 221 )
  1021. return 1;
  1022. if( zeichen > 222 && zeichen < 230 )
  1023. return 1;
  1024. if( zeichen > 231 && zeichen < 240 )
  1025. return 1;
  1026. if( zeichen > 241 && zeichen < 247 )
  1027. return 1;
  1028. if( zeichen > 248 && zeichen < 253 )
  1029. return 1;
  1030. if( zeichen == ' ' )
  1031. return 1;
  1032. return 0;
  1033. }
  1034. unsigned int Framework::TextZuInt( char *c, int system ) // Konvertiert c zu int
  1035. {
  1036. return strtol( c, 0, system );
  1037. }
  1038. unsigned int Framework::TextZuInt( char *c, char **c_ende, int system )
  1039. {
  1040. return strtol( c, c_ende, system );
  1041. }
  1042. char *Framework::convert( char *txt, int *error, int *len ) // konvertiert den Text
  1043. {
  1044. *len = 0;
  1045. *error = 0;
  1046. int l = (int)strlen( txt );
  1047. int ll = ( ( l * 5 ) / 9 ) == ( ( l * 5.0 ) / 9.0 ) ? ( ( l * 5 ) / 9 ) : ( ( l * 5 ) / 9 + 1 );
  1048. char *ret = new char[ ll + 1 ];
  1049. int bbeg = 0;
  1050. for( int i = 0; i < 15; i++ )
  1051. {
  1052. char c = txt[ i + *error ];
  1053. if( c == '\0' )
  1054. break;
  1055. if( c > 96 && c < 123 )
  1056. c -= 96;
  1057. else if( c > 64 && c < 91 )
  1058. c -= 64;
  1059. else if( c == 'ü' || c == 'Ü' )
  1060. c = 27;
  1061. else if( c == 'ö' || c == 'Ö' )
  1062. c = 28;
  1063. else if( c == 'ä' || c == 'Ä' )
  1064. c = 29;
  1065. else if( c == 'ß' )
  1066. c = 30;
  1067. else if( c == '.' )
  1068. c = 31;
  1069. else
  1070. {
  1071. *error++;
  1072. i--;
  1073. continue;
  1074. }
  1075. *len++;
  1076. switch( i )
  1077. {
  1078. case 0:
  1079. ret[ 0 ] = c << 3;
  1080. break;
  1081. case 1:
  1082. ret[ 0 ] |= c >> 2;
  1083. ret[ 1 ] = c << 6;
  1084. break;
  1085. case 2:
  1086. ret[ 1 ] |= c << 1;
  1087. break;
  1088. case 3:
  1089. ret[ 1 ] |= c >> 4;
  1090. ret[ 2 ] = c << 5;
  1091. break;
  1092. case 4:
  1093. ret[ 2 ] |= c;
  1094. break;
  1095. case 5:
  1096. ret[ 3 ] = c << 3;
  1097. break;
  1098. case 6:
  1099. ret[ 3 ] |= c >> 2;
  1100. ret[ 4 ] = c << 6;
  1101. break;
  1102. case 7:
  1103. ret[ 4 ] |= c << 1;
  1104. break;
  1105. case 8:
  1106. ret[ 4 ] |= c >> 4;
  1107. ret[ 5 ] = c << 5;
  1108. break;
  1109. case 9:
  1110. ret[ 5 ] |= c;
  1111. break;
  1112. case 10:
  1113. ret[ 6 ] = c << 3;
  1114. break;
  1115. case 11:
  1116. ret[ 6 ] |= c >> 2;
  1117. ret[ 7 ] = c << 6;
  1118. break;
  1119. case 12:
  1120. ret[ 7 ] |= c << 1;
  1121. break;
  1122. case 13:
  1123. ret[ 7 ] |= c >> 4;
  1124. ret[ 8 ] = c << 5;
  1125. break;
  1126. case 14:
  1127. ret[ 8 ] |= c;
  1128. break;
  1129. }
  1130. bbeg += 5;
  1131. }
  1132. ll = ( bbeg / 8 ) == ( bbeg / 8.0 ) ? ( bbeg / 8 ) : ( bbeg / 8 + 1 );
  1133. ret[ ll ] = '\0';
  1134. return ret;
  1135. }
  1136. char *Framework::deConvert( char *txt ) // dekonvertiert den Text
  1137. {
  1138. int l = (int)strlen( txt );
  1139. int ll = ( l * 8 ) / 5;
  1140. char *ret = new char[ ll + 1 ];
  1141. for( int i = 0; i < ll; i++ )
  1142. {
  1143. char c;
  1144. switch( i )
  1145. {
  1146. case 0:
  1147. c = ( ret[ 0 ] >> 3 ) & 0x1F;
  1148. break;
  1149. case 1:
  1150. c = ( ret[ 0 ] << 2 ) & 0x1F;
  1151. c |= ( ret[ 1 ] >> 6 ) & 0x03;
  1152. break;
  1153. case 2:
  1154. c = ( ret[ 1 ] >> 1 ) & 0x1F;
  1155. break;
  1156. case 3:
  1157. c = ( ret[ 1 ] << 4 ) & 0x1F;
  1158. c |= ( ret[ 2 ] >> 5 ) & 0x07;
  1159. break;
  1160. case 4:
  1161. c = ret[ 2 ] & 0x1F;
  1162. break;
  1163. case 5:
  1164. c = ( ret[ 3 ] >> 3 ) & 0x1F;
  1165. break;
  1166. case 6:
  1167. c = ( ret[ 3 ] << 2 ) & 0x1F;
  1168. c |= ( ret[ 4 ] >> 6 ) & 0x03;
  1169. break;
  1170. case 7:
  1171. c = ( ret[ 4 ] >> 1 ) & 0x1F;
  1172. break;
  1173. case 8:
  1174. c = ( ret[ 4 ] << 4 ) & 0x1F;
  1175. c |= ( ret[ 5 ] >> 5 ) & 0x07;
  1176. break;
  1177. case 9:
  1178. c = ret[ 5 ];
  1179. break;
  1180. case 10:
  1181. c = ( ret[ 6 ] >> 3 ) & 0x1F;
  1182. break;
  1183. case 11:
  1184. c = ( ret[ 6 ] << 2 ) & 0x1F;
  1185. c |= ( ret[ 7 ] >> 6 ) & 0x03;
  1186. break;
  1187. case 12:
  1188. c = ret[ 7 ] |= c << 1 & 0x1F;
  1189. break;
  1190. case 13:
  1191. c = ret[ 7 ] |= c >> 4 & 0x1F;
  1192. c |= ret[ 8 ] = c << 5 & 0x07;
  1193. break;
  1194. case 14:
  1195. c = ret[ 8 ] & 0x1F;
  1196. break;
  1197. }
  1198. if( c == 27 )
  1199. c = 'ü';
  1200. else if( c == 28 )
  1201. c = 'ö';
  1202. else if( c == 29 )
  1203. c = 'ä';
  1204. else if( c == 30 )
  1205. c = 'ß';
  1206. else if( c == 31 )
  1207. c = '.';
  1208. else
  1209. c += 96;
  1210. }
  1211. ret[ ll ] = '\0';
  1212. return ret;
  1213. }
  1214. int Framework::textLänge( const char *txt ) // gibt die Länge von txt zurück
  1215. {
  1216. int ret = 0;
  1217. for( ; txt[ ret ] != 0; ret++ );
  1218. return ret;
  1219. }