[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.