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