<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TIP SYSTEM "http://tcl.activestate.com/cgi-bin/tct/tip/tipxml.dtd">
<!-- Converted at Thu Feb 09 12:03:03 GMT 2012 -->
<!-- TIP AutoGenerator - written by Donal K. Fellows -->

<TIP number='60'>
<header><title>EXTERN Macro Change to Support a Wider Set of Attributes</title><author address="mailto:davygrvy@pobox.com">David Gravereaux</author><author address="mailto:fellowsd@cs.man.ac.uk">Donal K. Fellows</author><status type='project' state='rejected' tclversion="8.6" vote='after'>$Revision: 1.21 $</status><history></history><created day='6' month='sep' year='2001' /></header>
<abstract>This TIP proposes a change to how the EXTERN macro in <emph style="italic">tcl.h</emph> works to support a wider range of compiler specific attributes.</abstract>
<body><section title="Rationale">
<para>With working on Borland support recently, I found that luckily the newest &quot;free commandline tools&quot; [<url ref="http://www.borland.com/bcppbuilder/freecompiler/"/>] does support Microsoft&apos;s <emph style="italic">__declspec(dllexport)</emph> attribute. But at the same time, the older way with <emph style="italic">__export</emph> is still valid, but can&apos;t be used due to the order within the prototype declaration of the EXTERN macro.</para>
<para>What&apos;s this with the MS compiler:</para>
<verbatim><vline encoding='base64'>CV9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsIGludCBmdW5jIChpbnQgYSwgaW50IGIpOw==</vline></verbatim>
<para>will have to be this with Borland:</para>
<verbatim><vline encoding='base64'>CWludCBfX2V4cG9ydCBfX2NkZWNsIGZ1bmMgKGludCBhLCBpbnQgYik7</vline></verbatim>
<para>The order of the attribute needs to be after the return type.</para>
<para>Even though <emph style="italic">__declspec</emph> is supported in the Microsoft style with version 5.5+ of the Borland compiler, if EXTERN could swap around the order a hair, old Turbo C v5.0 has a better chance to make a DOS library. Should someone feel the need.</para>
<para>Let&apos;s leave the existing EXTERN macro as-is and just make a new one called TCL_EXTERN to support the new behavior.</para>
<para>Karl Lembuaer (sp?) did a presentation @ OSCON regarding his recent tinytcl project <emph style="italic">%TODO: add link here%</emph> about his DOS port of Tcl 6.7 for use in a hand-held device.</para>
<para>Stepping backward for DOS support, may actually be a leap forward in an off-beat manner...</para>
</section>
<section title="Rejected Alternatives">
<para>I saw something like this in a very old DDE extension that someone at Sun wrote. It was used as an example windows extension for years.</para>
<para><url ref="ftp://tcl.activestate.com/pub/tcl/misc/example.zip"/></para>
<para>In example.h is this:</para>
<verbatim><vline encoding='base64'>I2lmIGRlZmluZWQoX19XSU4zMl9fKQ==</vline><vline encoding='base64'>IyAgIGlmIGRlZmluZWQoX01TQ19WRVIp</vline><vline encoding='base64'>IwlkZWZpbmUgRVhQT1JUKGEsYikgX19kZWNsc3BlYyhkbGxleHBvcnQpIGEgYg==</vline><vline encoding='base64'>IyAgIGVsc2U=</vline><vline encoding='base64'>IwlpZiBkZWZpbmVkKF9fQk9STEFORENfXyk=</vline><vline encoding='base64'>IwkgICAgZGVmaW5lIEVYUE9SVChhLGIpIGEgX2V4cG9ydCBi</vline><vline encoding='base64'>IwllbHNl</vline><vline encoding='base64'>IwkgICAgZGVmaW5lIEVYUE9SVChhLGIpIGEgYg==</vline><vline encoding='base64'>IwllbmRpZg==</vline><vline encoding='base64'>IyAgIGVuZGlm</vline><vline encoding='base64'>I2Vsc2U=</vline><vline encoding='base64'>IyAgIGRlZmluZSBFWFBPUlQoYSxiKSBhIGI=</vline><vline encoding='base64'>I2VuZGlm</vline><vline encoding='base64'></vline><vline encoding='base64'>RVhURVJOIEVYUE9SVChpbnQsRXhhbXBsZV9Jbml0KSBfQU5TSV9BUkdTXygoVGNsX0ludGVycCAqaW50ZXJwKSk7</vline></verbatim>
<para>That work is doing the same job, but I prefer the method that I&apos;m proposing.</para>
<para>It is also mentioned on <url ref="http://tcl.activestate.com/doc/howto/winext.html"/> and feel it is rather out-of-date and the order issue with <emph style="italic">__export</emph> should be brought into the core with this patch and be fix for good.</para>
<para>Is&gt;</para>
<verbatim><vline encoding='base64'>CUVYVEVSTiBpbnQgRm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk7</vline></verbatim>
<para>Proposed&gt;</para>
<verbatim><vline encoding='base64'>CVRDTF9FWFRFUk4oaW50KSBGb29iYXJfSW5pdCAoVGNsX0ludGVycCAqaW50ZXJwKTs=</vline></verbatim>
</section>
<section title="Reference Implementation">
<para><url ref="https://sourceforge.net/tracker/download.php?group_id=10894&amp;atid=310894&amp;file_id=70480&amp;aid=436116"/></para>
</section>
<section title="Examples">
<para>Is:</para>
<verbatim><vline encoding='base64'>RVhURVJOIGludA==</vline><vline encoding='base64'>Rm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'>I2lmZGVmIFVTRV9UQ0xfU1RVQlM=</vline><vline encoding='base64'>ICAgIGlmIChUY2xfSW5pdFN0dWJzKGludGVycCwgIjguMSIsIDApID09IE5VTEwpIHs=</vline><vline encoding='base64'>ICAgICAgICByZXR1cm4gVENMX0VSUk9SOw==</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>I2VuZGlm</vline><vline encoding='base64'>ICAgIFRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgImZvb2JhciIsIEZvb0JhciwgTlVMTCwgTlVMTCk7</vline><vline encoding='base64'>ICAgIHJldHVybiBUQ0xfT0s7</vline><vline encoding='base64'>fTs=</vline></verbatim>
<para>Proposed:</para>
<verbatim><vline encoding='base64'>VENMX0VYVEVSTihpbnQp</vline><vline encoding='base64'>Rm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'>I2lmZGVmIFVTRV9UQ0xfU1RVQlM=</vline><vline encoding='base64'>ICAgIGlmIChUY2xfSW5pdFN0dWJzKGludGVycCwgIjguMSIsIDApID09IE5VTEwpIHs=</vline><vline encoding='base64'>ICAgICAgICByZXR1cm4gVENMX0VSUk9SOw==</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>I2VuZGlm</vline><vline encoding='base64'>ICAgIFRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgImZvb2JhciIsIEZvb0JhciwgTlVMTCwgTlVMTCk7</vline><vline encoding='base64'>ICAgIHJldHVybiBUQ0xfT0s7</vline><vline encoding='base64'>fTs=</vline></verbatim>
<para>Preprocessor output is the following:</para>
<quote>Borland:</quote>
<verbatim><vline encoding='base64'>LyogZm9vYmFyLmMgMTQ6ICovZXh0ZXJuICBpbnQgX19leHBvcnQ=</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMTU6ICovRm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk=</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMTY6ICovew==</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMTc6ICov</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMTg6ICovaWYgKFRjbF9Jbml0U3R1YnMoaW50ZXJwLCAiOC4xIiwgMCkgPT0gMCkgew==</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMTk6ICovcmV0dXJuIDE7</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMjA6ICovfQ==</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMjE6ICov</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMjI6ICovKHRjbFN0dWJzUHRyLT50Y2xfQ3JlYXRlT2JqQ29tbWFuZCkoaW50ZXJwLCAiZm9vYmFyIiwgRm9vQmFyLCAwLCAwKTs=</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMjM6ICovcmV0dXJuIDA7</vline><vline encoding='base64'>LyogZm9vYmFyLmMgMjQ6ICovfTs=</vline></verbatim>
<quote>VC++:</quote>
<verbatim><vline encoding='base64'>ZXh0ZXJuICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50</vline><vline encoding='base64'>Rm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIGlmIChUY2xfSW5pdFN0dWJzKGludGVycCwgIjguMSIsIDApID09ICgodm9pZCAqKTApKSB7</vline><vline encoding='base64'>ICAgICAgICByZXR1cm4gMTs=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>I2xpbmUgMjIgImZvb2Jhci5jIg==</vline><vline encoding='base64'>ICAgICh0Y2xTdHVic1B0ci0+dGNsX0NyZWF0ZU9iakNvbW1hbmQpKGludGVycCwgImZvb2JhciIsIEZvb0JhciwgKCh2b2lkICopMCksICgodm9pZCAqKTApKTs=</vline><vline encoding='base64'>ICAgIHJldHVybiAwOw==</vline><vline encoding='base64'>fTs=</vline></verbatim>
<quote>MinGW (native gcc on win):</quote>
<verbatim><vline encoding='base64'>ZXh0ZXJuICAgICAgIGludA==</vline><vline encoding='base64'>Rm9vYmFyX0luaXQgKFRjbF9JbnRlcnAgKmludGVycCk=</vline><vline encoding='base64'>ew==</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIGlmIChUY2xfSW5pdFN0dWJzKGludGVycCwgIjguMSIsIDApID09ICgodm9pZCAqKTApICkgew==</vline><vline encoding='base64'>ICAgICAgICByZXR1cm4gMSA7</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgICh0Y2xTdHVic1B0ci0+dGNsX0NyZWF0ZU9iakNvbW1hbmQpIChpbnRlcnAsICJmb29iYXIiLCBGb29CYXIsICgodm9pZCAqKTApICwgKCh2b2lkICopMCkgKTs=</vline><vline encoding='base64'>ICAgIHJldHVybiAwIDs=</vline><vline encoding='base64'>fTs=</vline></verbatim>
</section>
<section title="Random Notes">
<para>In <emph style="italic">tclInt.h</emph> starting around line 1916, are prototypes for the internal cmdprocs. I can&apos;t think of any reason why they should be exported. Also note the comment about line:1673, as it states:</para>
<verbatim><vline encoding='base64'>Lyo=</vline><vline encoding='base64'>ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t</vline><vline encoding='base64'>ICogUHJvY2VkdXJlcyBzaGFyZWQgYW1vbmcgVGNsIG1vZHVsZXMgYnV0IG5vdCB1c2VkIGJ5IHRoZSBvdXRzaWRl</vline><vline encoding='base64'>ICogd29ybGQ6</vline><vline encoding='base64'>ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t</vline><vline encoding='base64'>ICov</vline></verbatim>
<para>As the current EXTERN macro places &quot;&quot;everything&quot;&quot; exportable, the use of EXTERN following this comment in <emph style="italic">tclInt.h</emph> is contradictory. In place of EXTERN for this purpose I used the new TCL_EXTRNC in the reference implementation.</para>
</section>
<section title="Copyright">
<para>This document has been placed in the public domain.</para>
</section>
</body></TIP>

