>
>
>
>Can you send me the source so I can include it in the converters if it works 
>properly?
>
Sure - here it is. I really only wrote this to teach myself some C - the 
fact that it works and may be useful is just an added bonus ;-)
I'm sure this code could be written in a better way - I'd really 
appreciate comments, please feel free to criticise.

Compile with "gcc -o dbconvert dbconvert.c" (if you want me to make a 
Makefile/README or whatever, tell me and I'll try my best)
Usage is "dbconvert <youricqclbfile.clb> <licqbasedir>"

Philip Nelson

/* 
 * icq .clb to licq contact list converter
 * written by Philip Nelson ([EMAIL PROTECTED])
 * uin: 16385042
 */

#include <stdio.h>
#define MAXLINE 128

typedef struct icqInfo
{
        char uin[15];
        char name[20];
        char group[20];
        struct icqInfo *link;
} icqInfo;

icqInfo * Add(icqInfo *, char *, char *, char *);

typedef struct groups
{
        char grpname[20];
        int groupid;
        struct groups *link;
} groups;

void printInfo(icqInfo *, groups *);
groups * addGroup(groups *, char *);
void printGroups(groups *);
int foundGroup(groups *, char *);
groups * doGroups(icqInfo *, groups *);
int getGroupId(char *, groups *);
char basedir[1000];
char clb[100];

int main(int numargs, char *argv[]) {
        int i;
        int j;
        FILE *f;
        char line[MAXLINE];
        char *name;
        char *group;
        char *uin;
        char accept;
        icqInfo *details_pointer = NULL;
        groups *groups_pointer = NULL;

        if(numargs != 3) {
                printf("Usage: %s <icqclbfile> <licqbasedir>\n", argv[0]);
                exit(1);
        }

        printf("**WARNING!!** It is HIGHLY recommended you backup your\nlicq base 
directory (default ~/.licq) before using this\ntool. If you haven't done so, please 
do, then rerun me.\nContinue? (y/n) ");
        accept = getchar();
        if(accept != 'y') {
                printf("Exiting...\n");
                exit(0);
        }

        strcpy(clb, argv[1]);
        strcpy(basedir, argv[2]);

        f = fopen(clb, "r");
        if(f) {
                int k;
                for(k=1;fgets(line, MAXLINE, f);k++) {
                        j=0;

                        for(i=0;i<=MAXLINE;i++) {
                                if(line[i] == ';') {
                                        *(line+i) = '\0';
                                        if(j==0) {
                                                group = line;
                                                uin = line+i+1;
                                        }else if(j==1) {
                                                name = line+i+1;
                                        }else if(j==2) {
                                        } else {
                                                printf("Error parsing file! line: %d 
(make sure name doesn't contains any semilcolons)\n", k);
                                                exit(1);
                                        }
                                        j++;
                                }
                        }
                        
                        details_pointer = Add(details_pointer, name, group, uin);
                }
        }else{
                printf("Couldn't open %s\n", argv[1]);
        }
        
        groups_pointer = doGroups(details_pointer, groups_pointer);
        printInfo(details_pointer, groups_pointer);
        printGroups(groups_pointer);
        printf("Done! Please icq 16385042 and tell him how useful this was :-)\n");
}

icqInfo * Add(icqInfo * details_pointer, char *name, char *group, char *uin)
{
        icqInfo * lp = details_pointer;
        if(details_pointer) {
                while(details_pointer->link)
                        details_pointer=details_pointer->link;
       
                details_pointer->link = (struct icqInfo *)malloc(sizeof(icqInfo));
                details_pointer = details_pointer->link;
                details_pointer->link = NULL;
                strncpy(details_pointer->name, name, 20);
                strncpy(details_pointer->group, group, 20);
                strncpy(details_pointer->uin, uin, 15);
                return lp;
        } else {
                details_pointer = (struct icqInfo *)malloc(sizeof(icqInfo));
                details_pointer->link = NULL;
                strncpy(details_pointer->name, name, 20);
                strncpy(details_pointer->group, group, 20);
                strncpy(details_pointer->uin, uin, 20);
                return details_pointer;
        }
}

void printInfo(icqInfo *details_pointer, groups *groups_pointer)
{
        FILE *users;
        FILE *user;
        int i;
        int groupid;
        char usersfile[1000];
        strcpy(usersfile, basedir);
        strcat(usersfile, "/users.conf");
        users=fopen(usersfile, "w");
        if(users==NULL) {
                printf("Error: couldn't open %s for writing\n", usersfile);
                exit(1);
        }
        fputs("[users]\n", users);
        for(i=1;details_pointer;i++) {
                char uinfile[1000];
                fprintf(users, "User%d = %s\n", i, details_pointer->uin);
                strcpy(uinfile, basedir);
                strcat(uinfile, "/users/");
                strcat(uinfile, details_pointer->uin);
                strcat(uinfile, ".uin");
                user=fopen(uinfile, "w");
                fputs("[user]\n", user);
                fprintf(user, "Alias = %s\n", details_pointer->name);
                groupid = getGroupId(details_pointer->group, groups_pointer);
                if(groupid) {
                        fprintf(user, "Groups.User = %d\n", groupid);
                }
                details_pointer = details_pointer->link;
        }
        fprintf(users, "NumOfUsers = %d", i-1);
        fclose(users);
        fclose(user);
}

int getGroupId(char *group, groups *groups_pointer)
{
        if(groups_pointer == NULL) {
                printf("weird error!\n");
        } else {
                while(groups_pointer) {
                        if(!strcmp(group, groups_pointer->grpname)) {
                                return groups_pointer->groupid;
                        }
                        groups_pointer = groups_pointer->link;
                }
        }
        return 0;
}

groups *doGroups(icqInfo *details_pointer, groups *groups_pointer)
{
        if(details_pointer == NULL) {
                printf("weird error!\n");
        } else {
                while(details_pointer) {
                        if(!foundGroup(groups_pointer, details_pointer->group)) {
                                groups_pointer = addGroup(groups_pointer, 
details_pointer->group);
                        }
                        details_pointer=details_pointer->link;
                }
        }
        return groups_pointer;
}

int foundGroup(groups *groups_pointer, char *groupname)
{
        int found = 1;
        if(groups_pointer == NULL) {
                found = 1;
        } else {
                while(groups_pointer) {
                        if(!strcmp(groups_pointer->grpname, groupname)) {
                                found = 0;
                        }
                        groups_pointer = groups_pointer->link;
                }
        }
        if(found) {
                return 0;
        }else{
                return 1;
        }
}
                   
void printGroups(groups *groups_pointer)
{
        int i;

        FILE *conf;
        FILE *tmp;
        char line[100];
        char brokenline[100];
        char *borked=NULL;
        char conffile[1000];
        char tmpfile[1000];
        char mvcmd[1000];
        strcpy(conffile, basedir);
        strcat(conffile, "/licq.conf");
        strcpy(tmpfile, basedir);
        strcat(tmpfile, "/licq.conf.tmp");
        conf=fopen(conffile, "r");
        if(conf==NULL) {
                printf("Error: couldn't open %s for reading!\n", conffile);
                exit(1);
        }
        tmp=fopen(tmpfile, "w");
        if(tmp==NULL) {
                printf("Error: couldn't write to temporary file %s (check dir 
permissions)\n", tmpfile);
                exit(1);
        }

        while(fgets(line, 100, conf)) {
                if(!strncmp(line, "[groups]", 8)) {
                        while(fgets(line, 100, conf)) {
                                if(!strncmp(line, "[", 1)) {
                                        break;
                                }
                        }
                }
                fprintf(tmp, "%s", line);
        }
        fclose(conf);
        fputs("[groups]\n", tmp);
        for(i=0;groups_pointer;i++) {
                fprintf(tmp, "Group%d.name = %s\n", i+1, groups_pointer->grpname);
                groups_pointer = groups_pointer->link;
        }
        fprintf(tmp, "NumOfGroups = %d\n", i);
        fputs("DefaultGroup = 0\n",tmp);
        fputs("NewUserGroup = 1\n",tmp);
        fclose(tmp);
        snprintf(mvcmd, 1000, "mv %s %s", tmpfile, conffile);
        system(mvcmd);
}

groups *addGroup(groups *groups_pointer, char *name)
{
        int i=1;
        groups *lp = groups_pointer;
        if(groups_pointer) {
                i=2;
                while(groups_pointer->link) {
                        groups_pointer = groups_pointer->link;
                        i++;
                }   
                groups_pointer->link = (struct groups *)malloc(sizeof(groups));
                groups_pointer = groups_pointer->link;
                groups_pointer->link = NULL;
                strcpy(groups_pointer->grpname, name);
                groups_pointer->groupid = power(2, i-1);
                return lp;
        } else {
                groups_pointer = (struct groups *)malloc(sizeof(groups));
                groups_pointer->link = NULL;
                strcpy(groups_pointer->grpname, name);
                groups_pointer->groupid = power(2, i-1);
                i++;
                return groups_pointer;
        }
}

int power(int base, int n) {
    int     i,
            p;
    p = 1;
    for (i = 1; i <= n; ++i)
        p *= base;
    return p;
}








Reply via email to