slang.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. /*
  2. * Copyright (C) 2000,2001 Florian Sander
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. static char *dynslang = NULL;
  19. static char *filtbracketsstr = NULL;
  20. static char *slglobchan = NULL;
  21. static char *slgloblang = NULL;
  22. static char *slglobtype = NULL;
  23. static char *slglobnick = NULL;
  24. static int slglobpeak, slglobtotalusers, slglobint;
  25. static time_t slglobgstarted;
  26. static locstats *slgloblocstats;
  27. static int slang_expmem()
  28. {
  29. int size = 0;
  30. struct slang_lang *l;
  31. struct slang_ids *i;
  32. struct slang_types *ty;
  33. struct slang_texts *t;
  34. struct slang_chan *ch;
  35. struct slang_bntypes *bt;
  36. struct slang_bnplaces *bp;
  37. Context;
  38. for (l = slangs; l; l = l->next) {
  39. size += sizeof(struct slang_lang);
  40. if (l->lang)
  41. size += strlen(l->lang) + 1;
  42. for (i = l->ids; i; i = i->next) {
  43. size += sizeof(struct slang_ids);
  44. for (t = i->texts; t; t = t->next) {
  45. size += sizeof(struct slang_texts);
  46. size += strlen(t->text) + 1;
  47. }
  48. }
  49. for (ty = l->types; ty; ty = ty->next) {
  50. size += sizeof(struct slang_types);
  51. size += strlen(ty->type) + 1;
  52. for (t = ty->texts; t; t = t->next) {
  53. size += sizeof(struct slang_texts);
  54. size += strlen(t->text) + 1;
  55. }
  56. }
  57. Context;
  58. for (bt = l->bignumbers; bt; bt = bt->next) {
  59. size += sizeof(struct slang_bntypes);
  60. size += strlen(bt->type) + 1;
  61. for (bp = bt->places; bp; bp = bp->next) {
  62. size += sizeof(struct slang_bnplaces);
  63. for (t = bp->texts; t; t = t->next) {
  64. size += sizeof(struct slang_texts);
  65. size += strlen(t->text) + 1;
  66. }
  67. }
  68. }
  69. }
  70. Context;
  71. for (ch = slangchans; ch; ch = ch->next) {
  72. size += sizeof(struct slang_chan);
  73. size += strlen(ch->chan) + 1;
  74. if (ch->lang)
  75. size += strlen(ch->lang) + 1;
  76. }
  77. if (dynslang)
  78. size += strlen(dynslang) + 1;
  79. if (slglobchan)
  80. size += strlen(slglobchan) + 1;
  81. if (slgloblang)
  82. size += strlen(slgloblang) + 1;
  83. if (slglobnick)
  84. size += strlen(slglobnick) + 1;
  85. if (filtbracketsstr)
  86. size += strlen(filtbracketsstr) + 1;
  87. return size;
  88. }
  89. static void free_slang()
  90. {
  91. struct slang_lang *l, *ll;
  92. struct slang_ids *i, *ii;
  93. struct slang_texts *t, *tt;
  94. struct slang_types *ty, *tty;
  95. struct slang_chan *ch, *cch;
  96. struct slang_bntypes *bt, *btt;
  97. struct slang_bnplaces *bp, *bpp;
  98. Context;
  99. l = slangs;
  100. while (l) {
  101. l->durs[0] = l->durs[1] = l->durs[2] = l->durs[3] = l->durs[4] = NULL;
  102. l->durs[5] = l->durs[6] = l->durs[7] = l->durs[8] = l->durs[9] = NULL;
  103. i = l->ids;
  104. while (i) {
  105. t = i->texts;
  106. while (t) {
  107. tt = t->next;
  108. nfree(t->text);
  109. nfree(t);
  110. t = tt;
  111. }
  112. ii = i->next;
  113. nfree(i);
  114. i = ii;
  115. }
  116. ty = l->types;
  117. while (ty) {
  118. t = ty->texts;
  119. while (t) {
  120. tt = t->next;
  121. nfree(t->text);
  122. nfree(t);
  123. t = tt;
  124. }
  125. tty = ty->next;
  126. nfree(ty->type);
  127. nfree(ty);
  128. ty = tty;
  129. }
  130. Context;
  131. bt = l->bignumbers;
  132. while (bt) {
  133. bp = bt->places;
  134. while (bp) {
  135. t = bp->texts;
  136. while (t) {
  137. tt = t->next;
  138. nfree(t->text);
  139. nfree(t);
  140. t = tt;
  141. }
  142. bpp = bp->next;
  143. nfree(bp);
  144. bp = bpp;
  145. }
  146. btt = bt->next;
  147. nfree(bt->type);
  148. nfree(bt);
  149. bt = btt;
  150. }
  151. Context;
  152. ll = l->next;
  153. if (l->lang)
  154. nfree(l->lang);
  155. nfree(l);
  156. l = ll;
  157. }
  158. Context;
  159. ch = slangchans;
  160. while (ch) {
  161. cch = ch->next;
  162. nfree(ch->chan);
  163. if (ch->lang)
  164. nfree(ch->lang);
  165. nfree(ch);
  166. ch = cch;
  167. }
  168. if (slglobchan)
  169. nfree(slglobchan);
  170. if (slgloblang)
  171. nfree(slgloblang);
  172. if (dynslang)
  173. nfree(dynslang);
  174. if (slglobnick)
  175. nfree(slglobnick);
  176. if (filtbracketsstr)
  177. nfree(filtbracketsstr);
  178. slglobchan = slgloblang = dynslang = slglobnick = filtbracketsstr = NULL;
  179. Context;
  180. }
  181. static int loadslang(char *lang, char *file)
  182. {
  183. FILE *f;
  184. char *s, buf[MAXSLANGLENGTH], *id;
  185. struct slang_lang *l, *nl;
  186. Context;
  187. if (lang)
  188. putlog(LOG_MISC, "*", "Loading slangfile for %s: %s", lang, file);
  189. else
  190. putlog(LOG_MISC, "*", "Loading default slangfile: %s", file);
  191. f = fopen(file, "r");
  192. if (f == NULL) {
  193. putlog(LOG_MISC, "*", "ERROR reading slangfile");
  194. return 0;
  195. }
  196. l = slangs;
  197. while (l) {
  198. if (!lang && !l->lang)
  199. break;
  200. if (lang && l->lang)
  201. if (!strcasecmp(lang, l->lang))
  202. break;
  203. l = l->next;
  204. }
  205. if (!l) {
  206. l = slangs;
  207. while (l && l->next)
  208. l = l->next;
  209. nl = nmalloc(sizeof(struct slang_lang));
  210. if (!lang) {
  211. nl->lang = NULL;
  212. } else {
  213. nl->lang = nmalloc(strlen(lang) + 1);
  214. strcpy(nl->lang, lang);
  215. }
  216. nl->next = NULL;
  217. nl->ids = NULL;
  218. nl->types = NULL;
  219. nl->bignumbers = NULL;
  220. nl->durs[0] = nl->durs[1] = nl->durs[2] = nl->durs[3] = nl->durs[4] = NULL;
  221. nl->durs[5] = nl->durs[6] = nl->durs[7] = nl->durs[8] = nl->durs[9] = NULL;
  222. if (l)
  223. l->next = nl;
  224. else
  225. slangs = nl;
  226. l = nl;
  227. }
  228. while (!feof(f)) {
  229. buf[0] = 0;
  230. s = buf;
  231. fgets(s, MAXSLANGLENGTH - 1, f);
  232. s[MAXSLANGLENGTH - 1] = 0;
  233. if (!s[0])
  234. continue;
  235. if ((s[strlen(s) - 1] == '\n') || (s[strlen(s) - 1] == '\r'))
  236. s[strlen(s) - 1] = 0;
  237. if ((s[strlen(s) - 1] == '\n') || (s[strlen(s) - 1] == '\r'))
  238. s[strlen(s) - 1] = 0;
  239. id = newsplit(&s);
  240. if (!strcasecmp(id, "T"))
  241. addslangtype(l, s);
  242. else if (!strcasecmp(id, "BN"))
  243. addslangbn(l, s);
  244. else
  245. addslangitem(l, atoi(id), s);
  246. }
  247. fclose(f);
  248. Context;
  249. return 1;
  250. }
  251. static void addslangitem(struct slang_lang *lang, int idnr, char *text)
  252. {
  253. struct slang_ids *id, *nid;
  254. struct slang_texts *t, *nt;
  255. Context;
  256. if (idnr == 0)
  257. return;
  258. for (id = lang->ids; id; id = id->next)
  259. if (id->id == idnr)
  260. break;
  261. if (!id) {
  262. id = lang->ids;
  263. while (id && id->next)
  264. id = id->next;
  265. nid = nmalloc(sizeof(struct slang_ids));
  266. nid->id = idnr;
  267. nid->entries = 0;
  268. nid->texts = NULL;
  269. nid->next = NULL;
  270. if (id)
  271. id->next = nid;
  272. else
  273. lang->ids = nid;
  274. id = nid;
  275. }
  276. t = id->texts;
  277. while (t && t->next)
  278. t = t->next;
  279. nt = nmalloc(sizeof(struct slang_texts));
  280. nt->text = nmalloc(strlen(text) + 1);
  281. strcpy(nt->text, text);
  282. nt->dynamic = isdynamicslang(text);
  283. nt->next = NULL;
  284. if (t)
  285. t->next = nt;
  286. else
  287. id->texts = nt;
  288. id->entries++;
  289. if ((idnr >= 250) && (idnr < 260))
  290. lang->durs[idnr - 250] = nt->text;
  291. }
  292. static void addslangtype(struct slang_lang *lang, char *text)
  293. {
  294. char *type;
  295. struct slang_types *ty, *nty;
  296. struct slang_texts *t, *nt;
  297. Context;
  298. type = newsplit(&text);
  299. strlower(type);
  300. if (!text[0])
  301. return;
  302. for (ty = lang->types; ty; ty = ty->next)
  303. if (!strcmp(ty->type, type))
  304. break;
  305. if (!ty) {
  306. for (ty = lang->types; ty && ty->next; ty = ty->next);
  307. nty = nmalloc(sizeof(struct slang_types));
  308. nty->type = nmalloc(strlen(type) + 1);
  309. strcpy(nty->type, type);
  310. nty->entries = 0;
  311. nty->next = NULL;
  312. nty->texts = NULL;
  313. if (ty)
  314. ty->next = nty;
  315. else
  316. lang->types = nty;
  317. ty = nty;
  318. }
  319. for (t = ty->texts; t && t->next; t = t->next);
  320. nt = nmalloc(sizeof(struct slang_texts));
  321. nt->text = nmalloc(strlen(text) + 1);
  322. strcpy(nt->text, text);
  323. nt->dynamic = isdynamicslang(text);
  324. nt->next = NULL;
  325. if (t)
  326. t->next = nt;
  327. else
  328. ty->texts = nt;
  329. ty->entries++;
  330. }
  331. static void addslangbn(struct slang_lang *lang, char *text)
  332. {
  333. char *type, *splace;
  334. struct slang_bntypes *ty, *nty;
  335. struct slang_bnplaces *p, *np;
  336. struct slang_texts *t, *nt;
  337. int place;
  338. Context;
  339. type = newsplit(&text);
  340. strlower(type);
  341. splace = newsplit(&text);
  342. place = atoi(splace);
  343. if (!place) {
  344. debug2("place for %s is %d", type, place);
  345. return;
  346. }
  347. if (!text[0])
  348. return;
  349. for (ty = lang->bignumbers; ty; ty = ty->next)
  350. if (!strcmp(ty->type, type))
  351. break;
  352. if (!ty) {
  353. for (ty = lang->bignumbers; ty && ty->next; ty = ty->next);
  354. nty = nmalloc(sizeof(struct slang_bntypes));
  355. nty->type = nmalloc(strlen(type) + 1);
  356. strcpy(nty->type, type);
  357. nty->next = NULL;
  358. nty->places = NULL;
  359. if (ty)
  360. ty->next = nty;
  361. else
  362. lang->bignumbers = nty;
  363. ty = nty;
  364. }
  365. for (p = ty->places; p; p = p->next)
  366. if (p->place == place)
  367. return;
  368. if (!p) {
  369. for (p = ty->places; p && p->next; p = p->next);
  370. np = nmalloc(sizeof(struct slang_bnplaces));
  371. np->next = NULL;
  372. np->place = place;
  373. np->entries = 0;
  374. np->texts = NULL;
  375. if (p)
  376. p->next = np;
  377. else
  378. ty->places = np;
  379. p = np;
  380. }
  381. for (t = p->texts; t && t->next; t = t->next);
  382. nt = nmalloc(sizeof(struct slang_texts));
  383. nt->text = nmalloc(strlen(text) + 1);
  384. strcpy(nt->text, text);
  385. nt->dynamic = isdynamicslang(text);
  386. nt->next = NULL;
  387. if (t)
  388. t->next = nt;
  389. else
  390. p->texts = nt;
  391. p->entries++;
  392. Context;
  393. }
  394. char badslang[15];
  395. static char *getslang(int idnr)
  396. {
  397. struct slang_lang *l;
  398. struct slang_ids *id;
  399. struct slang_texts *t;
  400. char *lang;
  401. unsigned long x;
  402. Context;
  403. lang = slgloblang;
  404. for (l = slangs; l; l = l->next) {
  405. if ((!l->lang && !lang) || (l->lang && lang && !strcasecmp(l->lang, lang))) {
  406. for (id = l->ids; id; id = id->next) {
  407. if (id->id == idnr) {
  408. x = random() % id->entries;
  409. t = id->texts;
  410. while (t) {
  411. if (!x) {
  412. if (t->dynamic)
  413. return dynamicslang(t->text);
  414. else
  415. return t->text;
  416. }
  417. x--;
  418. t = t->next;
  419. }
  420. }
  421. }
  422. }
  423. }
  424. sprintf(badslang, "SLANG%d", idnr);
  425. return badslang;
  426. }
  427. char baddurs[15];
  428. static char *getdur(int id)
  429. {
  430. struct slang_lang *l;
  431. char *lang;
  432. lang = slgloblang;
  433. for (l = slangs; l; l = l->next) {
  434. if ((!l->lang && !lang) || (l->lang && lang && !strcasecmp(l->lang, lang))) {
  435. if (!l->durs[id]) {
  436. sprintf(baddurs, "DURNS%d", id);
  437. return baddurs;
  438. } else {
  439. return l->durs[id];
  440. }
  441. }
  442. }
  443. sprintf(baddurs, "DURNF%d", id);
  444. return baddurs;
  445. }
  446. static char *getslangtype(char *type)
  447. {
  448. struct slang_lang *l;
  449. struct slang_types *ty;
  450. struct slang_texts *t;
  451. unsigned long x;
  452. char *lang;
  453. Context;
  454. lang = slgloblang;
  455. // I originally used strlower here, but it seems that it causes
  456. // minor problems (like crashes ^_^), so I had to remove it and use
  457. // strcasecmp() instead. I hope it doesn't cost too much cpu time.
  458. // strlower(type);
  459. for (l = slangs; l; l = l->next) {
  460. if ((!l->lang && !lang) || (l->lang && lang && !strcasecmp(l->lang, lang))) {
  461. for (ty = l->types; ty; ty = ty->next) {
  462. if (!strcmp(ty->type, type)) {
  463. x = random() % ty->entries;
  464. t = ty->texts;
  465. while (t) {
  466. if (!x)
  467. return t->text;
  468. x--;
  469. t = t->next;
  470. }
  471. }
  472. }
  473. }
  474. }
  475. return type;
  476. }
  477. /* slangtypetoi():
  478. * find the index of a "slanged" stat-type
  479. * if it isn't slanged, typetoi() is automatically called
  480. */
  481. static int slangtypetoi(char *type)
  482. {
  483. struct slang_lang *l;
  484. struct slang_types *ty;
  485. struct slang_texts *t;
  486. char *lang;
  487. Context;
  488. lang = slgloblang;
  489. for (l = slangs; l; l = l->next) {
  490. if ((!l->lang && !lang) || (l->lang && lang && !strcasecmp(l->lang, lang))) {
  491. for (ty = l->types; ty; ty = ty->next) {
  492. for (t = ty->texts; t; t = t->next) {
  493. if (!strcasecmp(t->text, type)) {
  494. return typetoi(ty->type);
  495. }
  496. }
  497. }
  498. }
  499. }
  500. return typetoi(type);
  501. }
  502. static int isdynamicslang(char *text)
  503. {
  504. Context;
  505. if (strstr(text, "[bot]"))
  506. return 1;
  507. else if (strstr(text, "[topnr]"))
  508. return 1;
  509. else if (strstr(text, "[graphnr]"))
  510. return 1;
  511. else if (strstr(text, "[int]"))
  512. return 1;
  513. else if (strstr(text, "[chan]"))
  514. return 1;
  515. else if (strstr(text, "[user]"))
  516. return 1;
  517. else if (strstr(text, "[value]"))
  518. return 1;
  519. else if (strstr(text, "[peak]"))
  520. return 1;
  521. else if (strstr(text, "[totalusers]"))
  522. return 1;
  523. else if (strstr(text, "[chanstarted]"))
  524. return 1;
  525. else if (strstr(text, "[nick]"))
  526. return 1;
  527. else if (strstr(text, "[source "))
  528. return 1;
  529. return 0;
  530. }
  531. static char *dynamicslang(char *text)
  532. {
  533. char *p, *tmp, *s, nr[61], *ende, *fbuf;
  534. time_t tt, ttbuf;
  535. int len, itype;
  536. int changed;
  537. FILE *f;
  538. if (dynslang)
  539. nfree(dynslang);
  540. tmp = nmalloc(strlen(text) + 1);
  541. strcpy(tmp, text);
  542. changed = 1;
  543. while (changed) {
  544. changed = 0;
  545. if ((p = strstr(tmp, "[bot]"))) {
  546. len = strlen(tmp) + strlen(botnetnick);
  547. p[0] = 0;
  548. p += 5;
  549. s = nmalloc(len + 1 - 5);
  550. sprintf(s, "%s%s%s", tmp, filtbrackets(botnetnick), p);
  551. nfree(tmp);
  552. tmp = s;
  553. changed = 1;
  554. }
  555. if ((p = strstr(tmp, "[topnr]"))) {
  556. sprintf(nr, "%d", webnr);
  557. len = strlen(tmp) + strlen(nr);
  558. p[0] = 0;
  559. p += 7;
  560. s = nmalloc(len + 1 - 7);
  561. sprintf(s, "%s%s%s", tmp, nr, p);
  562. nfree(tmp);
  563. tmp = s;
  564. changed = 1;
  565. }
  566. if ((p = strstr(tmp, "[graphnr]"))) {
  567. sprintf(nr, "%d", graphnr);
  568. len = strlen(tmp) + strlen(nr);
  569. p[0] = 0;
  570. p += 9;
  571. s = nmalloc(len + 1 - 9);
  572. sprintf(s, "%s%s%s", tmp, nr, p);
  573. nfree(tmp);
  574. tmp = s;
  575. changed = 1;
  576. }
  577. if ((p = strstr(tmp, "[peak]"))) {
  578. sprintf(nr, "%d", slglobpeak);
  579. len = strlen(tmp) + strlen(nr);
  580. p[0] = 0;
  581. p += 6;
  582. s = nmalloc(len + 1 - 6);
  583. sprintf(s, "%s%s%s", tmp, nr, p);
  584. nfree(tmp);
  585. tmp = s;
  586. changed = 1;
  587. }
  588. if ((p = strstr(tmp, "[totalusers]"))) {
  589. sprintf(nr, "%d", slglobtotalusers);
  590. len = strlen(tmp) + strlen(nr);
  591. p[0] = 0;
  592. p += 12;
  593. s = nmalloc(len + 1 - 12);
  594. sprintf(s, "%s%s%s", tmp, nr, p);
  595. nfree(tmp);
  596. tmp = s;
  597. changed = 1;
  598. }
  599. if ((p = strstr(tmp, "[int]"))) {
  600. sprintf(nr, "%d", slglobint);
  601. len = strlen(tmp) + strlen(nr);
  602. p[0] = 0;
  603. p += 5;
  604. s = nmalloc(len + 1 - 5);
  605. sprintf(s, "%s%s%s", tmp, nr, p);
  606. nfree(tmp);
  607. tmp = s;
  608. changed = 1;
  609. }
  610. if ((p = strstr(tmp, "[chanstarted]"))) {
  611. ttbuf = now;
  612. tt = slglobgstarted;
  613. strftime(nr, 60, "%d.%m. %Y %H:%M", localtime(&tt));
  614. ctime(&ttbuf); /* workaround for eggdrop bug */
  615. len = strlen(tmp) + strlen(nr);
  616. p[0] = 0;
  617. p += 13;
  618. s = nmalloc(len + 1 - 13);
  619. sprintf(s, "%s%s%s", tmp, nr, p);
  620. nfree(tmp);
  621. tmp = s;
  622. changed = 1;
  623. }
  624. if ((p = strstr(tmp, "[value]"))) {
  625. itype = typetoi(slglobtype);
  626. if (itype >= 0)
  627. sprintf(nr, "%ld", slgloblocstats->values[S_DAILY][itype]);
  628. else if (itype == T_WPL)
  629. sprintf(nr, "%.2f", (float) slgloblocstats->values[S_TODAY][T_WORDS] / (float) slgloblocstats->values[S_TODAY][T_LINES]);
  630. else if (itype == T_IDLE)
  631. sprintf(nr, "%.2f", (float) slgloblocstats->values[S_TODAY][T_MINUTES] / (float) slgloblocstats->values[S_TODAY][T_LINES]);
  632. else if (itype == T_VOCABLES)
  633. sprintf(nr, "%d", slgloblocstats->vocables);
  634. else
  635. sprintf(nr, "UNKNOWN iTYPE: %d", itype);
  636. len = strlen(tmp) + strlen(nr);
  637. p[0] = 0;
  638. p += 7;
  639. s = nmalloc(len + 1 - 7);
  640. sprintf(s, "%s%s%s", tmp, nr, p);
  641. nfree(tmp);
  642. tmp = s;
  643. changed = 1;
  644. }
  645. if (slglobchan && (p = strstr(tmp, "[chan]"))) {
  646. len = strlen(tmp) + strlen(slglobchan);
  647. p[0] = 0;
  648. p += 6;
  649. s = nmalloc(len + 1 - 6);
  650. sprintf(s, "%s%s%s", tmp, filtbrackets(slglobchan), p);
  651. nfree(tmp);
  652. tmp = s;
  653. changed = 1;
  654. }
  655. if (slgloblocstats && (p = strstr(tmp, "[user]"))) {
  656. len = strlen(tmp) + strlen(slgloblocstats->user);
  657. p[0] = 0;
  658. p += 6;
  659. s = nmalloc(len + 1 - 6);
  660. sprintf(s, "%s%s%s", tmp, filtbrackets(slgloblocstats->user), p);
  661. nfree(tmp);
  662. tmp = s;
  663. changed = 1;
  664. }
  665. if (slglobnick && (p = strstr(tmp, "[nick]"))) {
  666. len = strlen(tmp) + strlen(slglobnick);
  667. p[0] = 0;
  668. p += 6;
  669. s = nmalloc(len + 1 - 6);
  670. sprintf(s, "%s%s%s", tmp, filtbrackets(slglobnick), p);
  671. nfree(tmp);
  672. tmp = s;
  673. changed = 1;
  674. }
  675. if ((p = strstr(tmp, "[source "))) {
  676. len = strlen(tmp);
  677. p[0] = 0;
  678. p += 8;
  679. ende = strchr(p, ']');
  680. ende[0] = 0;
  681. fbuf = NULL;
  682. f = fopen(p, "r");
  683. if (f == NULL) {
  684. fbuf = nmalloc(16 + strlen(p) + 1);
  685. sprintf(fbuf, "File not found: %s", p);
  686. } else {
  687. s = nmalloc(512);
  688. while (!feof(f)) {
  689. s[0] = 0;
  690. fgets(s, 512 - 1, f);
  691. if (!s[0])
  692. continue;
  693. if (fbuf) {
  694. fbuf = nrealloc(fbuf, strlen(fbuf) + strlen(s) + 1);
  695. strcat(fbuf, s);
  696. } else {
  697. fbuf = nmalloc(strlen(s) + 1);
  698. strcpy(fbuf, s);
  699. }
  700. }
  701. fclose(f);
  702. nfree(s);
  703. }
  704. p = ende + 1;
  705. len += strlen(fbuf);
  706. s = nmalloc(len + 1 - 8);
  707. sprintf(s, "%s%s%s", tmp, filtbrackets(fbuf), p);
  708. nfree(tmp);
  709. nfree(fbuf);
  710. tmp = s;
  711. changed = 1;
  712. }
  713. }
  714. dynslang = tmp;
  715. return dynslang;
  716. }
  717. static char *filtbrackets(char *text)
  718. {
  719. char *p;
  720. if (filtbracketsstr) {
  721. nfree(filtbracketsstr);
  722. filtbracketsstr = NULL;
  723. }
  724. if (strchr(text, '[') || strchr(text, ']')) {
  725. filtbracketsstr = nmalloc(strlen(text) + 1);
  726. strcpy(filtbracketsstr, text);
  727. for (p = filtbracketsstr; p[0]; p++) {
  728. if (p[0] == '[')
  729. p[0] = '{';
  730. else if (p[0] == ']')
  731. p[0] = '}';
  732. }
  733. return filtbracketsstr;
  734. } else {
  735. return text;
  736. }
  737. }
  738. static char *chanlang(char *channel)
  739. {
  740. struct slang_chan *chan;
  741. Context;
  742. for (chan = slangchans; chan; chan = chan->next)
  743. if (!rfc_casecmp(chan->chan, channel))
  744. return chan->lang;
  745. return NULL;
  746. }
  747. static void setchanlang(char *channel, char *lang)
  748. {
  749. struct slang_chan *chan, *nchan;
  750. Context;
  751. if (!strcasecmp(lang, "default"))
  752. lang = NULL;
  753. for (chan = slangchans; chan; chan = chan->next)
  754. if (!rfc_casecmp(chan->chan, channel))
  755. break;
  756. if (!chan) {
  757. for (chan = slangchans; chan && chan->next; chan = chan->next);
  758. nchan = nmalloc(sizeof(struct slang_chan));
  759. nchan->chan = nmalloc(strlen(channel) + 1);
  760. strcpy(nchan->chan, channel);
  761. nchan->lang = NULL;
  762. nchan->next = NULL;
  763. if (chan)
  764. chan->next = nchan;
  765. else
  766. slangchans = nchan;
  767. chan = nchan;
  768. }
  769. if (chan->lang) {
  770. nfree(chan->lang);
  771. chan->lang = NULL;
  772. }
  773. if (lang) {
  774. chan->lang = nmalloc(strlen(lang) + 1);
  775. strcpy(chan->lang, lang);
  776. }
  777. }
  778. static void setslglobs(char *chan, int peak, int totalusers, time_t globstarted)
  779. {
  780. char *lang = NULL;
  781. Context;
  782. if (slglobchan)
  783. nfree(slglobchan);
  784. if (slgloblang)
  785. nfree(slgloblang);
  786. slgloblang = NULL;
  787. slglobchan = NULL;
  788. if (chan) {
  789. slglobchan = nmalloc(strlen(chan) + 1);
  790. strcpy(slglobchan, chan);
  791. lang = chanlang(chan);
  792. }
  793. if (lang) {
  794. slgloblang = nmalloc(strlen(lang) + 1);
  795. strcpy(slgloblang, lang);
  796. }
  797. slglobpeak = peak;
  798. slglobtotalusers = totalusers;
  799. slglobgstarted = globstarted;
  800. }
  801. static void setslnick(char *nick)
  802. {
  803. if (slglobnick)
  804. nfree(slglobnick);
  805. slglobnick = nmalloc(strlen(nick) + 1);
  806. strcpy(slglobnick, nick);
  807. }