Mercurial > hg
diff mcabber/src/utils.c @ 24:e88b15cbf2de
[/trunk] Changeset 40 by mikael
* Change structure -> src directory for mcabber source code...
author | mikael |
---|---|
date | Sun, 27 Mar 2005 20:16:02 +0000 |
parents | |
children | a8f8492abd44 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcabber/src/utils.c Sun Mar 27 20:16:02 2005 +0000 @@ -0,0 +1,207 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ncurses.h> +#include <stdarg.h> +#include <time.h> + +/* Variables globales a UTILS.C */ +int DebugEnabled = 0; + +void ut_InitDebug(int level) +{ + FILE *fp = fopen("/tmp/mcabberlog", "w"); + + DebugEnabled = level; + fprintf(fp, "Debugging mode started...\n" + "-----------------------------------\n"); + fclose(fp); +} + +void ut_WriteLog(const char *fmt, ...) +{ + FILE *fp = NULL; + time_t ahora; + va_list ap; + char *buffer = NULL; + + if (DebugEnabled) { + fp = fopen("/tmp/mcabberlog", "a+"); + buffer = (char *) calloc(1, 64); + + ahora = time(NULL); + strftime(buffer, 64, "[%H:%M:%S] ", localtime(&ahora)); + fprintf(fp, "%s", buffer); + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + + free(buffer); + fclose(fp); + } +} + +char **ut_SplitMessage(char *message, int *nsubmsgs, unsigned int maxlong) +{ + /* BUGs: recorta la palabra si la longitud maxlong es menor que la palabra + // maxlong = 4 + // message = "peaso bug!" + // submsgs[0] = "peas" + // submsgs[1] = "bug!" + // por lo demas, rula de arte. De todos modos, podrias verificarla ??? + */ + char *running; + char *aux; + char *aux2; + char **submsgs; + char *buffer = (char *) malloc(strlen(message) * 2); + int maxnlines = 50; + int i = 0; + + submsgs = (char **) malloc(maxnlines * sizeof(char *)); + + running = strdup(message); + aux2 = strdup(message); + + aux = index(running, '\n'); /* is there a CR? */ + + while ((strlen(aux2) > maxlong) || (aux)) { + memset(buffer, 0, strlen(message) * 2); + running[maxlong] = '\0'; /* cut at $maxlong chars */ + + if (aux != NULL) { /* there is a CR */ + strncpy(buffer, running, strlen(running) - strlen(aux)); + } else { + aux = rindex(running, ' '); /* look for last blank */ + if (aux != NULL) /* hay blanco! */ + strncpy(buffer, running, strlen(running) - strlen(aux)); + else + strcpy(buffer, running); /* se supone que esto es pa evitar el bug explicado arriba, pero no rula */ + } + + submsgs[i] = (char *) malloc(strlen(buffer) + 1); /*reservamos memoria */ + strcpy(submsgs[i], buffer); /*copiamos el buffer de arriba */ + i++; /*aumentamos numero de mensajillos */ + aux2 += strlen(buffer) + 1; /*eliminamos texto particionado */ + sprintf(running, "%s", aux2); /*y lo copiamos de nuevo a la string de "curro" */ + + // Check if we have allocated enough space + if (i >= maxnlines) { + maxnlines += 50; + submsgs = (char **) realloc(submsgs, maxnlines * sizeof(char *)); + } + aux = index(running, '\n'); /* is there is a CR now? */ + } + /* last part of the message */ + if (strlen(aux2) > 0) { + submsgs[i] = (char *) malloc(strlen(aux2) + 1); + strcpy(submsgs[i], aux2); + i++; + } + (*nsubmsgs) = i; + free(buffer); + return submsgs; +} + +/* Desc: get the rightmost substring + * + * In : string, match + * Out : ptr to substring (or NULL if not found) + * + * Note: this one has no namespace, cos it belongs to <string.h> + */ +char *ut_strrstr(const char *s1, const char *s2) +{ + int l = strlen(s2); + + if (l) { + const char *s = strchr(s1, '\0') - l; + while (s >= s1) { + if (*s == *s2) { + int _l = l - 1; + const char *_s = s + 1, *_s2 = s2 + 1; + while (_l) { + if (*_s++ != *_s2++) { + break; + } + _l--; + } + if (!_l) { + return (char *) s; + } + } + s--; + } + } + + return NULL; +} + +char *gettag(char *buffer, char *what) +{ + char *aux; + char *aux2; + char *result = (char *) malloc(1024); + char *tmp = (char *) malloc(1024); + memset(result, 0, 1024); + memset(tmp, 0, 1024); + + sprintf(tmp, "<%s>", what); + aux = strstr(buffer, tmp); + if (aux) { + aux += strlen(tmp); + sprintf(tmp, "</%s>", what); + aux2 = strstr(aux, tmp); + if (aux2) { + strncpy(result, aux, strlen(aux) - strlen(aux2)); + free(tmp); + return result; + } + } + free(tmp); + free(result); + return "UNKtag"; +} + + +char *getattr(char *buffer, char *what) +{ + char *aux; + char *aux2; + char *result = (char *) malloc(1024); + memset(result, 0, 1024); + + aux = strstr(buffer, what); + if (aux) { + aux += strlen(what); + aux2 = strstr(aux, "'"); + if (aux2) { + strncpy(result, aux, strlen(aux) - strlen(aux2)); + return result; + } + } + free(result); + return "UNKattr"; +} + +void ut_CenterMessage(char *text, int width, char *output) +{ + char *blank; + int ntest, nn; + + memset(output, 0, strlen(output)); + + ntest = (width - strlen(text)) / 2; + blank = (char *) malloc(ntest + 1); + + for (nn = 0; nn < ntest; nn++) + blank[nn] = ' '; + blank[ntest] = '\0'; + + strcpy(output, blank); + strcat(output, text); + strcat(output, blank); + + free(blank); +}