syadr.c

Vine Linux ご用達のメーラー Sylpheed のアドレスブックは「共有アドレス」と「個人アドレス」に分かれており、それぞれに、分類のためその中にフォルダを作ることが出来、一括送信のためにグループも作ることができます。フォルダの中にはグループは作れますが、グループの中にはフォルダを作ることはできません。このアドレスブックで不満なのは、あるフォルダから別のフォルダに個人データを移すことが出来ないということです。たとえば「取り引き先」に入っていたデータを「関連企業」に移すようなことです。私はこれを簡単にするため、タブ区切りのテキストファイルからアドレスブックをを作ることを思いたちました。

テキストファイルの構造は

フォルダ名|グループ名|名前|メールアドレス
としました。|はタブを表わします。この程度ならわざわざスプレッドシートを使わなくても、テキストエディタだけでもどんどんアドレスを記入できます。私の場合は WZ のアドレス帳のデータをそのまま流用しました。名前の前にフォルダ名とグループ名を入れていけばいいのです。次に例を示します。
取引先|米国|Andrew Mead|amead@company.com
取引先|日本|遠山五郎|gtoyama@kaisha.co.jp
関連企業||Charls Smith|csmith@government.gov
取引先|米国|Andrew Mead|amead@company.com
関連企業|技術部|川端楠男|kwab@tech.co.jp
グループ分けが不用な場合は、そこをブランクにしておけばいいのです。次にこれをソートします。XZ のソート機能を使えば次のように一発でソートされますからこれを保存します。
関連企業||Charls Smith|csmith@government.gov
関連企業|技術部|川端楠男|kwab@tech.co.jp
取引先|日本|遠山五郎|gtoyama@kaisha.co.jp
取引先|米国|Andrew Mead|amead@company.com
取引先|米国|Andrew Mead|amead@company.com

アドレスブックは xml で記述されていますので、このデータを次のように書き換えていけばいいわけです。

<folder name="関連企業">
    <item>
        <name>Charls Smith</name>
        <address>csmith@government.gov</address>
        <remarks></remarks>
    </item>
    <group name="技術部">
        <item>
        <name>川端楠男</name>
        <address>kwab@tech.co.jp</address>
        <remarks></remarks>
        </item>
    </group>
</folder>
<folder name="取引先">

これを、曲がりなりにも実現したのが次のプログラムです。こうしてでき上がった addressbook.xml を ~/.sylpheed にコピーして Sylpheed を起動すればいいわけです。Sylpheed の新しいバージョンではアドレス帳の形式が違いますが、自動的に新しい形式に変換してくれます。変換がうまく行かない時は ~/.sylpheed の addrebook--* を消してから改めて Sylpheed を起動するとうまくいきます。

/*

syadr.c


*/

#include <stdio.h>

#define YES 1
#define NO  0

main()
{
FILE *inp, *out;
int i, j, FOLDER, GROUP;
char buf[80], folder[40], group[40], name[40], email[40], old_folder[40], old_group[40];

if((inp=fopen("addressbook.txt", "r"))==NULL){
    printf("Can't open <addressbook.txt>\n");
    exit(0);
    }

if((out=fopen("addressbook.xml", "w"))==NULL){
    printf("Can't open <addressbook.xml>\n");
    exit(0);
    }

printf("addressbook.txt --> addressbook.xml  ");

fprintf(out, "<?xml version=\"1.0\" encoding=\"EUC-JP\"?>\n");
fprintf(out, "<addressbook>\n\n");
fprintf(out, "<common_address>\n");

strcpy(old_folder, "");
strcpy(old_group, "");
FOLDER=NO;
GROUP=NO;

while(fgets(buf, 80, inp)!=NULL){
    for(i=0, j=0; buf[i]!='\t'; i++, j++)
        folder[j]=buf[i];
    folder[j]='\0';

    for(i=i+1, j=0; buf[i]!='\t'; i++, j++)
        group[j]=buf[i];
    group[j]='\0';

    for(i=i+1, j=0; buf[i]!='\t'; i++, j++)
        name[j]=buf[i];
    name[j]='\0';

    for(i=i+1, j=0; buf[i]!='\n'; i++, j++)
        email[j]=buf[i];
    email[j]='\0';

    if(strcmp(folder, old_folder)!=0){
        if(GROUP==YES){
            fprintf(out, "\t\t</group>\n\n");
            GROUP=NO;
            }
        if(FOLDER==YES){
            fprintf(out, "\t</folder>\n\n");
            FOLDER=NO;
            }
        if(folder[0]>0){
            fprintf(out, "\t<folder name=\"%s\">\n", folder);
            FOLDER=YES;
            }
        }

    if(strcmp(group, old_group)!=0){
        if(GROUP==YES){
            fprintf(out, "\t\t</group>\n\n");
            GROUP=NO;
            }
        if(group[0]>0){
            fprintf(out, "\n\t\t<group name=\"%s\">\n", group);
            GROUP=YES;
            }
        }

    if(FOLDER==YES)
        fprintf(out, "\t\t");
    if(GROUP==YES)
        fprintf(out, "\t");
    fprintf(out, "<item>\n\t\t\t<name>%s</name>\n", name);
    
    if(FOLDER==YES)
        fprintf(out, "\t\t");
    if(GROUP==YES)
        fprintf(out, "\t");
    fprintf(out, "\t<address>%s</address>\n", email);
    
    if(FOLDER==YES)
        fprintf(out, "\t\t");
    if(GROUP==YES)
        fprintf(out, "\t");
    fprintf(out, "\t<remarks></remarks>\n");
    
    if(FOLDER==YES)
        fprintf(out, "\t\t");
    if(GROUP==YES)
        fprintf(out, "\t");
    fprintf(out, "</item>\n");
    
    strcpy(old_group, group);
    strcpy(old_folder, folder);
    }
if(GROUP==YES)
    fprintf(out, "\t\t</group>\n\n");
if(FOLDER==YES)
    fprintf(out, "\t</folder>\n\n");
fprintf(out, "</common_address>\n\n");
fprintf(out, "<personal_address>\n");
fprintf(out, "</personal_address>\n\n");
fprintf(out, "</addressbook>\n");

printf("... done\n");
exit(0);
}

[目次にもどる]