/*****  名前ジェネレータ namegen    *****/
/*****  main.c                      *****/



#include <stdio.h>
#include <stdlib.h>
#include "namegen.h"
#include "put.h"


void main(int argc, char *argv[]){

/*  ・各ワードは読込順にwordbufに入れられ、                                 */
/*    一杯になると次のwordbufが確保される。                                 */
/*  ・このときそのワードを定義するフィールドfieldでは、                     */
/*　　ptrbuf[field].ptr[]にそのワードへのポインタが格納される               */
/*  ・ptrbufは一杯になると新たに確保される                                  */
/*  ・フィールドfieldのワードword (1<word<wordix_max[field]) は、           */
/*  　ptrbuf_base[field]が指すptrbufから                                    */
/*    ptrbufのリストを(word / PTRBUF_MAX)回辿ったあと、                     */
/*    ptrbuf->ptr[word % PTRBUF_MAX] にある                                 */

    Ptrbuf          *ptrbuf_base[FIELD_MAX];    /* 各フィールドの           */
                                                /* ptrbufベース             */
    int             wordix_max[FIELD_MAX];      /* 各ワードのワードix最大   */
    int             gen_prob[FIELD_MAX];        /* 各フィールドの出現確率   */
    int             gen_num;                    /* 名前生成数               */
    int             verbose_level;              /* 冗長モードレベル         */
    int             i;
    int             field_max;                  /* フィールド数             */


    gen_num         = 1;                /* デフォルト生成数                 */
    verbose_level   = 0;                /* デフォルト冗長モード             */

    for (i = 1 ; i < argc && (char)*argv[i] == '-' ; i ++){
        switch ( (char)*(argv[i]+1)){
            case 'n' :
                if (i < argc-1){
                    gen_num = atoi(argv[i+1]);
                    if (gen_num < 0){
                        error(ERR_HELP,NULL);
                    }
                    i ++;
                }
                break;
            case 'v' :
                if (i < argc-1){
                    verbose_level = atoi(argv[i+1]);
                    if (verbose_level < 0 || 2 < verbose_level){
                        error(ERR_HELP, NULL);
                    }
                    i ++;
                }
                break;
            default  :
                error(ERR_HELP, NULL);
                break;
        }
    }
    if (i == argc){
        error(ERR_HELP, NULL);
    }
    if (verbose_level > 0){
        putstr("*****  Start Reading Namefile  *****\n", stderr);
    }

    for ( ; i < argc ; i ++){               /*  ファイル読込                */
        read_namefile(argv[i],
                      ptrbuf_base,
                      wordix_max,
                      gen_prob,
                      &field_max,
                      verbose_level);
    }

                        /* 生成確率＞０でワード未定義のフィールドをチェック */
    for (i = 1 ; i <= field_max ; i ++){
        if (gen_prob[i] > 0 && wordix_max[i] == 0){
            putstr("Field:", stderr);
            putint(i, stderr);
            putstr("\n", stderr);
            error(ERR_UNDEF_WORD, NULL);
        }
    }

    if (verbose_level > 0){
        putstr("*****  Finished Reading Namefile  *****\n\n", stderr);
    }

    generate_name(ptrbuf_base,                  /* 名前生成                 */
                  wordix_max,
                  gen_prob,
                  field_max,
                  gen_num);

}


