[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Yet another cost patch



	Граждане, 
	
	у cost есть один заметный недостаток -- работает только с одним 
документом. Поскольку я собирюсь использовать external pointers (<xptr> в 
TEI, например), cost был слегка похачен на эту тему. Добавлены две новые 
команды:

	savestream
		Сохраняет текущий документ за углом, возвращая handle.

	setstream <handle>
		Делает текущим документ, соответствующий <handle>.

	Желающие это использовать приветствуются потестировать. Патч 
прилагается.
--- tclcost.c~	Tue Jan 27 13:57:39 1998
+++ tclcost.c	Tue Jun 16 13:58:46 1998
@@ -86,6 +86,46 @@
     }
 }
 
+#define MAX_DOCUMENTS 100
+static struct {
+	ESISStream doc;
+	ESISNode node;
+} activeDocs[ MAX_DOCUMENTS ];
+static int docsCounter = 0;
+
+static CMDPROC(CostSaveStreamProc)
+{
+	if ( !current_document || docsCounter == MAX_DOCUMENTS )
+		return TCL_ERROR;
+	
+	activeDocs[ docsCounter ].doc = current_document;
+	activeDocs[ docsCounter ].node = current_node;
+
+	{
+		char nn[ 10 ];
+		sprintf( nn, "esis%d", docsCounter );
+		Tcl_AppendResult( interp, nn, NULL );
+	}
+
+	++docsCounter;
+	current_document = NULL;	/* Now next "load" won't clear the data */
+	return TCL_OK;
+}
+
+static CMDPROC(CostSetStreamProc)
+{
+	int idx = -1;
+
+	CHECKNARGS( 1, "streamhandle" );
+	
+	if ( sscanf( argv[ 1 ], "esis%d", &idx ) != 1
+		 || idx >= docsCounter )
+		return TCL_ERROR;
+	current_document = activeDocs[ idx ].doc;
+	current_node = activeDocs[ idx ].node;
+	return TCL_OK;
+}
+
 static CQStatus CostQueryContinuation(
 	ESISNode nd, const char *value, void *closure)
 {
@@ -692,6 +732,12 @@
     Tcl_CreateCommand(interp, "substitution", 	DefineSubstProc,NULL,NULL);
     Tcl_CreateCommand(interp, "environment",
 		DefineEnvironmentProc,NULL,NULL);
+
+	/* BT's extensions: */
+	Tcl_CreateCommand(interp, "savestream", CostSaveStreamProc, NULL,
+					  NULL);
+	Tcl_CreateCommand(interp, "setstream", CostSetStreamProc, NULL,
+					  NULL );
 
     /*
      * Load startup file:
	Best regards, -- Boris.