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