diff src/util.c @ 1:2846a03bda67

[gaim-migrate @ 10] The other missing files :) committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Thu, 23 Mar 2000 03:13:54 +0000
parents
children 34db9f242899
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/util.c	Thu Mar 23 03:13:54 2000 +0000
@@ -0,0 +1,692 @@
+/*
+ * gaim
+ *
+ * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <gtk/gtk.h>
+#include <pixmaps/aimicon.xpm>
+#include "gaim.h"
+
+static GdkPixmap *icon_pm = NULL;
+static GdkBitmap *icon_bm = NULL;
+static int state;
+
+gint badchar(char c)
+{
+        if (c == ' ')
+                return 1;
+        if (c == ',')
+                return 1;
+        if (c == ')')
+                return 1;
+        if (c == '(')
+                return 1;
+        if (c == 0)
+                return 1;
+        if (c == '\n')
+                return 1;
+        return 0;
+
+
+}
+
+
+char *sec_to_text(int sec)
+{
+        int hrs, min;
+        char minutes[64];
+        char hours[64];
+        char sep[16];
+        char *ret = g_malloc(256);
+        
+        hrs = sec / 3600;
+        min = sec % 3600;
+
+        min = min / 60;
+        sec = min % 60;
+
+        if (min) {
+                if (min == 1)
+                        g_snprintf(minutes, sizeof(minutes), "%d minute.", min);
+                else
+                        g_snprintf(minutes, sizeof(minutes), "%d minutes.", min);
+                sprintf(sep, ", ");
+        } else {
+                if (!hrs)
+                        g_snprintf(minutes, sizeof(minutes), "%d minutes.", min);
+                else {
+                        minutes[0] = '.';
+                        minutes[1] = '\0';
+                }
+                sep[0] = '\0';
+        }
+
+        if (hrs) {
+                if (hrs == 1)
+                        g_snprintf(hours, sizeof(hours), "%d hour%s", hrs, sep);
+                else
+                        g_snprintf(hours, sizeof(hours), "%d hours%s", hrs, sep);
+        } else
+                hours[0] = '\0';
+
+        
+        g_snprintf(ret, 256, "%s%s", hours, minutes);
+
+        return ret;
+}
+
+gint linkify_text(char *text)
+{
+        char *c, *t;
+        char cpy[BUF_LONG];
+        char url_buf[512];
+        int cnt=0;
+        /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
+
+        strncpy(cpy, text, strlen(text));
+        cpy[strlen(text)] = 0;
+        c = cpy;
+        while(*c) {
+                if (!strncasecmp(c, "<A", 2)) {
+                        while(1) {
+                                if (!strncasecmp(c, "/A>", 3)) {
+                                        break;
+                                }
+                                text[cnt++] = *c;
+                                c++;
+                                if (!(*c))
+                                        break;
+                        }
+                } else if (!strncasecmp(c, "http://", 7)) {
+                        t = c;
+                        while(1) {
+                                if (badchar(*t)) {
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        strncpy(url_buf, c, t-c);
+                                        url_buf[t-c] = 0;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"%s\">%s</A>", url_buf, url_buf);
+                                        cnt--;
+                                        c = t;
+                                        break;
+                                }
+                                if (!t)
+                                        break;
+                                t++;
+
+                        }
+                } else if (!strncasecmp(c, "www.", 4)) {
+                        if (strncasecmp(c, "www..", 5)) {
+                        t = c;
+                        while(1) {
+                                if (badchar(*t)) {
+                                        if (t-c == 4) {
+                                                break;
+                                        }
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        strncpy(url_buf, c, t-c);
+                                        url_buf[t-c] = 0;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"http://%s\">%s</A>", url_buf, url_buf);
+                                        cnt--;
+                                        c = t;
+                                        break;
+                                }
+                                if (!t)
+                                        break;
+                                t++;
+                        }
+                 }
+                } else if (!strncasecmp(c, "ftp://", 6)) {
+                        t = c;
+                        while(1) {
+                                if (badchar(*t)) {
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        strncpy(url_buf, c, t-c);
+                                        url_buf[t-c] = 0;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"%s\">%s</A>", url_buf, url_buf);
+                                        cnt--;
+                                        c = t;
+                                        break;
+                                }
+                                if (!t)
+                                        break;
+                                t++;
+
+                        }
+                } else if (!strncasecmp(c, "ftp.", 4)) {
+                        t = c;
+                        while(1) {
+                                if (badchar(*t)) {
+                                        if (t-c == 4) {
+                                                break;
+                                        }
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        strncpy(url_buf, c, t-c);
+                                        url_buf[t-c] = 0;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"ftp://%s\">%s</A>", url_buf, url_buf);
+                                        cnt--; 
+                                        c = t;
+                                        break;
+                                }
+                                if (!t)
+                                        break;
+                                t++;
+                        }
+                } else if (!strncasecmp(c, "mailto:", 7)) {
+                        t = c;
+                        while(1) {
+                                if (badchar(*t)) {
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        strncpy(url_buf, c, t-c);
+                                        url_buf[t-c] = 0;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"%s\">%s</A>", url_buf, url_buf);
+                                        cnt--;
+                                        c = t;
+                                        break;
+                                }
+                                if (!t)
+                                        break;
+                                t++;
+
+                        }
+                } else if (!strncasecmp(c, "@", 1)) {
+                        char *tmp;
+                        int flag;
+                        int len=0;
+                        url_buf[0] = 0;
+
+                        if (*(c-1) == ' ' || *(c+1) == ' ')
+                                flag = 0;
+                        else
+                                flag = 1;
+
+                        t = c;
+                        while(flag) {
+                                if (badchar(*t)) {
+                                        cnt -= (len - 1);
+                                        break;
+                                } else {
+                                        len++;
+                                        tmp = g_malloc(len + 1);
+                                        tmp[len] = 0;
+                                        tmp[0] = *t;
+                                        strncpy(tmp + 1, url_buf, len - 1);
+                                        strcpy(url_buf, tmp);
+                                        url_buf[len] = 0;
+                                        g_free(tmp);
+                                        t--;
+                                        if (t < cpy) {
+                                                cnt = 0;
+                                                break;
+                                        }
+                                }
+                        }
+
+
+                        t = c + 1;
+
+                        while(flag) {
+                                if (badchar(*t)) {
+                                        if (*(t-1) == '.')
+                                                t--;
+                                        cnt += g_snprintf(&text[cnt++], 1024, "<A HREF=\"mailto:%s\">%s</A>", url_buf, url_buf);
+                                        text[cnt]=0;
+
+
+                                        cnt--;
+                                        c = t;
+
+                                        break;
+                                } else {
+                                        strncat(url_buf, t, 1);
+                                        len++;
+                                        url_buf[len] = 0;
+                                }
+
+                                t++;
+
+                        }
+
+
+                }
+
+                if (*c == 0)
+                        break;
+
+                text[cnt++] = *c;
+                c++;
+
+        }
+        text[cnt]=0;
+        return cnt; 
+}
+
+
+FILE *open_log_file (struct conversation *c)
+{
+        char *buf = g_malloc(BUF_LONG);
+        char *buf2 = g_malloc(BUF_LONG);
+        char log_all_file[256];
+        struct log_conversation *l;
+        struct stat st;
+        int flag = 0;
+        FILE *fd;
+        int res;
+
+        if (!(general_options & OPT_GEN_LOG_ALL)) {
+
+                l = find_log_info(c->name);
+                if (!l)
+                        return NULL;
+
+                if (stat(l->filename, &st) < 0)
+                        flag = 1;
+
+                fd = fopen(l->filename, "a");
+
+                if (flag) { /* is a new file */
+                        fprintf(fd, "<HTML><HEAD><TITLE>" );
+                        fprintf(fd, "IM Sessions with %s", c->name );
+                        fprintf(fd, "</TITLE></HEAD><BODY BGCOLOR=\"ffffff\">\n" );
+                }
+
+                return fd;
+        }
+
+        /*  Dont log yourself */
+        g_snprintf(log_all_file, 256, "%s/.gaim", getenv("HOME"));
+
+        stat(log_all_file, &st);
+        if (!S_ISDIR(st.st_mode))
+                unlink(log_all_file);
+
+        fd = fopen(log_all_file, "r");
+
+        if (!fd) {
+                res = mkdir(log_all_file, S_IRUSR | S_IWUSR | S_IXUSR);
+                if (res < 0) {
+                        g_snprintf(buf, BUF_LONG, "Unable to make directory %s for logging", log_all_file);
+                        do_error_dialog(buf, "Error!");
+                        g_free(buf);
+                        g_free(buf2);
+                        return NULL;
+                }
+        } else
+                fclose(fd);
+
+        g_snprintf(log_all_file, 256, "%s/.gaim/%s", getenv("HOME"), current_user->username);
+
+        if (stat(log_all_file, &st) < 0)
+                flag = 1;
+        if (!S_ISDIR(st.st_mode))
+                unlink(log_all_file);
+
+        fd = fopen(log_all_file, "r");
+        if (!fd) {
+                res = mkdir(log_all_file, S_IRUSR | S_IWUSR | S_IXUSR);
+                if (res < 0) {
+                        g_snprintf(buf, BUF_LONG, "Unable to make directory %s for logging", log_all_file);
+                        do_error_dialog(buf, "Error!");
+                        g_free(buf);
+                        g_free(buf2);
+                        return NULL;
+                }
+        } else
+                fclose(fd);
+
+        
+        g_snprintf(log_all_file, 256, "%s/.gaim/%s/%s.log", getenv("HOME"), current_user->username, normalize(c->name));
+
+        if (stat(log_all_file, &st) < 0)
+                flag = 1;
+
+        sprintf(debug_buff,"Logging to: \"%s\"\n", log_all_file);
+        debug_print(debug_buff);
+
+        fd = fopen(log_all_file, "a");
+
+        if (flag) { /* is a new file */
+		fprintf(fd, "<HTML><HEAD><TITLE>" );
+		fprintf(fd, "IM Sessions with %s", c->name );
+		fprintf(fd, "</TITLE></HEAD><BODY BGCOLOR=\"ffffff\">\n" );
+        }
+        return fd;
+}
+
+
+int escape_message(char *msg)
+{
+	char *c, *cpy;
+	int cnt=0;
+	/* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
+	if (strlen(msg) > BUF_LEN) {
+		sprintf(debug_buff, "Warning:  truncating message to 2048 bytes\n");
+		debug_print(debug_buff);
+		msg[2047]='\0';
+	}
+	
+	cpy = g_strdup(msg);
+	c = cpy;
+	while(*c) {
+		switch(*c) {
+		case '$':
+		case '[':
+		case ']':
+		case '(':
+		case ')':
+		case '#':
+			msg[cnt++]='\\';
+			/* Fall through */
+		default:
+			msg[cnt++]=*c;
+		}
+		c++;
+	}
+	msg[cnt]='\0';
+	g_free(cpy);
+	return cnt;
+}
+
+int escape_text(char *msg)
+{
+	char *c, *cpy;
+	int cnt=0;
+	/* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
+	if (strlen(msg) > BUF_LEN) {
+		fprintf(stderr, "Warning:  truncating message to 2048 bytes\n");
+		msg[2047]='\0';
+	}
+	
+	cpy = g_strdup(msg);
+	c = cpy;
+	while(*c) {
+                switch(*c) {
+                case '\n':
+                        msg[cnt++] = '<';
+                        msg[cnt++] = 'B';
+                        msg[cnt++] = 'R';
+                        msg[cnt++] = '>';
+                        break;
+		case '{':
+		case '}':
+		case '\\':
+		case '"':
+			msg[cnt++]='\\';
+			/* Fall through */
+		default:
+			msg[cnt++]=*c;
+		}
+		c++;
+	}
+	msg[cnt]='\0';
+	g_free(cpy);
+	return cnt;
+}
+
+char * escape_text2(char *msg)
+{
+        char *c, *cpy;
+	char *woo;
+        int cnt=0;
+        /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
+        if (strlen(msg) > BUF_LEN) {
+                fprintf(stderr, "Warning:  truncating message to 2048 bytes\n");
+                msg[2047]='\0';
+        }
+
+	woo = (char *)malloc(strlen(msg) * 2); 
+        cpy = g_strdup(msg);
+        c = cpy;
+        while(*c) {
+                switch(*c) {
+                case '\n':
+                        woo[cnt++] = '<';
+                        woo[cnt++] = 'B';
+                        woo[cnt++] = 'R';
+                        woo[cnt++] = '>';
+                        break;
+                case '{':
+                case '}':
+                case '\\':
+                case '"':
+                        woo[cnt++]='\\';
+                        /* Fall through */
+                default:
+                        woo[cnt++]=*c;
+                }
+                c++;
+        }
+        woo[cnt]='\0';
+        return woo;
+}
+
+
+char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+                  "0123456789+/";
+                  
+
+char *tobase64(char *text)
+{
+	char *out = NULL;
+	char *c;
+	unsigned int tmp = 0;
+	int len = 0, n = 0;
+	
+	c = text;
+	
+	while(c) {
+		tmp = tmp << 8;
+		tmp += *c;
+		n++;
+
+		if (n == 3) {
+			out = g_realloc(out, len+4);
+			out[len] = alphabet[(tmp >> 18) & 0x3f];
+			out[len+1] = alphabet[(tmp >> 12) & 0x3f];
+			out[len+2] = alphabet[(tmp >> 6) & 0x3f];
+			out[len+3] = alphabet[tmp & 0x3f];
+			len += 4;
+			tmp = 0;
+			n = 0;
+		}
+		c++;
+	}
+	switch(n) {
+	
+	case 2:
+	        out = g_realloc(out, len+5);
+	        out[len] = alphabet[(tmp >> 12) & 0x3f];
+	        out[len+1] = alphabet[(tmp >> 6) & 0x3f];
+	        out[len+2] = alphabet[tmp & 0x3f];
+	        out[len+3] = '=';
+	        out[len+4] = 0;
+	        break;
+	case 1:
+	        out = g_realloc(out, len+4);
+	        out[len] = alphabet[(tmp >> 6) & 0x3f];
+	        out[len+1] = alphabet[tmp & 0x3f];
+	        out[len+2] = '=';
+	        out[len+3] = 0;
+	        break;
+	case 0:
+		out = g_realloc(out, len+2);
+		out[len] = '=';
+		out[len+1] = 0;
+		break;
+	}
+	return out;
+}
+
+
+char *frombase64(char *text)
+{
+        char *out = NULL;
+        char tmp = 0;
+        char *c;
+        gint32 tmp2 = 0;
+        int len = 0, n = 0;
+        
+        c = text;
+        
+        while(*c) {
+                if (*c >= 'A' && *c <= 'Z') {
+                        tmp = *c - 'A';
+                } else if (*c >= 'a' && *c <= 'z') {
+                        tmp = 26 + (*c - 'a');
+                } else if (*c >= '0' && *c <= 57) {
+                        tmp = 52 + (*c - '0');
+                } else if (*c == '+') {
+                        tmp = 62;
+                } else if (*c == '/') {
+                	tmp = 63;
+                } else if (*c == '=') {
+                        if (n == 3) {
+                                out = g_realloc(out, len + 2);
+                                out[len] = (char)(tmp2 >> 10) & 0xff;
+                                len++;
+                                out[len] = (char)(tmp2 >> 2) & 0xff;
+                                len++;
+                        } else if (n == 2) {
+                                out = g_realloc(out, len + 1);
+                                out[len] = (char)(tmp2 >> 4) & 0xff;
+                                len++;
+                        }
+                        break;
+                }
+                tmp2 = ((tmp2 << 6) | (tmp & 0xff));
+                n++;
+                if (n == 4) {
+                        out = g_realloc(out, len + 3);
+                        out[len] = (char)((tmp2 >> 16) & 0xff);
+                        len++;
+                        out[len] = (char)((tmp2 >> 8) & 0xff);
+                        len++;
+                        out[len] = (char)(tmp2 & 0xff);
+                        len++;
+                        tmp2 = 0;
+                        n = 0;
+                }
+                c++;
+        }
+
+        g_realloc(out, len+1);
+        out[len] = 0;
+        
+        return out;
+}
+
+
+char *normalize(const char *s)
+{
+	static char buf[BUF_LEN];
+        char *t, *u;
+        int x=0;
+
+        u = t = g_malloc(strlen(s) + 1);
+
+        strcpy(t, s);
+        g_strdown(t);
+        
+	while(*t) {
+		if (*t != ' ') {
+			buf[x] = *t;
+			x++;
+		}
+		t++;
+	}
+        buf[x]='\0';
+        g_free(u);
+	return buf;
+}
+
+int query_state()
+{
+        return state;
+}
+
+void set_state(int i)
+{
+        state = i;
+}
+
+char *date()
+{
+	static char date[80];
+	time_t tme;
+	time(&tme);
+	strftime(date, sizeof(date), "%H:%M:%S", localtime(&tme));
+	return date;
+}
+
+
+gint clean_pid(void *dummy)
+{
+	int status;
+	pid_t pid;
+
+	pid = waitpid(-1, &status, WNOHANG);
+
+	if (pid == 0)
+		return TRUE;
+
+	return FALSE;
+}
+
+void aol_icon(GdkWindow *w)
+{
+#ifndef _WIN32
+	if (icon_pm == NULL) {
+		icon_pm = gdk_pixmap_create_from_xpm_d(w, &icon_bm,
+						       NULL, (gchar **)aimicon_xpm);
+	}
+	gdk_window_set_icon(w, NULL, icon_pm, icon_bm);
+        gdk_window_set_group(w, mainwindow->window);
+#endif
+}
+
+struct aim_user *find_user(const char *name)
+{
+        char *who = g_strdup(normalize(name));
+        GList *usr = aim_users;
+        struct aim_user *u;
+
+        while(usr) {
+                u = (struct aim_user *)usr->data;
+                if (!strcmp(normalize(u->username), who)) {
+                        g_free(who);
+                        return u;
+                }
+                usr = usr->next;
+        }
+        g_free(who);
+        return NULL;
+}