fixed a minor problem in the Awk class and enhanced a test program for sed
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: opt.h 75 2009-02-22 14:10:34Z hyunghwan.chung $ | ||||
|  * $Id: opt.h 189 2009-06-07 06:23:53Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -25,23 +25,12 @@ | ||||
| typedef struct qse_opt_t qse_opt_t; | ||||
| typedef struct qse_opt_lng_t qse_opt_lng_t; | ||||
|  | ||||
| /****t* Common/qse_opt_lng_t | ||||
|  * NAME | ||||
|  *  qse_opt_lng_t - define a long option | ||||
|  * SYNOPSIS | ||||
|  */ | ||||
| struct qse_opt_lng_t | ||||
| { | ||||
| 	const qse_char_t* str; | ||||
| 	qse_cint_t        val; | ||||
| }; | ||||
| /*****/ | ||||
|  | ||||
| /****t* Common/qse_opt_t | ||||
|  * NAME | ||||
|  *  qse_opt_t - define a command line option table | ||||
|  * SYNOPSIS | ||||
|  */ | ||||
| struct qse_opt_t | ||||
| { | ||||
| 	/* input */ | ||||
| @ -61,26 +50,20 @@ struct qse_opt_t | ||||
| 	/* input + output - internal*/ | ||||
| 	qse_char_t*        cur; | ||||
| }; | ||||
| /******/ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /****f* Common/qse_getopt | ||||
|  * NAME | ||||
|  *  qse_getopt - process command line options | ||||
|  * DESCRIPTION | ||||
| /** | ||||
|  * The qse_getopt() function returns QSE_CHAR_EOF when it finishes processing | ||||
|  * command line options. The return values of QSE_T('?') indicates an error. | ||||
|  * SYNOPSIS | ||||
|  */ | ||||
| qse_cint_t qse_getopt ( | ||||
| 	int                argc  /* argument count */,  | ||||
| 	qse_char_t* const* argv  /* argument array */, | ||||
| 	qse_opt_t*         opt   /* option configuration */ | ||||
| ); | ||||
| /******/ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Awk.cpp 182 2009-06-03 21:50:32Z hyunghwan.chung $ | ||||
|  * $Id: Awk.cpp 189 2009-06-07 06:23:53Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -81,7 +81,7 @@ void Awk::RIO::setHandle (void* handle) | ||||
| 	this->riod->handle = handle; | ||||
| } | ||||
|  | ||||
| Awk::RIO::operator Awk::Awk* () const  | ||||
| Awk::RIO::operator Awk* () const  | ||||
| { | ||||
| 	rxtn_t* rxtn = (rxtn_t*) QSE_XTN (this->rtx); | ||||
| 	return rxtn->run->awk; | ||||
|  | ||||
| @ -21,8 +21,11 @@ | ||||
| #include <qse/cmn/main.h> | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/chr.h> | ||||
| #include <qse/cmn/opt.h> | ||||
|  | ||||
| const qse_char_t* instream = QSE_NULL; | ||||
| static const qse_char_t* g_script = QSE_NULL; | ||||
| static const qse_char_t* g_infile = QSE_NULL; | ||||
| static int g_option = 0; | ||||
|  | ||||
| static qse_ssize_t in ( | ||||
| 	qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg) | ||||
| @ -33,14 +36,14 @@ static qse_ssize_t in ( | ||||
| 			if (arg->path == QSE_NULL || | ||||
| 			    arg->path[0] == QSE_T('\0')) | ||||
| 			{ | ||||
| 				if (instream) | ||||
| 				if (g_infile) | ||||
| 				{ | ||||
| 					arg->handle = qse_fopen (instream, QSE_T("r")); | ||||
| 					arg->handle = qse_fopen (g_infile, QSE_T("r")); | ||||
| 					if (arg->handle == QSE_NULL)  | ||||
| 					{ | ||||
| 						qse_cstr_t errarg; | ||||
| 						errarg.ptr = instream; | ||||
| 						errarg.len = qse_strlen(instream); | ||||
| 						errarg.ptr = g_infile; | ||||
| 						errarg.len = qse_strlen(g_infile); | ||||
| 						qse_sed_seterror (sed, QSE_SED_EIOFIL, 0, &errarg); | ||||
| 						return -1; | ||||
| 					} | ||||
| @ -109,18 +112,69 @@ static qse_ssize_t out ( | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[]) | ||||
| { | ||||
| 	qse_fprintf (out, QSE_T("%s [options] script [file]\n"), argv[0]); | ||||
| 	qse_fprintf (out, QSE_T("options as follows:\n")); | ||||
| 	qse_fprintf (out, QSE_T(" -h    show this message\n")); | ||||
| 	qse_fprintf (out, QSE_T(" -n    disable auto-print\n")); | ||||
| 	qse_fprintf (out, QSE_T(" -c    enable the classic mode\n")); | ||||
| } | ||||
|  | ||||
| static int handle_args (int argc, qse_char_t* argv[]) | ||||
| { | ||||
| 	static qse_opt_t opt =  | ||||
| 	{ | ||||
| 		QSE_T("hnc"), | ||||
| 		QSE_NULL | ||||
| 	}; | ||||
| 	qse_cint_t c; | ||||
|  | ||||
| 	while ((c = qse_getopt (argc, argv, &opt)) != QSE_CHAR_EOF) | ||||
| 	{ | ||||
| 		switch (c) | ||||
| 		{ | ||||
| 			default: | ||||
| 				print_usage (QSE_STDERR, argc, argv); | ||||
| 				return -1; | ||||
|  | ||||
| 			case QSE_T('h'): | ||||
| 				print_usage (QSE_STDOUT, argc, argv); | ||||
| 				return 0; | ||||
|  | ||||
| 			case QSE_T('n'): | ||||
| 				g_option |= QSE_SED_QUIET; | ||||
| 				break; | ||||
|  | ||||
| 			case QSE_T('c'): | ||||
| 				g_option |= QSE_SED_CLASSIC; | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if (opt.ind < argc) g_script = argv[opt.ind++]; | ||||
| 	if (opt.ind < argc) g_infile = argv[opt.ind++]; | ||||
|  | ||||
| 	if (g_script == QSE_NULL) | ||||
| 	{ | ||||
| 		print_usage (QSE_STDERR, argc, argv); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int sed_main (int argc, qse_char_t* argv[]) | ||||
| { | ||||
| 	qse_sed_t* sed = QSE_NULL; | ||||
| 	int ret = -1; | ||||
|  | ||||
| 	if (argc != 2 && argc != 3) | ||||
| 	{ | ||||
| 		qse_fprintf (QSE_STDERR, QSE_T("usage: %s string [file]\n"), argv[0]); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	ret = handle_args (argc, argv); | ||||
| 	if (ret <= -1) return -1; | ||||
| 	if (ret == 0) return 0; | ||||
|  | ||||
| 	if (argc == 3) instream = argv[2]; | ||||
| 	ret = -1; | ||||
|  | ||||
| 	sed = qse_sed_open (QSE_NULL, 0); | ||||
| 	if (sed == QSE_NULL) | ||||
| @ -129,10 +183,9 @@ int sed_main (int argc, qse_char_t* argv[]) | ||||
| 		goto oops; | ||||
| 	} | ||||
| 	 | ||||
| 	//if (argc == 3) qse_sed_setoption (sed, qse_strtoi(argv[2])); | ||||
| 	qse_sed_setoption (sed, QSE_SED_QUIET); | ||||
| 	qse_sed_setoption (sed, g_option); | ||||
|  | ||||
| 	if (qse_sed_comp (sed, argv[1], qse_strlen(argv[1])) == -1) | ||||
| 	if (qse_sed_comp (sed, g_script, qse_strlen(g_script)) == -1) | ||||
| 	{ | ||||
| 		qse_size_t errlin = qse_sed_geterrlin(sed); | ||||
| 		if (errlin > 0) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user