enhanced Awk classes
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Awk.cpp 224 2009-07-07 13:05:10Z hyunghwan.chung $ | ||||
|  * $Id: Awk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -226,8 +226,8 @@ void Awk::Argument::clear () | ||||
| 	{ | ||||
| 		/* case 1. not initialized. | ||||
| 		 * case 2. initialized with the second init. | ||||
| 		 * none of the cases creates a new string so the sttring | ||||
| 		 * that str.ptr is pointing at doesn't have to be freed */ | ||||
| 		 * none of the cases. create a new string so the sttring | ||||
| 		 * that str.ptr is pointing to doesn't have to be freed */ | ||||
| 		this->str.ptr = QSE_NULL; | ||||
| 		this->str.len = 0; | ||||
| 	} | ||||
| @ -918,7 +918,7 @@ Awk::Run::Run (Awk* awk): awk (awk), rtx (QSE_NULL) | ||||
| { | ||||
| } | ||||
|  | ||||
| Awk::Run::Run (Awk* awk, rtx_t* rtx): awk (awk), rtx (rtx), data (QSE_NULL) | ||||
| Awk::Run::Run (Awk* awk, rtx_t* rtx): awk (awk), rtx (rtx) | ||||
| { | ||||
| 	QSE_ASSERT (this->rtx != QSE_NULL); | ||||
| } | ||||
| @ -1062,23 +1062,14 @@ int Awk::Run::getGlobal (int id, Argument& gbl) const | ||||
| 	return gbl.init (qse_awk_rtx_getgbl (this->rtx, id)); | ||||
| } | ||||
|  | ||||
| void Awk::Run::setData (void* data) | ||||
| { | ||||
| 	this->data = data; | ||||
| } | ||||
|  | ||||
| void* Awk::Run::getData () const | ||||
| { | ||||
| 	return this->data; | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////// | ||||
| // Awk | ||||
| ////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| Awk::Awk () throw (): awk (QSE_NULL), functionMap (QSE_NULL), | ||||
| 	sourceIn (Source::READ), sourceOut (Source::WRITE), | ||||
| 	errnum (ERR_NOERR), errlin (0), runCallback (false) | ||||
| 	errnum (ERR_NOERR), errlin (0), runCallback (false),  | ||||
| 	runctx (this) | ||||
|  | ||||
| { | ||||
| 	this->errmsg[0] = QSE_T('\0'); | ||||
| @ -1238,6 +1229,7 @@ int Awk::open () | ||||
|  | ||||
| void Awk::close () | ||||
| { | ||||
| 	fini_runctx (); | ||||
| 	clearArguments (); | ||||
|  | ||||
| 	if (functionMap != QSE_NULL) | ||||
| @ -1337,31 +1329,34 @@ int Awk::unsetAllWords () | ||||
| 	return qse_awk_setword (awk, QSE_NULL, 0, QSE_NULL, 0); | ||||
| } | ||||
|  | ||||
| int Awk::parse () | ||||
| Awk::Run* Awk::parse () | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
|  | ||||
| 	qse_awk_sio_t sio; | ||||
| 	fini_runctx (); | ||||
|  | ||||
| 	qse_awk_sio_t sio; | ||||
| 	sio.in = sourceReader; | ||||
| 	sio.out = sourceWriter; | ||||
|  | ||||
| 	int n = qse_awk_parse (awk, &sio); | ||||
| 	if (n == -1) retrieveError (); | ||||
| 	return n; | ||||
| 	if (n <= -1)  | ||||
| 	{ | ||||
| 		retrieveError (); | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (init_runctx () <= -1) return QSE_NULL; | ||||
| 	return &runctx; | ||||
| } | ||||
|  | ||||
| int Awk::loop () | ||||
| int Awk::init_runctx () | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
| 	if (runctx.rtx != QSE_NULL) return 0; | ||||
|  | ||||
| 	qse_awk_rio_t rio; | ||||
| 	qse_awk_rcb_t rcb; | ||||
|  | ||||
| 	// note that the run field is set below after qse_awk_rtx_open() is | ||||
| 	// executed. | ||||
| 	Run runctx (this); | ||||
|  | ||||
| 	rio.pipe    = pipeHandler; | ||||
| 	rio.file    = fileHandler; | ||||
| 	rio.console = consoleHandler; | ||||
| @ -1374,29 +1369,75 @@ int Awk::loop () | ||||
| 		rcb.on_statement  = onStatement; | ||||
| 		rcb.udd           = &runctx; | ||||
| 	} | ||||
| 	 | ||||
| 	int n = 0; | ||||
|  | ||||
| 	rtx_t* rtx = qse_awk_rtx_open ( | ||||
| 		awk, QSE_SIZEOF(rxtn_t), &rio, (qse_cstr_t*)runarg.ptr); | ||||
| 	if (rtx == QSE_NULL)  | ||||
| 	{ | ||||
| 		retrieveError(); | ||||
| 		n = -1; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	else | ||||
|  | ||||
| 	runctx.rtx = rtx; | ||||
|  | ||||
| 	rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); | ||||
| 	rxtn->run = &runctx; | ||||
|  | ||||
| 	if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void Awk::fini_runctx () | ||||
| { | ||||
| 	if (runctx.rtx != QSE_NULL) | ||||
| 	{ | ||||
| 		runctx.rtx = rtx; | ||||
| 		qse_awk_rtx_close (runctx.rtx); | ||||
| 		runctx.rtx = QSE_NULL; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| 		rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); | ||||
| 		rxtn->run = &runctx; | ||||
| int Awk::loop () | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
| 	QSE_ASSERT (runctx.rtx != QSE_NULL); | ||||
|  | ||||
| 		if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb); | ||||
| 		n = qse_awk_rtx_loop (rtx); | ||||
| 		if (n == -1) retrieveError (rtx); | ||||
| 		qse_awk_rtx_close (rtx); | ||||
| 	int n = qse_awk_rtx_loop (runctx.rtx); | ||||
| 	if (n <= -1) retrieveError (runctx.rtx); | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| int Awk::call (const char_t* name, const Return* args, size_t nargs) | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
| 	QSE_ASSERT (runctx.rtx != QSE_NULL); | ||||
|  | ||||
| 	val_t** ptr = QSE_NULL; | ||||
|  | ||||
| 	if (args != QSE_NULL) | ||||
| 	{ | ||||
| 		ptr = (val_t**) qse_awk_alloc (awk, QSE_SIZEOF(val_t*) * nargs); | ||||
| 		if (ptr == QSE_NULL) | ||||
| 		{ | ||||
| 			runctx.setError (ERR_NOMEM); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		for (size_t i = 0; i < nargs; i++) ptr[i] = args[i].val; | ||||
| 	} | ||||
|  | ||||
| 	return n; | ||||
| 	val_t* ret = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs); | ||||
|  | ||||
| 	if (ptr != QSE_NULL) qse_awk_free (awk, ptr); | ||||
|  | ||||
| 	if (ret == QSE_NULL)  | ||||
| 	{ | ||||
| 		retrieveError (runctx.rtx); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| // TODO: how can i store it??? | ||||
| 	qse_awk_rtx_refdownval (runctx.rtx, ret); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void Awk::stop () | ||||
| @ -1410,8 +1451,6 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len) | ||||
| 	pair_t* pair; | ||||
| 	awk_t* awk = run->awk->awk; | ||||
|  | ||||
| 	//awk = qse_awk_rtx_getawk (run); | ||||
|  | ||||
| 	pair = qse_map_search (functionMap, name, len); | ||||
| 	if (pair == QSE_NULL)  | ||||
| 	{ | ||||
| @ -1495,9 +1534,11 @@ void Awk::xstrs_t::clear (awk_t* awk) | ||||
| { | ||||
| 	if (this->ptr != QSE_NULL) | ||||
| 	{ | ||||
| 		while (this->len > 0) | ||||
| 			qse_awk_free (awk, this->ptr[--this->len].ptr); | ||||
|  | ||||
| 		qse_awk_free (awk, this->ptr); | ||||
| 		this->ptr = QSE_NULL; | ||||
| 		this->len = 0; | ||||
| 		this->capa = 0; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: StdAwk.cpp 224 2009-07-07 13:05:10Z hyunghwan.chung $ | ||||
|  * $Id: StdAwk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -480,8 +480,10 @@ int StdAwk::open_console_in (Console& io) | ||||
| 		map = ((qse_awk_val_map_t*)argv)->map; | ||||
| 		QSE_ASSERT (map != QSE_NULL); | ||||
| 		 | ||||
| 		// ok to find ARGV[runarg_index] as ARGV[0] | ||||
| 		// has been skipped. | ||||
| 		ibuflen = qse_awk_longtostr ( | ||||
| 			rtx->awk, runarg_index + 1,  | ||||
| 			rtx->awk, runarg_index,  | ||||
| 			10, QSE_NULL, | ||||
| 			ibuf, QSE_COUNTOF(ibuf) | ||||
| 		); | ||||
| @ -622,6 +624,11 @@ int StdAwk::openConsole (Console& io) | ||||
| 	{ | ||||
| 		runarg_count = 0; | ||||
| 		runarg_index = 0; | ||||
| 		if (runarg.len > 0)  | ||||
| 		{ | ||||
| 			// skip ARGV[0] | ||||
| 			runarg_index++; | ||||
| 		} | ||||
| 		return open_console_in (io); | ||||
| 	} | ||||
| 	else | ||||
|  | ||||
		Reference in New Issue
	
	Block a user