/*	コマンドライン引数処理を関数コンソールで再現＆データを書き出すプログラム */

#include<stdio.h>	/*	標準入出力			*/
#include<stdlib.h>	/*	freeとmemset		*/
#include<string.h>	/*	strcpy使用			*/
#include<ctype.h>
#include<time.h>
#include<math.h>

#define CHAR_MAX_MEMORY 2048 /* *1byte */
#define  INT_MAX_MEMORY 1024 /* *2byte */
#define LONG_MAX_MEMORY  512 /* *4byte */
#define 		 MEMORY  256 /*	配列メモリ */

typedef struct{
	unsigned bool:1;
}File;

const static File *f;
FILE *fp;

void sub_main();
int option(char *argv[]);	/*	コマンドライン関数プロトタイプ宣言	*/
int argfree(int *argc, char *argv[]);	/*	解放	*/

int AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(int argc,char *argv[]);	/*	内容表示用	*/
void delete(int ,char *[]);

/*==================================================================================*/
#if 0
main(){sub_main();}					/*	メイン	*/
void sub_main(){
	
	int  argc;			/*	引数(入力)の数	*/
	char *argv[MEMORY];	/*	入力内容	*/

	argc = 0;
	
	argc = option(argv);	/*	コマンドライン引数呼び出し	*/
	AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(argc,argv);	/*	内容表示用	*/
    
	/*getch();*/
	fclose(fp);
	argfree(&argc,argv);
	exit(0);
}
#endif
/*==================================================================================*/
/*	入力する文を、半角スペースで単語に区切る関数
引数    ：*argv[]   [io]スペースで区切った単語	へのポインタ配列
戻り値  ：argc      [io]スペースで区切った単語の数
*/
int option(char *argv[]){	/*	コマンドライン関数・引数	*/
	int argc;
	int i;				/*	文字を見ていくループ変数用		*/
	short a;
	char szbuf[MEMORY];	/*	入力文の読み込み用配列			*/
	char *temp;			/*	それぞれの単語の先頭アドレス用	*/
	char *b;
	
	argc = 0;
	i = 0;
	a = 0;
	memset(szbuf,0x00,MEMORY);
	temp = NULL;
	b = NULL;
	
/*	printf("入力した内容をファイルにセーブします。\n"
		   "セーブするファイル名を最初に入力後、\n"
		   "半角スペースで単語を区切って入力してください。\n\n");*/
	gets(szbuf);		/*	コンソールから入力				*/
	if(strcmp(szbuf,"exit")==0){
		return -1;
	}
	for(i = 0; szbuf[i] != '\0'; i++){			/*	文字を見ていく		*/
		if(szbuf[i]==' '){						/*	空白の場合は飛ばす	*/
			continue;
		}
		else{									/*	空白ではない(文字の)場合*/
			temp = &szbuf[i];					/*	そこを先頭アドレスに	*/
			for(i = i; szbuf[i] != ' '; i++){	/*	区切り(空白)を見つけるまで進める	*/
				if(szbuf[i] == '\0'){			/*	途中で終わった時(単語をいくつか入力後すぐエンターの場合)	*/
					break;						/*	もう終わりなので、空白を見つけるループから抜ける			*/
				}								/*	↑これをやらないとバグる*/
				if(argc==0){
					a++;
				}
			}
			if(szbuf[i] == ' '){				/*	区切りを見つけたとき	*/
				szbuf[i] = '\0';				/*	区切りの最初をNULL化	*/
			}
			/*printf("argc=%d\n",argc);*/
			argv[argc] = NULL;
			b = realloc(argv[argc],sizeof(char) * (strlen(temp) + 1) );
			if(b==NULL){
				printf("can't allocate.\n");
				return -2;
			}
			argv[argc] = b;
			strcpy(argv[argc] , temp);			/*	単語(文字)のコピー		*/
			argc++;								/*	引数の増加登録			*/
		}
	}
	if(a>8){
/*		argv[0][8]='\0';*/
	}
	return argc;
}
/*==================================================================================*/

int AGUMENT_PARAMETER_LOOP_PRINT_FUNCTION(int argc,char *argv[]){	/*	内容表示用	*/
	int i;
	int answer;
	
	if(argc >= 0){
		printf("\n引数の数：%d\n\n",argc);
	}
	for(i = 0; i < argc; i++){					/*	引数の数だけ内容表示	*/
		printf("%d %p[%s]\n",i+1,argv[i],argv[i]);
	}
	if(argv[0]==NULL){
		printf("\n\nその名前では書き込めませんでした。\n\n");
	}	
#if 1
    else if(argc > 0  &&  argv[0] != NULL){
		printf("内容をファイルにセーブしますか？YES=1/NO=他　");
		scanf("%d",&answer);
		fflush(stdin);
		if(answer == 1){
			fp=fopen(argv[0],"r");
			if(fp != NULL){
				printf("[ %s ]はすでに存在します。上書きしますか？YES=1/NO=他　",argv[0]);
				scanf("%d",&answer);
				fflush(stdin);
			}
			else{
				answer = 1;
			}
			if(answer == 1){
				fp=fopen(argv[0],"w");
				if(fp==NULL){
                    printf("errorが発生しました!!その名前では書き込めませんでした.\n");
                }
                else{
    				for(i = 0; i < argc; i++){					/*	引数の数だけ内容記録	*/
    					fprintf(fp,"%d %p[%s]\n",i+1,argv[i],argv[i]);
    				}
    				printf("\nデータ内容を『 %s 』に書き出しました。\n",argv[0]);
    				printf("これを読み込むには『 PRINTOOL 』を使ってください。\n\n");
                }
			}
		}
    }
#endif
	delete(argc,argv);
	return 0;
}/*関数の終了*/

/*==================================================================================*/

void delete(int argc,char *argv[]){
	int i;
	char sYes[MEMORY];

	if(argc<=0){
		goto end;
	}
	printf("\n履歴を削除しますか？YES=1/NO=他　");
	gets(sYes);
	fflush(stdout);
	if(strcmp(sYes,"1")==0){
		for(i = 0; i < argc; i++){
			argv[i]=NULL;
			printf("%d %p\n",i+1,argv[i]);
		}
	}
	else{
		for(i = 0; i < argc; i++){
			printf("%d %p[%s]\n",i+1,argv[i],argv[i]);
		}
	}

	end : ;
}

/*==================================================================================*/

int argfree(int *argc,char *argv[]){
    int i;
    fflush(stdin);
    rewind(stdout);
    for(i=0;i<*argc;i++){
        if(argv[i] != NULL){
            memset(argv[i],0x00,strlen(argv[i]));
            free(argv[i]);
            argv[i]=NULL;
        }
    }
    if(*argv!=NULL){
        memset(&argv,NULL,sizeof(char*));
        free(*argv);
        *argv = NULL;
         argv = NULL;
    }
    for(i=0;i<*argc;i++){
        if(argv[i] != NULL){
            return -1;
        }
    }
    *argc = 0;
    argc = NULL;
    
    if(*argv!=NULL){
        return -2;
    }
    else{
        return 0;
    }
}
/*	これを他.cと同じディレクトリ上に置いて他.cで#include"save.c"すればoption関数が使えます！
    このプログラム単体で動かす場合にはメインの#ifを1にしてコンパイル→実行して下さい */
