Text.cpp 35 KB

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