Attachment "TIP 261 - Technical realization.rtf" to
ticket [1437008fff]
added by
dkf
2006-02-23 04:20:57.
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f37\froman\fcharset238\fprq2 Times New Roman CE;}{\f38\froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f40\froman\fcharset161\fprq2 Times New Roman Greek;}{\f41\froman\fcharset162\fprq2 Times New Roman Tur;}{\f42\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f43\froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f44\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f45\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f47\fswiss\fcharset238\fprq2 Arial CE;}{\f48\fswiss\fcharset204\fprq2 Arial Cyr;}{\f50\fswiss\fcharset161\fprq2 Arial Greek;}
{\f51\fswiss\fcharset162\fprq2 Arial Tur;}{\f52\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f53\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f54\fswiss\fcharset186\fprq2 Arial Baltic;}{\f55\fswiss\fcharset163\fprq2 Arial (Vietnamese);}
{\f57\fmodern\fcharset238\fprq1 Courier New CE;}{\f58\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f60\fmodern\fcharset161\fprq1 Courier New Greek;}{\f61\fmodern\fcharset162\fprq1 Courier New Tur;}{\f62\fmodern\fcharset177\fprq1 Courier New (Hebrew);}
{\f63\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f64\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f65\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 \snext0 \styrsid12070315 Normal;}{
\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \b\i\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 \styrsid12070315 heading 2;}{
\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \b\i\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 \styrsid12070315 heading 3;}{
\s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 \sbasedon0 \snext0 \styrsid12070315 heading 4;}{\*\cs10 \additive \ssemihidden
Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
\f2\fs20\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 \sbasedon0 \snext15 \styrsid12070315 Plain Text;}{\s16\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057
\sbasedon0 \snext16 \styrsid12070315 Body Text 2;}{\s17\ql \li0\ri0\sb120\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 \sbasedon0 \snext17 \styrsid12070315
header;}{\s18\ql \li0\ri0\sb120\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 \sbasedon0 \snext18 \styrsid12070315 footer;}{\*\cs19 \additive
\sbasedon10 \styrsid12070315 page number;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid67567617\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0
{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid38820139}{\list\listtemplateid67567617\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid1730497838}{\list\listtemplateid67567617\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid1758360749}{\list\listtemplateid67567617\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid2103066481}}{\*\listoverridetable{\listoverride\listid2103066481\listoverridecount0\ls1}
{\listoverride\listid38820139\listoverridecount0\ls2}{\listoverride\listid1758360749\listoverridecount0\ls3}{\listoverride\listid1730497838\listoverridecount0\ls4}}{\*\rsidtbl \rsid4733971\rsid12070315\rsid16601914}{\*\generator Microsoft Word 11.0.6502;}
{\info{\title 4}{\author Donal Fellows}{\operator Donal Fellows}{\creatim\yr2006\mo2\dy22\hr21\min11}{\revtim\yr2006\mo2\dy22\hr21\min16}{\version1}{\edmins4}{\nofpages5}{\nofwords1249}{\nofchars6878}{\nofcharsws9163}{\vern24579}}
\paperw11906\paperh16838\margl1152\margr1152\margt1417\margb1134 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1152\dgvorigin1417\dghshow1\dgvshow1
\jexpand\viewkind1\viewscale105\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel
\wrppunct\asianbrkrule\rsidroot12070315\newtblstyruls\nogrowautofit \fet0\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\header \pard\plain \s17\ql \li0\ri0\sb120\widctlpar\tqc\tx4820\tqr\tx9639\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
\f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 \'93}{\b\f2\insrsid12070315 namespace import}{\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 \'94 change\tab \tab }{\field{\*\fldinst {
\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 PAGE }}{\fldrslt {\cs19\lang1024\langfe1024\noproof\langnp2057\insrsid12070315 1}}}{\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 / }{\field{\*\fldinst {
\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 NUMPAGES }}{\fldrslt {\cs19\lang1024\langfe1024\noproof\langnp2057\insrsid12070315 5}}}{\lang2057\langfe2057\langnp2057\insrsid12070315
\par }}{\footer \pard\plain \s18\ql \li0\ri0\sb120\widctlpar\tqc\tx4536\tqr\tx9639\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\cs19\lang2057\langfe2057\langnp2057\insrsid12070315
[email protected]\tab \tab }{\field{\*\fldinst {\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 SAVEDATE \\@ "yyyy-MM-dd" \\* MERGEFORMAT }}{\fldrslt {\cs19\lang1024\langfe1024\noproof\insrsid2434487\charrsid2434487 2005-12-20}}}{
\cs19\lang2057\langfe2057\langnp2057\insrsid12070315 (last modified date)}{\insrsid12070315
\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain
\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12070315 \b\i\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315 4\tab Technical realization
\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12070315 \b\i\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315 4.1\tab
Variants in realizing this change of \'93namespace import\'94
\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid12070315 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 4.1.1
\tab imported commands as list/array inside the Namespace structure
\par }\pard\plain \s16\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315
On one hand it would be easy to install a new attribute in the Namespace structure, a list or an array of imported commands, similar to the array of exported ones.
\par }\pard\plain \s15\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f2\fs20\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315
This new attribute has to be maintained, so a "dynamic" list would perhabs the best. This could be done in a similar way like the function DoImport works with the }{\b\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 ImportRef}{
\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 attribute of the }{\b\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 Command}{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 structure.
\par To maintain this list the related functions creating, importing, renaming, and deleting commands must be extended to grow or to shrink this list of imported commands of the current namespace.
\par }\pard \s15\ql \li0\ri0\sb120\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 {\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 Those functions are:
\par {\pntext\pard\plain\s15 \f3\fs20\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s15\ql \fi-360\li360\ri0\sb120\keepn\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls3\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin360\itap0\pararsid12070315 {\b\lang2057\langfe2057\langnp2057\insrsid12070315 Tcl_ProcObjCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 (}{
\b\i\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 tclProc.c}{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 )\line deleting an imported command element from that list (if existing),
\par {\pntext\pard\plain\s15 \f3\fs20\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s15\ql \fi-360\li360\ri0\sb120\keepn\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls4\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin360\itap0\pararsid12070315 {\b\lang2057\langfe2057\langnp2057\insrsid12070315 Tcl_Import}{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 (}{
\b\i\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 tclNamesp.c}{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 )\line creating an imported command element in that list,
\par {\pntext\pard\plain\s15 \f3\fs20\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s15\ql \fi-360\li360\ri0\sb120\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls4\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin360\itap0\pararsid12070315 {\b\lang2057\langfe2057\langnp2057\insrsid12070315 TclRenameCommand }{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 (}{
\b\i\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 tclBasic.c}{\f1\fs22\lang2057\langfe2057\langnp2057\insrsid12070315 )\line deleting or changing an imported command element in that list
\par }\pard\plain \qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315
To get all imported commands of a namespace the "namespace\~import" command (}{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 NamespaceImportCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 function) would return a kind o
f string representation of the elements of the list of imported commands (list of command names).
\par }\pard \ql \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 The }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 ImportRef}{
\lang2057\langfe2057\langnp2057\insrsid12070315 structure could be reused as list of imported commands inside a namespace.
\par }\pard \qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 The runtime consumption would increase in }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315
Tcl_ProcObjCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 , }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Tcl_Import}{\lang2057\langfe2057\langnp2057\insrsid12070315 , }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 TclRenameCommand}
{\lang2057\langfe2057\langnp2057\insrsid12070315 , maintaining the list of imported commands.
\par Runtime consumption would be added to }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 NamespaceImportCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 .
\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid12070315 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 4.1.2
\tab the imported commands knowing to be imported
\par }\pard\plain \qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315
On the other hand it would be more easy to maintain and more centralized, if only the command knows itself, if it is imported or not. Than only the function importing a command (}{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 DoImport}{
\b\lang2057\langfe2057\langnp2057\insrsid12070315 }{\lang2057\langfe2057\langnp2057\insrsid12070315 in }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 tclNamespc.h}{\lang2057\langfe2057\langnp2057\insrsid12070315 ) would have to set a kind of flag.
\par If a command is redefined, deleted (by renaming) than the "flagged" }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command}{\lang2057\langfe2057\langnp2057\insrsid12070315 structure will be deleted, so no maintainer will be needed.
\par To get all imported commands of a namespace the "namespace\~import" command (}{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 NamespaceImportCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315
function) would have to loop over all namespace commands asking for the imported state, collecting the names of the imported ones in a list.
\par The runtime consumption would increase in }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 DoImport}{\lang2057\langfe2057\langnp2057\insrsid12070315 , flagging the imported, newly created commands.
\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid12070315 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 4.1.3
\tab the ways to signal a command was imported
\par }\pard\plain \s16\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315
The Command structure is the place to signal if a command was imported, but there are different ways to achieve this (sorted by memory consumption and the chance for future enhancements):
\par {\pntext\pard\plain\f3\fs22\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \qj \fi-360\li360\ri0\sb120\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0\pararsid12070315 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 insert a new flag bit for commands }{
\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 CMD_IS_IMPORTED}{\lang2057\langfe2057\langnp2057\insrsid12070315 to be used in the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 flags}{\lang2057\langfe2057\langnp2057\insrsid12070315
attribute of the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command}{\lang2057\langfe2057\langnp2057\insrsid12070315 structure
\par {\pntext\pard\plain\f3\fs22\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj \fi-360\li360\ri0\sb120\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 insert a "boolean" integer as a new attribute of the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command }{
\lang2057\langfe2057\langnp2057\insrsid12070315 structure
\par {\pntext\pard\plain\f3\fs22\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj \fi-360\li360\ri0\sb120\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 insert a }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Namespace}{\lang2057\langfe2057\langnp2057\insrsid12070315
pointer to the exporting namespace as a new attribute of the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command }{\lang2057\langfe2057\langnp2057\insrsid12070315 structure \endash just to point to the \'93source\'94 namespace
\par {\pntext\pard\plain\f3\fs22\insrsid12070315 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj \fi-360\li360\ri0\sb120\widctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnindent360\pnsp120\pnhang {\pntxtb \'b7}}
\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 insert a }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command}{\lang2057\langfe2057\langnp2057\insrsid12070315
pointer to the exported command as a new attribute of the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command }{\lang2057\langfe2057\langnp2057\insrsid12070315 structure \endash just to point to the \'93source\'94
command (unnecessary, because an imported command has this pointer in his }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 ClientData}{\lang2057\langfe2057\langnp2057\insrsid12070315
\par }\pard \qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315
None of the four possibilities costs much in implementing and even the first would do its job, without changing the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 Command}{\lang2057\langfe2057\langnp2057\insrsid12070315 structure at all, whi
ch is important to prevent changing the \'93fingerprint\'94 of this structure.
\par The introduction of a new command flag bit }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 CMD_IS_IMPORTED}{\lang2057\langfe2057\langnp2057\insrsid12070315 would add only a new define in }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315
tclInt.h}{\lang2057\langfe2057\langnp2057\insrsid12070315 , and the set of this flag in the }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 DoImport}{\lang2057\langfe2057\langnp2057\insrsid12070315 function.
\par }\pard\plain \s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12070315 \b\i\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315 4.2\tab Realization of the "}{
\i0\f2\insrsid12070315 namespace import}{\insrsid12070315 " command
\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid12070315 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 4.2.1
\tab changes in }{\i\lang2057\langfe2057\langnp2057\insrsid12070315 tclInt.h}{\lang2057\langfe2057\langnp2057\insrsid12070315
\par }\pard\plain \s16\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12070315
Add the command flag bit right behind the definition of the Command structure and the two already exiting command flags.
\par
\par }\pard\plain \s15\ql \li708\ri0\keep\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin708\itap0\pararsid12070315 \f2\fs20\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 /*\line
* Flag bits for commands. \line *\line * CMD_IS_DELETED -\tab \tab Means that the command is in the process\line *\tab \tab \tab \tab of being deleted (its deleteProc is\line *\tab \tab \tab \tab currently executing). Other attempts to\line *\tab
\tab \tab \tab delete the command should be ignored.\line * CMD_TRACE_ACTIVE -\tab \tab 1 means that trace processing is currently\line *\tab \tab \tab \tab underway for a rename/delete change.\line *\tab \tab \tab \tab See
the two flags below for which is\line *\tab \tab \tab \tab currently being processed.\line * CMD_HAS_EXEC_TRACES -\tab 1 means that this command has at least\line *\tab \tab \tab \tab one execution trace (as opposed to simple\line *\tab \tab \tab
\tab delete/rename traces) in its tracePtr list.\line * CMD_IS_IMPORT -\tab \tab 1 means that this command was imported\line * TCL_TRACE_RENAME -\tab \tab A rename trace is in progress. Further\line *\tab \tab \tab \tab
recursive renames will not be traced.\line * TCL_TRACE_DELETE -\tab \tab A delete trace is in progress. Further \line *\tab \tab \tab \tab recursive deletes will not be traced.\line * (these last two flags are defined in tcl.h)\line */\line
#define CMD_IS_DELETED\tab \tab 0x1\line #define CMD_TRACE_ACTIVE\tab 0x2\line #define CMD_HAS_EXEC_TRACES\tab 0x4\line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 #define CMD_IS_IMPORTED\tab \tab 0x8}{
\lang2057\langfe2057\langnp2057\insrsid12070315
\par }\pard\plain \s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\itap0\pararsid12070315 \b\f1\fs24\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 4.2.2
\tab changes in }{\i\lang2057\langfe2057\langnp2057\insrsid12070315 tclNamesp.c}{\lang2057\langfe2057\langnp2057\insrsid12070315
\par }\pard\plain \s17\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 The function }{
\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 DoImport}{\lang2057\langfe2057\langnp2057\insrsid12070315 has to be modified right behind creating the new imported command with }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315
Tcl_CreateObjCommand}{\lang2057\langfe2057\langnp2057\insrsid12070315 :
\par }\pard\plain \s15\ql \li708\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin708\itap0\pararsid12070315 \f2\fs20\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 dataPtr\tab
= (ImportedCmdData *) ckalloc(sizeof(ImportedCmdData));
\par }\pard \s15\ql \li709\ri0\keep\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin709\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 importedCmd\tab = Tcl_CreateObjCommand(interp, \tab \tab
Tcl_DStringValue(&ds), InvokeImportedCmd,\line \tab (ClientData) dataPtr, DeleteImportedCmd);
\par }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 importedCmdPtr\tab \tab = (Command *) importedCmd;\line importedCmdPtr->flags\tab |= CMD_IS_IMPORTED;
\par }{\lang2057\langfe2057\langnp2057\insrsid12070315 dataPtr->realCmdPtr\tab = cmdPtr;
\par dataPtr->selfPtr\tab \tab = (Command *) importedCmd;
\par }\pard\plain \s17\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315 The function }{
\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 NamespaceImportCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 to react on having on arguments with return a list of imported commands. The new syntax would be:
\par }\pard \s17\qj \li708\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin708\itap0\pararsid12070315 {\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 namespace import ?-origins | ?-force? pattern ?pattern ...??
\par }\pard \s17\qj \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 The command \'93}{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 namespace import}{
\lang2057\langfe2057\langnp2057\insrsid12070315 \'94 would return a list of absolute command names.
\par The option \'93}{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 -origin}{\lang2057\langfe2057\langnp2057\insrsid12070315 \'94 would change the result list. Instead of the absolute command names the origin
s would be returned. The origins of the imported commands would be queryied with the function }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 TclGetOriginalCommand}{\lang2057\langfe2057\langnp2057\insrsid12070315 .
\par Here the changes in the function }{\b\f2\lang2057\langfe2057\langnp2057\insrsid12070315 NamespaceImportCmd}{\lang2057\langfe2057\langnp2057\insrsid12070315 :
\par }\pard\plain \s15\ql \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12070315 \f2\fs20\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\lang2057\langfe2057\langnp2057\insrsid12070315
\par }\pard \s15\ql \li708\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin708\itap0\pararsid12070315 {\lang2057\langfe2057\langnp2057\insrsid12070315 static int\line NamespaceImportCmd(dummy, interp, objc, objv)\line ClientData dummy;\tab \tab
/* Not used. */\line Tcl_Interp *interp;\tab \tab /* Current interpreter. */\line int objc;\tab \tab \tab /* Number of arguments. */\line Tcl_Obj *CONST objv[];\tab /* Argument objects. */\line \{\line register int i = 0,
\line result = TCL_OK;\line int allowOverwrite = 0,\line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 returnOrigins = 0,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315
firstArg = 2;\line char *string = (char *) NULL,\line *pattern = (char *) NULL;\line }{\b\i\insrsid12070315 Namespace *currNsPtr = (Namespace*) NULL;\line
Command *command = (Command *) NULL;\line Tcl_HashSearch search;\line Tcl_HashEntry *hPtr = (Tcl_HashEntry *) NULL;\line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315
Tcl_Obj *importedList = (Tcl_Obj *) NULL;\line *cmdNameObj = (Tcl_Obj *) NULL;\line }{\b\i\insrsid12070315 Tcl_Command token;\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 \line if (objc < 2) \{\line
\tab Tcl_WrongNumArgs(\line interp,\line 2, objv,\line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315
"?-origins | ?-force? pattern ?pattern...??"\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 );\line \tab return TCL_ERROR;\line \}\line \line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 /*\line
* Detect the optional arguments "-force" and "-origins"\line * as the first argument.\line */\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 if (firstArg < objc) \{\line \tab string = TclGetString(objv[firstArg]);\line }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \tab if (*string == '-') \{\line if (strcmp(string, "-force") == 0) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315
if ( objc <= 3 ) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \tab Tcl_WrongNumArgs(\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 interp,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 3, objv,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315
}{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 NULL\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 );\line \tab }{\lang2057\langfe2057\langnp2057\insrsid12070315
}{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 return TCL_ERROR;\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \}\line \line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 \tab allowOverwrite = 1;\line firstArg++;\line }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \} elseif (strcmp(string, "-origins") == 0) \{\line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 if ( objc != 3 ) \{\line \tab }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315
Tcl_WrongNumArgs(\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 interp,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 3, objv,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 NULL\line }{\lang2057\langfe2057\langnp2057\insrsid12070315
}{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 );\line \tab }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 return TCL_ERROR;\line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \}\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 returnOrigins = 1;
\line \tab \} else \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 Tcl_ResetResult( interp );\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 Tcl_SetAppendResult(\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 interp,\line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 "bad option \\"",\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 string,
\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 "\\": must be \endash force, -origins, or omitted"\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 );\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 return TCL_ERROR;\line }{\lang2057\langfe2057\langnp2057\insrsid12070315
}{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \}\line \tab \}\line \}\line \line if ((objc == 2) ||\line ((objc == 3) && (returnOrigins == 1) \{\line /* get the current namespace and the first command of this\line
* namespace\line */\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 currNsPtr = (Namespace*) Tcl_GetCurrentNamespace(interp)}{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 \line }{
\b\i\insrsid12070315 \tab hPtr = Tcl_FirstHashEntry(currNsPtr->cmdTable, &search);\line \line /* initialize the list of imported commands\line */\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 importedList = Tcl_NewObj();\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 /* loop over the commands of the current namespace
\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 * to test if they are imported and than, if so,\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 * to get their absolute (original) names\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\lang2057\langfe2057\langnp2057\insrsid12070315 */\line }{\b\i\insrsid12070315 \tab
for (; hPtr!= NULL ; hPtr=Tcl_NextHashEntry(&search)) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 token = (Tcl_Command) Tcl_GetHashValue(hPtr);\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }
{\b\i\insrsid12070315 command = (Command *) token;\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 if (command->flags & CMD_IS_IMPORTED) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\insrsid12070315 if (returnOrigins == 1) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 /* get the origin of the imported namespace command\line }{\lang2057\langfe2057\langnp2057\insrsid12070315
}{\b\i\insrsid12070315 */\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 token = TclGetOriginalCommand(token);\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 \}
\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 /* get the absolute/full name of the imported\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 * namespace command\line
}{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 */\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 cmdNameObj = Tcl_NewObj();\line \line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 Tcl_GetCommandFullName(interp, token, cmdNameObj);\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315
result = Tcl_ListObjAppendElement(\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 interp, importedList, cmdNameObj\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 );\line
\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 if (result == TCL_ERROR) \{\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 Tcl_DecrRefCount( importedList );\line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 return TCL_ERROR;\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 \}\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{
\b\i\insrsid12070315 \}\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 \}\line \line }{\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 Tcl_SetObjResult(interp, importedList);\line }{
\lang2057\langfe2057\langnp2057\insrsid12070315 }{\b\i\insrsid12070315 return TCL_OK;\line \}\line }{\lang2057\langfe2057\langnp2057\insrsid12070315 \line /* from here on the rest of NamespaceImportCmd */\line \}\line
\par }\pard\plain \ql \li0\ri0\sb120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs22\lang1031\langfe2057\cgrid\langnp1031\langfenp2057 {\insrsid16601914
\par }}