Text.cpp 45 KB

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