#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_G    200
#define MAX_R      5
#define MAX_LEN  100

int rmaxi,rmaxj,error_flg=0;

struct database{
    char *kata[MAX_R];
};
static struct database db[MAX_G],taiou[MAX_G],sort_tmp;

int memory_alloc(void);
int file_load(void);
int taiou_load(void);
void memory_free(void);
void error_msg(char *);
void data_edit(void);
void data_sort(void);
void data_output(void);

void all_hyouji(void)
{
    int i,j;
    
    //printf("%d %d\n",rmaxi,rmaxj);
    for(i=0;i<rmaxi;i++){
        for(j=0;j<rmaxj;j++){
            printf("%s,",db[i].kata[j]);
        }
        printf("\n");
    }
}

void main(void)
{
    
    if(memory_alloc()== -1) return;
    if(file_load()   == -1) return;
    if(taiou_load()  == -1) return;
    data_edit();
    data_sort();
    
    if(error_flg==1) return;
    
    //all_hyouji();
    data_output();
    memory_free();
}

void data_edit(void)
{
    int i,j;
    char hasi[MAX_LEN+1];
    
    for(i=0;i<rmaxi;i++){
        strcpy(hasi         ,db[i].kata[0]);
        strcpy(db[i].kata[0],db[i].kata[1]);
        strcpy(db[i].kata[1],hasi         );
        strcpy(db[i].kata[2],"no_data");
        for(j=0;j<rmaxi;j++){
            if(strcmp(db[i].kata[1],taiou[j].kata[0])==0){
                strcpy(db[i].kata[2],taiou[j].kata[1]);
            }
        }
    }
}

void data_sort(void)
{
    int i,j,s,max;
    
    for(i=0;i<rmaxi-1;i++){
        max=atoi(db[i].kata[0]);
        s=i;
        for(j=i+1;j<rmaxi;j++){
            if(atoi(db[j].kata[0])>max){
                max=atoi(db[j].kata[0]);
                s=j;
            }
        }
        sort_tmp=db[i];
        db[i]=db[s];
        db[s]=sort_tmp;
    }
    
}

void data_output(void)
{
    int i,j,top_num,roop;
    
    top_num=strlen(db[0].kata[0]);
    for(i=0;i<rmaxi;i++){
        roop=top_num-(int)strlen(db[i].kata[0]);
        for(j=0;j<roop;j++) printf(".");
        
        printf("%s ",db[i].kata[0]);
        printf("<a href=%s>",db[i].kata[1]);
        printf("%s</a><br>",db[i].kata[2]);
        printf("\n");
    }
}

void error_msg(char *msg)
{
    printf("%s\n",msg);
    error_flg=1;
}

int file_load(void)
{
    FILE *fp;
    int i,j,tmp;
    char han[1];
    
    if((fp=fopen("data_in.txt","rb"))==NULL){
        error_msg("ファイル読込失敗");
        return(-1);
    }
    
    for(i=0;i<MAX_G;i++){
        for(j=0;j<MAX_R;j++){
            strcpy(db[i].kata[j],"");
        }
    }
    rmaxj=0;
    i=j=0;
    while((tmp=fgetc(fp))!=EOF){
        if(tmp==0x0d){
            ;
        }
        else if(tmp=='\n'){
            i++;
            j=0;
        }
        else if(tmp==','){
            j++;
        }
        else if(tmp==' '){
            if(strlen(db[i].kata[j])>0) j++;
        }
        else{
            if(i>=MAX_G || j>=MAX_R){
                error_msg("収録データ異常(データ数)");
                fclose(fp);
                return(-1);
            }
            if(strlen(db[i].kata[j])>=MAX_LEN){
                error_msg("収録データ異常(文字数)");
                fclose(fp);
                return(-1);
            }
            han[0]=tmp;
            strncat(db[i].kata[j],han,1);
            if(j>rmaxj) rmaxj=j;
            rmaxi=i;
        }
    }
    rmaxi++;
    rmaxj++;
    fclose(fp);
    return(1);
}

int taiou_load(void)
{
    FILE *fp;
    int i,j,tmp;
    char han[1];
    
    if((fp=fopen("taiou.csv","rb"))==NULL){
        error_msg("ファイル読込失敗");
        return(-1);
    }
    
    for(i=0;i<MAX_G;i++){
        for(j=0;j<MAX_R;j++){
            strcpy(taiou[i].kata[j],"");
        }
    }
    i=j=0;
    while((tmp=fgetc(fp))!=EOF){
        if(tmp==0x0d){
            ;
        }
        else if(tmp=='\n'){
            i++;
            j=0;
        }
        else if(tmp==','){
            j++;
        }
        else{
            if(i>=MAX_G || j>=MAX_R){
                error_msg("収録データ異常(データ数)");
                fclose(fp);
                return(-1);
            }
            if(strlen(taiou[i].kata[j])>=MAX_LEN){
                error_msg("収録データ異常(文字数)");
                fclose(fp);
                return(-1);
            }
            han[0]=tmp;
            strncat(taiou[i].kata[j],han,1);
        }
    }
    fclose(fp);
    return(1);
}

int memory_alloc(void)
{
    int i,j;
    
    for(i=0;i<MAX_G;i++){
        for(j=0;j<MAX_R;j++){
            db[i].kata[j]=(char *)malloc(sizeof(char)*(MAX_LEN+1));
            if(db[i].kata[j]==NULL){
                error_msg("メモリ確保失敗");
                return(-1);
            }
        }
    }
    for(i=0;i<MAX_G;i++){
        for(j=0;j<MAX_R;j++){
            taiou[i].kata[j]=(char *)malloc(sizeof(char)*(MAX_LEN+1));
            if(taiou[i].kata[j]==NULL){
                error_msg("メモリ確保失敗");
                return(-1);
            }
        }
    }
    return(1);
}

void memory_free(void)
{
    int i,j;
    
    for(i=0;i<MAX_G;i++){
        for(j=0;j<MAX_R;j++){
            free(db[i].kata[j]);
            free(taiou[i].kata[j]);
        }
    }
}