/***********************************************
*                                              *
*    外枠システム  stdfm.c                     *
*  （基本算術関数、csvデータ読み込み関数）     *
*                                              *
***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "set.h"

/* 四ﾌ五入関数 */

double raund( double a, int b ) {
    double c;
    int d;
    int i;
    int S;
    S = 1;
  /*  小数点以下第b位 */
    if ( b>0 ) {
        for (i=1; i<=b; i++){
           S*=10 ;
        }
        a = a*S ;
        d =(int)(a+0.5) ;
        c =(double) d/S ;
        return(c);
    }
  /*  整数  */
    else if ( b==0 ){
        d =(int)(a+0.5) ;
        c =(double) d/1 ;
        return(c);
    }
  /*  整数第b桁  */
    else {
        for (i=-1; i>=b; i--){
           S*=10 ;
        }
        a = a/S ;
        d =(int)(a+0.5) ;
        c =(double) d*S ;
        return(c);
    }
}

/* min関数 */

double min(double a, double b){
    double c;
    if (a<=b) {
         c=a ;
    }
    else {
         c=b ;
    }
    return(c);
}

/* max関数 */

double max(double a, double b){
    double c;
    if (a<=b) {
         c=b ;
    }
    else {
         c=a ;
    }
    return(c);
}

/*  csvデータ読み込み関数  */
int read_csv(double buffer[], FILE *fp, int *data_number_ptr)
{
    int c;                /* 文字 */
    int previous_c;       /* 直前の取得文字 */
    int data_number;      /* データ数-1 */
    int comma_number;     /* カンマ数 */
    char s[BUFFER_MAX];   /* 文字列バッファー(最大BUFFER_MAX文字まで) */
    char *sptr;           /* 文字列ポインタ */
    
    /* 初期化 */
    data_number = -1;     /* data_numberは代入の直前でインクリメント */
    comma_number = 0;
    sptr = s;
    
    /*     fpから１文字cに取得する。 
        cがEOFでも改行でもないときに限り処理を続行する。 */
    while ( ( ( c = fgetc(fp) ) != EOF) && (c != '\n') ) {
            /*  cが区切り文字の場合 */
         if ( c == ',' )  {
            /* エラー処理 */
            if (++comma_number > DATA_MAX)
            {
                printf("エラー(in read_data) １行の中のカンマの数が%d個を超えています。",DATA_MAX); 
                exit(1);
            }
            
            if ( sptr - s > BUFFER_MAX-1)
            {
                printf("エラー(in read_data) １つのデータの文字数が%d個を超えています。",BUFFER_MAX-1); 
                exit(1);
            }
            
            /* 最後に\0を付加 */
            *sptr = '\0';
            
            /* 数値に変換して数値バッファーに代入 */
            buffer[++data_number] = atof(s);
            
            /* 初期化 */
            sptr = s;
        }
        else  {
        
            /* cを代入してポインタを一つ進める */
            *sptr++ = c;
        }
        
        /* 直前の取得文字を保管 */
        previous_c = c;
    }
    
    /* 終了処理 */
    
    /* 直前の取得文字がカンマでない場合について処理 */
    if (previous_c != ',')
    {
    
        /* エラー処理 */
        if (++comma_number > DATA_MAX) {
            printf("エラー(in read_data) １行の中のカンマの数が%d個を超えています。",DATA_MAX); 
            exit(1);
        }
        if ( sptr - s > BUFFER_MAX-1)  {    
            printf("エラー(in read_data) １つのデータの文字数が%d個を超えています。\n",BUFFER_MAX-1); 
            exit(1);
        }
        
        /* 最後に\0を付加 */
        *sptr = '\0';
        
        /* 数値に変換して数値バッファーに代入 */
        buffer[++data_number] = atof(s);
    }
    
    /* データ数-1を返す */
    *data_number_ptr = data_number;
    
    /* EOFを返す */
    if (c == EOF) {
        return(EOF);
    }
    else {
        return(0);
    }
    
}

/*  csvファイル１行分カラ読み関数  */
void karayomi(FILE *fp) {
    int c;
    while ((( c = fgetc(fp) ) != EOF) && ( c != '\n')) {
    }
}

