Mercurial > pidgin
view buddytrans.c @ 842:2804dc8e9ba0
[gaim-migrate @ 852]
HTML widget is faster, more stable :)
oh my cs teacher would be so proud. here's a description of the old algorithm and my new improved one:
old algorithm: print as much text as we can. then try printing the rest of it.
with at 4000 character message, this usually leads to a stack about 200 functions deep. depending on the amound of memory you have, this may have lead to a segfault.
new algorithm: if we can print it all, print it all. if we can't { if we've already printed stuff on this line then finish printing the line. print the first half of the stuff, then the second half. }
this usually leads to a stack no deeper than about 20 functions. it also causes the widget to be much faster.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 05 Sep 2000 21:30:43 +0000 |
parents | 05077cb276d4 |
children |
line wrap: on
line source
#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void do_trans(int, int); int main(int argc, char **argv) { char *srcn; char *destn; int src; int dest; char *resp; printf("Gaim - Buddy List Translator\n"); printf("----------------------------\n"); if (argc != 3) { printf("Syntax: %s buddy.lst gaimlist\n", argv[0]); exit(0); } srcn = argv[1]; destn = argv[2]; if ((src = open(srcn, O_RDONLY)) != -1) { printf("Source=%s, Dest=%s\n", srcn, destn); if ((dest = open(destn, O_WRONLY | O_CREAT | O_EXCL)) == -1) { printf("%s exists! Should I continue? ", destn); scanf("%s", resp); if (strchr(resp, 'y') || strchr(resp, 'Y')) { dest = open(destn, O_WRONLY | O_CREAT | O_TRUNC); do_trans(src, dest); } else exit(0); } else do_trans(src, dest); printf("Conversion Complete.\n"); } else { printf("Source file must exist!\n\nSyntax: %s buddy.lst gaimlist\n", argv[0]); exit(0); } return 0; } void do_trans(int source, int destin) { FILE *src; FILE *dest; char line[1024]; umask(644); src = fdopen(source, "r"); dest = fdopen(destin, "w"); fprintf(dest, "toc_set_config {m 1\n"); while (fgets(line, sizeof line, src)) { line[strlen(line) - 1] = 0; if (strpbrk(line, "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ")) { char *field, *name; if (line[0] == ' ' || line[0] == '\t' || line[0] == '\n' || line[0] == '\r' || line[0] == '\f') field = strdup(line + 1); else field = strdup(line); name = strpbrk(field, " \t\n\r\f"); name[0] = 0; name += 2; name[strlen(name) - 1] = 0; printf("%s, %s\n", field, name); if (!strcmp("group", field)) { fprintf(dest, "g %s\n", name); } else if (!strcmp("buddy", field)) { fprintf(dest, "b %s\n", name); } free(field); } } fprintf(dest, "}"); fclose(src); fclose(dest); }