Files
modules/xref/utility.c.src.html
2006-01-18 05:27:50 +00:00

2914 lines
170 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- This HTML file generated by cxref (version 1.6a). -->
<!-- cxref program (c) Andrew M. Bishop 1995,96,97,98,99,2000,01,02,03,04,05. -->
<!--
Cxref: cxref -block-comments -verbatim-comments -xref-all -index-all -html-src -Oxref utility.c
CPP : cxref-cpp -lang-c -C -dD -dI
-->
<HTML>
<HEAD>
<TITLE>Source File utility.c</TITLE>
<LINK rel="stylesheet" href="cxref.css" type="text/css">
</HEAD>
<BODY>
<pre>
<a name="line1">1 |</a> /*****
<a name="line2">2 |</a> ** ** Module Header ******************************************************* **
<a name="line3">3 |</a> ** **
<a name="line4">4 |</a> ** Modules Revision 3.0 **
<a name="line5">5 |</a> ** Providing a flexible user environment **
<a name="line6">6 |</a> ** **
<a name="line7">7 |</a> ** File: utility.c **
<a name="line8">8 |</a> ** First Edition: 1991/10/23 **
<a name="line9">9 |</a> ** **
<a name="line10">10 |</a> ** Authors: John Furlan, jlf@behere.com **
<a name="line11">11 |</a> ** Jens Hamisch, jens@Strawberry.COM **
<a name="line12">12 |</a> ** **
<a name="line13">13 |</a> ** Description: General routines that are called throughout Modules **
<a name="line14">14 |</a> ** which are not necessarily specific to any single **
<a name="line15">15 |</a> ** block of functionality. **
<a name="line16">16 |</a> ** **
<a name="line17">17 |</a> ** Exports: store_hash_value **
<a name="line18">18 |</a> ** clear_hash_value **
<a name="line19">19 |</a> ** Delete_Global_Hash_Tables **
<a name="line20">20 |</a> ** Delete_Hash_Tables **
<a name="line21">21 |</a> ** Copy_Hash_Tables **
<a name="line22">22 |</a> ** Unwind_Modulefile_Changes **
<a name="line23">23 |</a> ** Output_Modulefile_Changes **
<a name="line24">24 |</a> ** IsLoaded_ExactMatch **
<a name="line25">25 |</a> ** IsLoaded **
<a name="line26">26 |</a> ** chk_marked_entry **
<a name="line27">27 |</a> ** set_marked_entry **
<a name="line28">28 |</a> ** Update_LoadedList **
<a name="line29">29 |</a> ** check_magic **
<a name="line30">30 |</a> ** cleanse_path **
<a name="line31">31 |</a> ** chk4spch **
<a name="line32">32 |</a> ** xdup **
<a name="line33">33 |</a> ** xgetenv **
<a name="line34">34 |</a> ** stringer **
<a name="line35">35 |</a> ** null_free **
<a name="line36">36 |</a> ** countTclHash **
<a name="line37">37 |</a> ** **
<a name="line38">38 |</a> ** strdup if not defined by the system libs. **
<a name="line39">39 |</a> ** strtok if not defined by the system libs. **
<a name="line40">40 |</a> ** **
<a name="line41">41 |</a> ** Notes: **
<a name="line42">42 |</a> ** **
<a name="line43">43 |</a> ** ************************************************************************ **
<a name="line44">44 |</a> ****/
<a name="line45">45 |</a>
<a name="line46">46 |</a> /** ** Copyright *********************************************************** **
<a name="line47">47 |</a> ** **
<a name="line48">48 |</a> ** Copyright 1991-1994 by John L. Furlan. **
<a name="line49">49 |</a> ** see LICENSE.GPL, which must be provided, for details **
<a name="line50">50 |</a> ** **
<a name="line51">51 |</a> ** ************************************************************************ **/
<a name="line52">52 |</a>
<a name="line53">53 |</a> static char Id[] = "@(#)$Id: utility.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
<a name="line54">54 |</a> static void *UseId[] = { &amp;UseId, Id };
<a name="line55">55 |</a>
<a name="line56">56 |</a> /** ************************************************************************ **/
<a name="line57">57 |</a> /** HEADERS **/
<a name="line58">58 |</a> /** ************************************************************************ **/
<a name="line59">59 |</a>
<a name="line60">60 |</a> #include "modules_def.h"
<a name="line61">61 |</a>
<a name="line62">62 |</a> /** ************************************************************************ **/
<a name="line63">63 |</a> /** LOCAL DATATYPES **/
<a name="line64">64 |</a> /** ************************************************************************ **/
<a name="line65">65 |</a>
<a name="line66">66 |</a> /** not applicable **/
<a name="line67">67 |</a>
<a name="line68">68 |</a> /** ************************************************************************ **/
<a name="line69">69 |</a> /** CONSTANTS **/
<a name="line70">70 |</a> /** ************************************************************************ **/
<a name="line71">71 |</a>
<a name="line72">72 |</a> /** not applicable **/
<a name="line73">73 |</a>
<a name="line74">74 |</a> /** ************************************************************************ **/
<a name="line75">75 |</a> /** MACROS **/
<a name="line76">76 |</a> /** ************************************************************************ **/
<a name="line77">77 |</a>
<a name="line78">78 |</a> /** not applicable **/
<a name="line79">79 |</a>
<a name="line80">80 |</a> /** ************************************************************************ **/
<a name="line81">81 |</a> /** LOCAL DATA **/
<a name="line82">82 |</a> /** ************************************************************************ **/
<a name="line83">83 |</a>
<a name="line84">84 |</a> static char module_name[] = "utility.c"; /** File name of this module **/
<a name="line85">85 |</a>
<a name="line86">86 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line87">87 |</a> static char _proc_store_hash_value[] = "store_hash_value";
<a name="line88">88 |</a> static char _proc_clear_hash_value[] = "clear_hash_value";
<a name="line89">89 |</a> static char _proc_Clear_Global_Hash_Tables[] = "Clear_Global_Hash_Tables";
<a name="line90">90 |</a> static char _proc_Delete_Global_Hash_Tables[] = "Delete_Global_Hash_Tables";
<a name="line91">91 |</a> static char _proc_Delete_Hash_Tables[] = "Delete_Hash_Tables";
<a name="line92">92 |</a> static char _proc_Copy_Hash_Tables[] = "Copy_Hash_Tables";
<a name="line93">93 |</a> static char _proc_Unwind_Modulefile_Changes[] = "Unwind_Modulefile_Changes";
<a name="line94">94 |</a> static char _proc_Output_Modulefile_Changes[] = "Output_Modulefile_Changes";
<a name="line95">95 |</a> static char _proc_Output_Modulefile_Aliases[] = "Output_Modulefile_Aliases";
<a name="line96">96 |</a> static char _proc_output_set_variable[] = "output_set_variable";
<a name="line97">97 |</a> static char _proc_output_unset_variable[] = "output_unset_variable";
<a name="line98">98 |</a> static char _proc_output_function[] = "output_function";
<a name="line99">99 |</a> static char _proc_output_set_alias[] = "output_set_alias";
<a name="line100">100 |</a> static char _proc_output_unset_alias[] = "output_unset_alias";
<a name="line101">101 |</a> static char _proc_getLMFILES[] = "getLMFILES";
<a name="line102">102 |</a> static char _proc___IsLoaded[] = "__IsLoaded";
<a name="line103">103 |</a> static char _proc_chk_marked_entry[] = "chk_marked_entry";
<a name="line104">104 |</a> static char _proc_set_marked_entry[] = "set_marked_entry";
<a name="line105">105 |</a> static char _proc_get_module_basename[] = "get_module_basename";
<a name="line106">106 |</a> static char _proc_Update_LoadedList[] = "Update_LoadedList";
<a name="line107">107 |</a> static char _proc_check_magic[] = "check_magic";
<a name="line108">108 |</a> static char _proc_cleanse_path[] = "cleanse_path";
<a name="line109">109 |</a> static char _proc_chop[] = "chop";
<a name="line110">110 |</a> #endif
<a name="line111">111 |</a>
<a name="line112">112 |</a> static FILE *aliasfile; /** Temporary file to write aliases **/
<a name="line113">113 |</a> static char *aliasfilename; /** Temporary file name **/
<a name="line114">114 |</a> static char alias_separator = ';'; /** Alias command separator **/
<a name="line115">115 |</a> static const int eval_alias = /** EVAL_ALIAS macro **/
<a name="line116">116 |</a> #ifdef EVAL_ALIAS
<a name="line117">117 |</a> 1
<a name="line118">118 |</a> #else
<a name="line119">119 |</a> 0
<a name="line120">120 |</a> #endif
<a name="line121">121 |</a> ;
<a name="line122">122 |</a> static const int bourne_funcs = /** HAS_BOURNE_FUNCS macro **/
<a name="line123">123 |</a> #ifdef HAS_BOURNE_FUNCS
<a name="line124">124 |</a> 1
<a name="line125">125 |</a> #else
<a name="line126">126 |</a> 0
<a name="line127">127 |</a> #endif
<a name="line128">128 |</a> ;
<a name="line129">129 |</a> static const int bourne_alias = /** HAS_BOURNE_FUNCS macro **/
<a name="line130">130 |</a> #ifdef HAS_BOURNE_ALIAS
<a name="line131">131 |</a> 1
<a name="line132">132 |</a> #else
<a name="line133">133 |</a> 0
<a name="line134">134 |</a> #endif
<a name="line135">135 |</a> ;
<a name="line136">136 |</a>
<a name="line137">137 |</a> /** ************************************************************************ **/
<a name="line138">138 |</a> /** PROTOTYPES **/
<a name="line139">139 |</a> /** ************************************************************************ **/
<a name="line140">140 |</a>
<a name="line141">141 |</a> static void Clear_Global_Hash_Tables( void);
<a name="line142">142 |</a> static int Output_Modulefile_Aliases( Tcl_Interp *interp);
<a name="line143">143 |</a> static int output_set_variable( Tcl_Interp *interp, const char*,
<a name="line144">144 |</a> const char*);
<a name="line145">145 |</a> static int output_unset_variable( const char* var);
<a name="line146">146 |</a> static void output_function( const char*, const char*);
<a name="line147">147 |</a> static int output_set_alias( const char*, const char*);
<a name="line148">148 |</a> static int output_unset_alias( const char*, const char*);
<a name="line149">149 |</a> static int __IsLoaded( Tcl_Interp*, char*, char**, char*, int);
<a name="line150">150 |</a> static char *get_module_basename( char*);
<a name="line151">151 |</a> static char *chop( const char*);
<a name="line152">152 |</a> static void EscapeCshString(const char* in,
<a name="line153">153 |</a> char* out);
<a name="line154">154 |</a> static void EscapeShString(const char* in,
<a name="line155">155 |</a> char* out);
<a name="line156">156 |</a> static void EscapePerlString(const char* in,
<a name="line157">157 |</a> char* out);
<a name="line158">158 |</a>
<a name="line159">159 |</a>
<a name="line160">160 |</a> /*++++
<a name="line161">161 |</a> ** ** Function-Header ***************************************************** **
<a name="line162">162 |</a> ** **
<a name="line163">163 |</a> ** Function: store_hash_value **
<a name="line164">164 |</a> ** **
<a name="line165">165 |</a> ** Description: Keeps the old value of the variable around if it is **
<a name="line166">166 |</a> ** touched in the modulefile to enable undoing a **
<a name="line167">167 |</a> ** modulefile by resetting the evironment to it started.**
<a name="line168">168 |</a> ** **
<a name="line169">169 |</a> ** This is the same for unset_shell_variable() **
<a name="line170">170 |</a> ** **
<a name="line171">171 |</a> ** First Edition: 1992/10/14 **
<a name="line172">172 |</a> ** **
<a name="line173">173 |</a> ** Parameters: Tcl_HashTable *htable Hash table to be used**
<a name="line174">174 |</a> ** const char *key Attached key **
<a name="line175">175 |</a> ** const char *value Alias value **
<a name="line176">176 |</a> ** **
<a name="line177">177 |</a> ** Result: int TCL_OK Successfull completion **
<a name="line178">178 |</a> ** **
<a name="line179">179 |</a> ** Attached Globals: - **
<a name="line180">180 |</a> ** **
<a name="line181">181 |</a> ** ************************************************************************ **
<a name="line182">182 |</a> ++++*/
<a name="line183">183 |</a>
<a name="line184">184 |</a> int store_hash_value( Tcl_HashTable* htable,
<a name="line185">185 |</a> const char* key,
<a name="line186">186 |</a> const char* value)
<a name="line187">187 |</a> {
<a name="line188">188 |</a> int new; /** Return from Tcl_CreateHashEntry **/
<a name="line189">189 |</a> /** which indicates creation or ref- **/
<a name="line190">190 |</a> /** ference to an existing entry **/
<a name="line191">191 |</a> char *tmp; /** Temp pointer used for disalloc. **/
<a name="line192">192 |</a> Tcl_HashEntry *hentry; /** Hash entry reference **/
<a name="line193">193 |</a>
<a name="line194">194 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line195">195 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_store_hash_value, NULL);
<a name="line196">196 |</a> #endif
<a name="line197">197 |</a>
<a name="line198">198 |</a> /**
<a name="line199">199 |</a> ** Create a hash entry for the key to be stored. If there exists one
<a name="line200">200 |</a> ** so far, its value has to be unlinked.
<a name="line201">201 |</a> ** All values in this hash are pointers to allocated memory areas.
<a name="line202">202 |</a> **/
<a name="line203">203 |</a>
<a name="line204">204 |</a> hentry = Tcl_CreateHashEntry( htable, (char*) key, &amp;new);
<a name="line205">205 |</a> if( !new) {
<a name="line206">206 |</a> tmp = (char *) Tcl_GetHashValue( hentry);
<a name="line207">207 |</a> if( tmp)
<a name="line208">208 |</a> null_free((void *) &amp;tmp);
<a name="line209">209 |</a> }
<a name="line210">210 |</a>
<a name="line211">211 |</a> /**
<a name="line212">212 |</a> ** Set up the new value. strdup allocates!
<a name="line213">213 |</a> **/
<a name="line214">214 |</a>
<a name="line215">215 |</a> if( value)
<a name="line216">216 |</a> Tcl_SetHashValue( hentry, (char*) strdup((char*) value));
<a name="line217">217 |</a> else
<a name="line218">218 |</a> Tcl_SetHashValue( hentry, (char*) NULL);
<a name="line219">219 |</a>
<a name="line220">220 |</a> return( TCL_OK);
<a name="line221">221 |</a>
<a name="line222">222 |</a> } /** End of 'store_hash_value' **/
<a name="line223">223 |</a>
<a name="line224">224 |</a> /*++++
<a name="line225">225 |</a> ** ** Function-Header ***************************************************** **
<a name="line226">226 |</a> ** **
<a name="line227">227 |</a> ** Function: clear_hash_value **
<a name="line228">228 |</a> ** **
<a name="line229">229 |</a> ** Description: Remove the specified shell variable from the passed **
<a name="line230">230 |</a> ** hash table **
<a name="line231">231 |</a> ** **
<a name="line232">232 |</a> ** First Edition: 1991/10/23 **
<a name="line233">233 |</a> ** **
<a name="line234">234 |</a> ** Parameters: Tcl_HashTable *htable Hash table to be used**
<a name="line235">235 |</a> ** const char *key Attached key **
<a name="line236">236 |</a> ** **
<a name="line237">237 |</a> ** Result: int TCL_OK Successfull completion **
<a name="line238">238 |</a> ** **
<a name="line239">239 |</a> ** Attached Globals: - **
<a name="line240">240 |</a> ** **
<a name="line241">241 |</a> ** ************************************************************************ **
<a name="line242">242 |</a> ++++*/
<a name="line243">243 |</a>
<a name="line244">244 |</a> int clear_hash_value( Tcl_HashTable *htable,
<a name="line245">245 |</a> const char *key)
<a name="line246">246 |</a> {
<a name="line247">247 |</a> char *tmp; /** Temp pointer used for dealloc. **/
<a name="line248">248 |</a> Tcl_HashEntry *hentry; /** Hash entry reference **/
<a name="line249">249 |</a>
<a name="line250">250 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line251">251 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_clear_hash_value, NULL);
<a name="line252">252 |</a> #endif
<a name="line253">253 |</a>
<a name="line254">254 |</a> /**
<a name="line255">255 |</a> ** If I haven't already created an entry for keeping this environment
<a name="line256">256 |</a> ** variable's value, then just leave.
<a name="line257">257 |</a> ** Otherwise, remove this entry from the hash table.
<a name="line258">258 |</a> **/
<a name="line259">259 |</a>
<a name="line260">260 |</a> if( hentry = Tcl_FindHashEntry( htable, (char*) key) ) {
<a name="line261">261 |</a>
<a name="line262">262 |</a> tmp = (char*) Tcl_GetHashValue( hentry);
<a name="line263">263 |</a> if( tmp)
<a name="line264">264 |</a> null_free((void *) &amp;tmp);
<a name="line265">265 |</a>
<a name="line266">266 |</a> Tcl_DeleteHashEntry( hentry);
<a name="line267">267 |</a> }
<a name="line268">268 |</a>
<a name="line269">269 |</a> return( TCL_OK);
<a name="line270">270 |</a>
<a name="line271">271 |</a> } /** End of 'clear_hash_value' **/
<a name="line272">272 |</a>
<a name="line273">273 |</a> /*++++
<a name="line274">274 |</a> ** ** Function-Header ***************************************************** **
<a name="line275">275 |</a> ** **
<a name="line276">276 |</a> ** Function: Clear_Global_Hash_Tables **
<a name="line277">277 |</a> ** **
<a name="line278">278 |</a> ** Description: Deletes and reinitializes our env. hash tables. **
<a name="line279">279 |</a> ** **
<a name="line280">280 |</a> ** First Edition: 1992/10/14 **
<a name="line281">281 |</a> ** **
<a name="line282">282 |</a> ** Parameters: - **
<a name="line283">283 |</a> ** Result: - **
<a name="line284">284 |</a> ** **
<a name="line285">285 |</a> ** Attached Globals: setenvHashTable, **
<a name="line286">286 |</a> ** unsetenvHashTable, **
<a name="line287">287 |</a> ** aliasSetHashTable, **
<a name="line288">288 |</a> ** aliasUnsetHashTable **
<a name="line289">289 |</a> ** **
<a name="line290">290 |</a> ** ************************************************************************ **
<a name="line291">291 |</a> ++++*/
<a name="line292">292 |</a>
<a name="line293">293 |</a> static void Clear_Global_Hash_Tables( void)
<a name="line294">294 |</a> {
<a name="line295">295 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line296">296 |</a> Tcl_HashEntry *hashEntry; /** Result from Tcl hash search **/
<a name="line297">297 |</a> char *val = NULL; /** Stored value (is a pointer!) **/
<a name="line298">298 |</a>
<a name="line299">299 |</a> /**
<a name="line300">300 |</a> ** The following hash tables are to be initialized
<a name="line301">301 |</a> **/
<a name="line302">302 |</a>
<a name="line303">303 |</a> Tcl_HashTable *table[5],
<a name="line304">304 |</a> **table_ptr = table;
<a name="line305">305 |</a>
<a name="line306">306 |</a> table[0] = setenvHashTable;
<a name="line307">307 |</a> table[1] = unsetenvHashTable;
<a name="line308">308 |</a> table[2] = aliasSetHashTable;
<a name="line309">309 |</a> table[3] = aliasUnsetHashTable;
<a name="line310">310 |</a> table[4] = NULL;
<a name="line311">311 |</a>
<a name="line312">312 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line313">313 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Clear_Global_Hash_Tables, NULL);
<a name="line314">314 |</a> #endif
<a name="line315">315 |</a>
<a name="line316">316 |</a> /**
<a name="line317">317 |</a> ** Loop for all the hash tables named above. If there's no value stored
<a name="line318">318 |</a> ** in a hash table, skip to the next one.
<a name="line319">319 |</a> **/
<a name="line320">320 |</a>
<a name="line321">321 |</a> for( ; *table_ptr; table_ptr++) {
<a name="line322">322 |</a>
<a name="line323">323 |</a> if( ( hashEntry = Tcl_FirstHashEntry( *table_ptr, &amp;searchPtr)) == NULL)
<a name="line324">324 |</a> continue;
<a name="line325">325 |</a>
<a name="line326">326 |</a> /**
<a name="line327">327 |</a> ** Otherwise remove all values stored in the table
<a name="line328">328 |</a> **/
<a name="line329">329 |</a>
<a name="line330">330 |</a> do {
<a name="line331">331 |</a> val = (char*) Tcl_GetHashValue( hashEntry);
<a name="line332">332 |</a> if( val)
<a name="line333">333 |</a> null_free((void *) &amp;val);
<a name="line334">334 |</a> } while( hashEntry = Tcl_NextHashEntry( &amp;searchPtr));
<a name="line335">335 |</a>
<a name="line336">336 |</a> /**
<a name="line337">337 |</a> ** Reinitialize the hash table by unlocking it from memory and
<a name="line338">338 |</a> ** thereafter initializing it again.
<a name="line339">339 |</a> **/
<a name="line340">340 |</a>
<a name="line341">341 |</a> Tcl_DeleteHashTable( *table_ptr);
<a name="line342">342 |</a> Tcl_InitHashTable( *table_ptr, TCL_STRING_KEYS);
<a name="line343">343 |</a>
<a name="line344">344 |</a> } /** for **/
<a name="line345">345 |</a>
<a name="line346">346 |</a> } /** End of 'Clear_Global_Hash_Tables' **/
<a name="line347">347 |</a>
<a name="line348">348 |</a> /*++++
<a name="line349">349 |</a> ** ** Function-Header ***************************************************** **
<a name="line350">350 |</a> ** **
<a name="line351">351 |</a> ** Function: Delete_Global_Hash_Tables **
<a name="line352">352 |</a> ** Delete_Hash_Tables **
<a name="line353">353 |</a> ** **
<a name="line354">354 |</a> ** Description: Deletes our environment hash tables. **
<a name="line355">355 |</a> ** **
<a name="line356">356 |</a> ** First Edition: 1992/10/14 **
<a name="line357">357 |</a> ** **
<a name="line358">358 |</a> ** Parameters: Tcl_HashTable **table_ptr NULL-Terminated list **
<a name="line359">359 |</a> ** of hash tables to be **
<a name="line360">360 |</a> ** deleted **
<a name="line361">361 |</a> ** Result: - **
<a name="line362">362 |</a> ** **
<a name="line363">363 |</a> ** Attached Globals: setenvHashTable, **
<a name="line364">364 |</a> ** unsetenvHashTable, **
<a name="line365">365 |</a> ** aliasSetHashTable, **
<a name="line366">366 |</a> ** aliasUnsetHashTable **
<a name="line367">367 |</a> ** **
<a name="line368">368 |</a> ** ************************************************************************ **
<a name="line369">369 |</a> ++++*/
<a name="line370">370 |</a>
<a name="line371">371 |</a> void Delete_Global_Hash_Tables( void) {
<a name="line372">372 |</a>
<a name="line373">373 |</a> /**
<a name="line374">374 |</a> ** The following hash tables are to be initialized
<a name="line375">375 |</a> **/
<a name="line376">376 |</a>
<a name="line377">377 |</a> Tcl_HashTable *table[5];
<a name="line378">378 |</a>
<a name="line379">379 |</a> table[0] = setenvHashTable;
<a name="line380">380 |</a> table[1] = unsetenvHashTable;
<a name="line381">381 |</a> table[2] = aliasSetHashTable;
<a name="line382">382 |</a> table[3] = aliasUnsetHashTable;
<a name="line383">383 |</a> table[4] = NULL;
<a name="line384">384 |</a>
<a name="line385">385 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line386">386 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Delete_Global_Hash_Tables, NULL);
<a name="line387">387 |</a> #endif
<a name="line388">388 |</a>
<a name="line389">389 |</a> Delete_Hash_Tables( table);
<a name="line390">390 |</a>
<a name="line391">391 |</a> } /** End of 'Delete_Global_Hash_Tables' **/
<a name="line392">392 |</a>
<a name="line393">393 |</a> void Delete_Hash_Tables( Tcl_HashTable **table_ptr)
<a name="line394">394 |</a> {
<a name="line395">395 |</a>
<a name="line396">396 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line397">397 |</a> Tcl_HashEntry *hashEntry; /** Result from Tcl hash search **/
<a name="line398">398 |</a> char *val = NULL; /** Stored value (is a pointer!) **/
<a name="line399">399 |</a>
<a name="line400">400 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line401">401 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Delete_Hash_Tables, NULL);
<a name="line402">402 |</a> #endif
<a name="line403">403 |</a>
<a name="line404">404 |</a> /**
<a name="line405">405 |</a> ** Loop for all the hash tables named above. Remove all values stored in
<a name="line406">406 |</a> ** the table and then free up the whole table
<a name="line407">407 |</a> **/
<a name="line408">408 |</a> for( ; *table_ptr; table_ptr++) {
<a name="line409">409 |</a>
<a name="line410">410 |</a> if( ( hashEntry = Tcl_FirstHashEntry( *table_ptr, &amp;searchPtr))) {
<a name="line411">411 |</a>
<a name="line412">412 |</a> /**
<a name="line413">413 |</a> ** Remove all values stored in the table
<a name="line414">414 |</a> **/
<a name="line415">415 |</a> do {
<a name="line416">416 |</a> val = (char*) Tcl_GetHashValue( hashEntry);
<a name="line417">417 |</a> if( val)
<a name="line418">418 |</a> null_free((void *) &amp;val);
<a name="line419">419 |</a> } while( hashEntry = Tcl_NextHashEntry( &amp;searchPtr));
<a name="line420">420 |</a>
<a name="line421">421 |</a> /**
<a name="line422">422 |</a> ** Remove internal hash control structures
<a name="line423">423 |</a> **/
<a name="line424">424 |</a> Tcl_DeleteHashTable( *table_ptr);
<a name="line425">425 |</a> }
<a name="line426">426 |</a>
<a name="line427">427 |</a> null_free((void *) table_ptr);
<a name="line428">428 |</a>
<a name="line429">429 |</a> } /** for **/
<a name="line430">430 |</a>
<a name="line431">431 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line432">432 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_Delete_Hash_Tables, NULL);
<a name="line433">433 |</a> #endif
<a name="line434">434 |</a>
<a name="line435">435 |</a> } /** End of 'Delete_Hash_Tables' **/
<a name="line436">436 |</a>
<a name="line437">437 |</a> /*++++
<a name="line438">438 |</a> ** ** Function-Header ***************************************************** **
<a name="line439">439 |</a> ** **
<a name="line440">440 |</a> ** Function: Copy_Hash_Tables **
<a name="line441">441 |</a> ** **
<a name="line442">442 |</a> ** Description: Allocate new hash tables for the global environment, **
<a name="line443">443 |</a> ** initialize them and copy the contents of the current **
<a name="line444">444 |</a> ** tables into them. **
<a name="line445">445 |</a> ** **
<a name="line446">446 |</a> ** First Edition: 1991/10/23 **
<a name="line447">447 |</a> ** **
<a name="line448">448 |</a> ** Parameters: - **
<a name="line449">449 |</a> ** Result: Tcl_HashTable** Pointer to the new list of **
<a name="line450">450 |</a> ** hash tables **
<a name="line451">451 |</a> ** Attached Globals: setenvHashTable, **
<a name="line452">452 |</a> ** unsetenvHashTable, **
<a name="line453">453 |</a> ** aliasSetHashTable, **
<a name="line454">454 |</a> ** aliasUnsetHashTable **
<a name="line455">455 |</a> ** **
<a name="line456">456 |</a> ** ************************************************************************ **
<a name="line457">457 |</a> ++++*/
<a name="line458">458 |</a>
<a name="line459">459 |</a> Tcl_HashTable **Copy_Hash_Tables( void)
<a name="line460">460 |</a> {
<a name="line461">461 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line462">462 |</a> Tcl_HashEntry *oldHashEntry, /** Hash entries to be copied **/
<a name="line463">463 |</a> *newHashEntry;
<a name="line464">464 |</a> char *val = NULL, /** Stored value (is a pointer!) **/
<a name="line465">465 |</a> *key = NULL; /** Hash key **/
<a name="line466">466 |</a> int new; /** Tcl inidicator, if the new hash **/
<a name="line467">467 |</a> /** entry has been created or ref. **/
<a name="line468">468 |</a>
<a name="line469">469 |</a> Tcl_HashTable *oldTable[5],
<a name="line470">470 |</a> **o_ptr, **n_ptr,
<a name="line471">471 |</a> **newTable; /** Destination hash table **/
<a name="line472">472 |</a>
<a name="line473">473 |</a> oldTable[0] = setenvHashTable;
<a name="line474">474 |</a> oldTable[1] = unsetenvHashTable;
<a name="line475">475 |</a> oldTable[2] = aliasSetHashTable;
<a name="line476">476 |</a> oldTable[3] = aliasUnsetHashTable;
<a name="line477">477 |</a> oldTable[4] = NULL;
<a name="line478">478 |</a>
<a name="line479">479 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line480">480 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Copy_Hash_Tables, NULL);
<a name="line481">481 |</a> #endif
<a name="line482">482 |</a>
<a name="line483">483 |</a> /**
<a name="line484">484 |</a> ** Allocate storage for the new list of hash tables
<a name="line485">485 |</a> **/
<a name="line486">486 |</a> if( !(newTable = (Tcl_HashTable**) malloc( sizeof( oldTable))))
<a name="line487">487 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line488">488 |</a> goto unwind0;
<a name="line489">489 |</a>
<a name="line490">490 |</a> /**
<a name="line491">491 |</a> ** Now copy each hashtable out of the list
<a name="line492">492 |</a> **/
<a name="line493">493 |</a> for( o_ptr = oldTable, n_ptr = newTable; *o_ptr; o_ptr++, n_ptr++) {
<a name="line494">494 |</a>
<a name="line495">495 |</a> /**
<a name="line496">496 |</a> ** Allocate memory for a single hash table
<a name="line497">497 |</a> **/
<a name="line498">498 |</a> if( !(*n_ptr = (Tcl_HashTable*) malloc( sizeof( Tcl_HashTable))))
<a name="line499">499 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line500">500 |</a> goto unwind1;
<a name="line501">501 |</a>
<a name="line502">502 |</a> /**
<a name="line503">503 |</a> ** Initialize that guy and copy it from the old table
<a name="line504">504 |</a> **/
<a name="line505">505 |</a> Tcl_InitHashTable( *n_ptr, TCL_STRING_KEYS);
<a name="line506">506 |</a> if( oldHashEntry = Tcl_FirstHashEntry( *o_ptr, &amp;searchPtr)) {
<a name="line507">507 |</a>
<a name="line508">508 |</a> /**
<a name="line509">509 |</a> ** Copy all entries if there are any
<a name="line510">510 |</a> **/
<a name="line511">511 |</a> do {
<a name="line512">512 |</a>
<a name="line513">513 |</a> key = (char*) Tcl_GetHashKey( *o_ptr, oldHashEntry);
<a name="line514">514 |</a> val = (char*) Tcl_GetHashValue( oldHashEntry);
<a name="line515">515 |</a>
<a name="line516">516 |</a> newHashEntry = Tcl_CreateHashEntry( *n_ptr, key, &amp;new);
<a name="line517">517 |</a>
<a name="line518">518 |</a> if(val)
<a name="line519">519 |</a> Tcl_SetHashValue(newHashEntry, strdup(val));
<a name="line520">520 |</a> else
<a name="line521">521 |</a> Tcl_SetHashValue(newHashEntry, (char *) NULL);
<a name="line522">522 |</a>
<a name="line523">523 |</a> } while( oldHashEntry = Tcl_NextHashEntry( &amp;searchPtr));
<a name="line524">524 |</a>
<a name="line525">525 |</a> } /** if **/
<a name="line526">526 |</a> } /** for **/
<a name="line527">527 |</a>
<a name="line528">528 |</a> /**
<a name="line529">529 |</a> ** Put a terminator at the end of the new table
<a name="line530">530 |</a> **/
<a name="line531">531 |</a> *n_ptr = NULL;
<a name="line532">532 |</a>
<a name="line533">533 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line534">534 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_Copy_Hash_Tables, NULL);
<a name="line535">535 |</a> #endif
<a name="line536">536 |</a>
<a name="line537">537 |</a> return( newTable);
<a name="line538">538 |</a>
<a name="line539">539 |</a> unwind1:
<a name="line540">540 |</a> null_free((void *) &amp;newTable);
<a name="line541">541 |</a> unwind0:
<a name="line542">542 |</a> return( NULL); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line543">543 |</a> } /** End of 'Copy_Hash_Tables' **/
<a name="line544">544 |</a>
<a name="line545">545 |</a> /*++++
<a name="line546">546 |</a> ** ** Function-Header ***************************************************** **
<a name="line547">547 |</a> ** **
<a name="line548">548 |</a> ** Function: **
<a name="line549">549 |</a> ** **
<a name="line550">550 |</a> ** Description: Once a the loading or unloading of a modulefile **
<a name="line551">551 |</a> ** fails, any changes it has made to the environment **
<a name="line552">552 |</a> ** must be undone and reset to its previous state. This **
<a name="line553">553 |</a> ** function is responsible for unwinding any changes a **
<a name="line554">554 |</a> ** modulefile has made. **
<a name="line555">555 |</a> ** **
<a name="line556">556 |</a> ** First Edition: 1991/10/23 **
<a name="line557">557 |</a> ** **
<a name="line558">558 |</a> ** Parameters: Tcl_Interp *interp According TCL interp.**
<a name="line559">559 |</a> ** Tcl_HashTable **oldTables Hash tables storing **
<a name="line560">560 |</a> ** the former environm. **
<a name="line561">561 |</a> ** Result: **
<a name="line562">562 |</a> ** Attached Globals: **
<a name="line563">563 |</a> ** **
<a name="line564">564 |</a> ** ************************************************************************ **
<a name="line565">565 |</a> ++++*/
<a name="line566">566 |</a>
<a name="line567">567 |</a> int Unwind_Modulefile_Changes( Tcl_Interp *interp,
<a name="line568">568 |</a> Tcl_HashTable **oldTables )
<a name="line569">569 |</a> {
<a name="line570">570 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line571">571 |</a> Tcl_HashEntry *hashEntry; /** Result from Tcl hash search **/
<a name="line572">572 |</a> char *val = NULL, /** Stored value (is a pointer!) **/
<a name="line573">573 |</a> *key; /** Tcl hash key **/
<a name="line574">574 |</a> int i; /** Loop counter **/
<a name="line575">575 |</a>
<a name="line576">576 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line577">577 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Unwind_Modulefile_Changes, NULL);
<a name="line578">578 |</a> #endif
<a name="line579">579 |</a>
<a name="line580">580 |</a> if( oldTables) {
<a name="line581">581 |</a>
<a name="line582">582 |</a> /**
<a name="line583">583 |</a> ** Use only entries 0 and 1 which do contain all changes to the
<a name="line584">584 |</a> ** shell varibles (setenv and unsetenv)
<a name="line585">585 |</a> **/
<a name="line586">586 |</a>
<a name="line587">587 |</a> /** ??? What about the aliases (table 2 and 3) ??? **/
<a name="line588">588 |</a>
<a name="line589">589 |</a> for( i = 0; i &lt; 2; i++) {
<a name="line590">590 |</a> if( hashEntry = Tcl_FirstHashEntry( oldTables[i], &amp;searchPtr)) {
<a name="line591">591 |</a>
<a name="line592">592 |</a> do {
<a name="line593">593 |</a> key = (char*) Tcl_GetHashKey( oldTables[i], hashEntry);
<a name="line594">594 |</a>
<a name="line595">595 |</a> /**
<a name="line596">596 |</a> ** The hashEntry will contain the appropriate value for the
<a name="line597">597 |</a> ** specified 'key' because it will have been aquired depending
<a name="line598">598 |</a> ** upon whether the unset or set table was used.
<a name="line599">599 |</a> **/
<a name="line600">600 |</a>
<a name="line601">601 |</a> val = (char*) Tcl_GetHashValue( hashEntry);
<a name="line602">602 |</a> if( val)
<a name="line603">603 |</a> Tcl_SetVar2( interp, "env", key, val, TCL_GLOBAL_ONLY);
<a name="line604">604 |</a>
<a name="line605">605 |</a> } while( hashEntry = Tcl_NextHashEntry( &amp;searchPtr) );
<a name="line606">606 |</a>
<a name="line607">607 |</a> } /** if **/
<a name="line608">608 |</a> } /** for **/
<a name="line609">609 |</a>
<a name="line610">610 |</a> /**
<a name="line611">611 |</a> ** Delete and reset the hash tables now that the current contents have been
<a name="line612">612 |</a> ** flushed.
<a name="line613">613 |</a> **/
<a name="line614">614 |</a>
<a name="line615">615 |</a> Delete_Global_Hash_Tables();
<a name="line616">616 |</a>
<a name="line617">617 |</a> setenvHashTable = oldTables[0];
<a name="line618">618 |</a> unsetenvHashTable = oldTables[1];
<a name="line619">619 |</a> aliasSetHashTable = oldTables[2];
<a name="line620">620 |</a> aliasUnsetHashTable = oldTables[3];
<a name="line621">621 |</a>
<a name="line622">622 |</a> } else {
<a name="line623">623 |</a>
<a name="line624">624 |</a> Clear_Global_Hash_Tables();
<a name="line625">625 |</a>
<a name="line626">626 |</a> }
<a name="line627">627 |</a>
<a name="line628">628 |</a> return( TCL_OK);
<a name="line629">629 |</a>
<a name="line630">630 |</a> } /** End of 'Unwind_Modulefile_Changes' **/
<a name="line631">631 |</a>
<a name="line632">632 |</a> static int keycmp(const void *a, const void *b) {
<a name="line633">633 |</a> return strcmp(*(const char **) a, *(const char **) b);
<a name="line634">634 |</a> }
<a name="line635">635 |</a>
<a name="line636">636 |</a> /*++++
<a name="line637">637 |</a> ** ** Function-Header ***************************************************** **
<a name="line638">638 |</a> ** **
<a name="line639">639 |</a> ** Function: Output_Modulefile_Changes **
<a name="line640">640 |</a> ** **
<a name="line641">641 |</a> ** Description: Is used to flush out the changes of the current **
<a name="line642">642 |</a> ** modulefile in a manner depending upon whether the **
<a name="line643">643 |</a> ** modulefile was successfull or unsuccessfull. **
<a name="line644">644 |</a> ** **
<a name="line645">645 |</a> ** First Edition: 1991/10/23 **
<a name="line646">646 |</a> ** **
<a name="line647">647 |</a> ** Parameters: Tcl_Interp *interp The attached Tcl in- **
<a name="line648">648 |</a> ** terpreter **
<a name="line649">649 |</a> ** **
<a name="line650">650 |</a> ** Result: int TCL_OK Successful operation **
<a name="line651">651 |</a> ** **
<a name="line652">652 |</a> ** Attached Globals: setenvHashTable, **
<a name="line653">653 |</a> ** unsetenvHashTable, **
<a name="line654">654 |</a> ** aliasSetHashTable, via Output_Modulefile_Aliases**
<a name="line655">655 |</a> ** aliasUnsetHashTable via Output_Modulefile_Aliases**
<a name="line656">656 |</a> ** **
<a name="line657">657 |</a> ** ************************************************************************ **
<a name="line658">658 |</a> ++++*/
<a name="line659">659 |</a>
<a name="line660">660 |</a> int Output_Modulefile_Changes( Tcl_Interp *interp)
<a name="line661">661 |</a> {
<a name="line662">662 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line663">663 |</a> Tcl_HashEntry *hashEntry; /** Result from Tcl hash search **/
<a name="line664">664 |</a> char *val = NULL, /** Stored value (is a pointer!) **/
<a name="line665">665 |</a> *key, /** Tcl hash key **/
<a name="line666">666 |</a> **list; /** list of keys **/
<a name="line667">667 |</a> int i,k; /** Loop counter **/
<a name="line668">668 |</a> size_t hcnt; /** count of hash entries **/
<a name="line669">669 |</a>
<a name="line670">670 |</a> /**
<a name="line671">671 |</a> ** The following hash tables do contain all changes to be made on
<a name="line672">672 |</a> ** shell variables
<a name="line673">673 |</a> **/
<a name="line674">674 |</a>
<a name="line675">675 |</a> Tcl_HashTable *table[2];
<a name="line676">676 |</a>
<a name="line677">677 |</a> table[0] = setenvHashTable;
<a name="line678">678 |</a> table[1] = unsetenvHashTable;
<a name="line679">679 |</a>
<a name="line680">680 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line681">681 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Output_Modulefile_Changes, NULL);
<a name="line682">682 |</a> #endif
<a name="line683">683 |</a>
<a name="line684">684 |</a> aliasfile = stdout;
<a name="line685">685 |</a>
<a name="line686">686 |</a> /**
<a name="line687">687 |</a> ** Scan both tables that are of interest for shell variables
<a name="line688">688 |</a> **/
<a name="line689">689 |</a>
<a name="line690">690 |</a> for(i = 0; i &lt; 2; i++) {
<a name="line691">691 |</a> /* count hash */
<a name="line692">692 |</a> hcnt = countTclHash(table[i]);
<a name="line693">693 |</a>
<a name="line694">694 |</a> /* allocate array for keys */
<a name="line695">695 |</a> if( !(list = (char **) malloc(hcnt * sizeof(char *)))) {
<a name="line696">696 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line697">697 |</a> return(TCL_ERROR);/** ------- EXIT (FAILURE) ------&gt; **/
<a name="line698">698 |</a> }
<a name="line699">699 |</a>
<a name="line700">700 |</a> /* collect keys */
<a name="line701">701 |</a> k = 0;
<a name="line702">702 |</a> if( hashEntry = Tcl_FirstHashEntry( table[i], &amp;searchPtr))
<a name="line703">703 |</a> do {
<a name="line704">704 |</a> key = (char*) Tcl_GetHashKey( table[i], hashEntry);
<a name="line705">705 |</a> list[k++] = strdup(key);
<a name="line706">706 |</a> } while( hashEntry = Tcl_NextHashEntry( &amp;searchPtr));
<a name="line707">707 |</a> /* sort hash */
<a name="line708">708 |</a> if (hcnt &gt; 1)
<a name="line709">709 |</a> qsort((void *) list, hcnt, sizeof(char *), keycmp);
<a name="line710">710 |</a>
<a name="line711">711 |</a> /* output key/values */
<a name="line712">712 |</a> for (k = 0; k &lt; hcnt; ++k) {
<a name="line713">713 |</a> key = list[k];
<a name="line714">714 |</a> hashEntry = Tcl_FindHashEntry( table[i], key);
<a name="line715">715 |</a> /**
<a name="line716">716 |</a> ** The table list indicator is used in order to differ
<a name="line717">717 |</a> ** between the setenv and unsetenv operation
<a name="line718">718 |</a> **/
<a name="line719">719 |</a> if( i == 1) {
<a name="line720">720 |</a> output_unset_variable( (char*) key);
<a name="line721">721 |</a> } else {
<a name="line722">722 |</a> if(val=(char *) Tcl_GetVar2(interp,"env",
<a name="line723">723 |</a> key,TCL_GLOBAL_ONLY))
<a name="line724">724 |</a> output_set_variable(interp, (char*) key, val);
<a name="line725">725 |</a> }
<a name="line726">726 |</a> } /** for **/
<a name="line727">727 |</a> /* delloc list */
<a name="line728">728 |</a> for (k = 0; k &lt; hcnt; ++k)
<a name="line729">729 |</a> free(list[k]);
<a name="line730">730 |</a> free(list);
<a name="line731">731 |</a> } /** for **/
<a name="line732">732 |</a>
<a name="line733">733 |</a> if( EOF == fflush( stdout))
<a name="line734">734 |</a> if( OK != ErrorLogger( ERR_FLUSH, LOC, _fil_stdout, NULL))
<a name="line735">735 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line736">736 |</a>
<a name="line737">737 |</a> Output_Modulefile_Aliases( interp);
<a name="line738">738 |</a>
<a name="line739">739 |</a> /**
<a name="line740">740 |</a> ** Delete and reset the hash tables since the current contents have been
<a name="line741">741 |</a> ** flushed.
<a name="line742">742 |</a> **/
<a name="line743">743 |</a>
<a name="line744">744 |</a> Clear_Global_Hash_Tables();
<a name="line745">745 |</a> return( TCL_OK);
<a name="line746">746 |</a>
<a name="line747">747 |</a> } /* End of 'Output_Modulefile_Changes' */
<a name="line748">748 |</a>
<a name="line749">749 |</a> /*++++
<a name="line750">750 |</a> ** ** Function-Header ***************************************************** **
<a name="line751">751 |</a> ** **
<a name="line752">752 |</a> ** Function: Open_Aliasfile **
<a name="line753">753 |</a> ** **
<a name="line754">754 |</a> ** Description: Creates/opens or closes temporary file for sourcing **
<a name="line755">755 |</a> ** or aliases. **
<a name="line756">756 |</a> ** Passes back the filehandle and filename in global **
<a name="line757">757 |</a> ** variables. **
<a name="line758">758 |</a> ** **
<a name="line759">759 |</a> ** First Edition: 2005/09/26 R.K.Owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line760">760 |</a> ** **
<a name="line761">761 |</a> ** Parameters: int action if != 0 to open else close **
<a name="line762">762 |</a> ** **
<a name="line763">763 |</a> ** Result: int TCL_OK Successful operation **
<a name="line764">764 |</a> ** **
<a name="line765">765 |</a> ** Attached Globals: aliasfile **
<a name="line766">766 |</a> ** aliasfilename **
<a name="line767">767 |</a> ** **
<a name="line768">768 |</a> ** ************************************************************************ **
<a name="line769">769 |</a> ++++*/
<a name="line770">770 |</a>
<a name="line771">771 |</a> static int Open_Aliasfile(int action)
<a name="line772">772 |</a> {
<a name="line773">773 |</a>
<a name="line774">774 |</a> if (action) {
<a name="line775">775 |</a> /**
<a name="line776">776 |</a> ** Open the file ...
<a name="line777">777 |</a> **/
<a name="line778">778 |</a> if( tmpfile_mod(&amp;aliasfilename,&amp;aliasfile))
<a name="line779">779 |</a> if(OK != ErrorLogger( ERR_OPEN, LOC, aliasfilename, "append", NULL))
<a name="line780">780 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line781">781 |</a> } else {
<a name="line782">782 |</a> if( EOF == fclose( aliasfile))
<a name="line783">783 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, aliasfile, NULL))
<a name="line784">784 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line785">785 |</a> }
<a name="line786">786 |</a>
<a name="line787">787 |</a> return( TCL_OK);
<a name="line788">788 |</a>
<a name="line789">789 |</a> } /** End of 'Open_Aliasfile' **/
<a name="line790">790 |</a> /*++++
<a name="line791">791 |</a> ** ** Function-Header ***************************************************** **
<a name="line792">792 |</a> ** **
<a name="line793">793 |</a> ** Function: Output_Modulefile_Aliases **
<a name="line794">794 |</a> ** **
<a name="line795">795 |</a> ** Description: Is used to flush out the changes to the aliases of **
<a name="line796">796 |</a> ** the current modulefile. But, some shells don't work **
<a name="line797">797 |</a> ** well with having their alias information set via the **
<a name="line798">798 |</a> ** 'eval' command. So, what we'll do now is output the **
<a name="line799">799 |</a> ** aliases into a /tmp dotfile, have the shell source **
<a name="line800">800 |</a> ** the /tmp dotfile and then have the shell remove the **
<a name="line801">801 |</a> ** /tmp dotfile. **
<a name="line802">802 |</a> ** **
<a name="line803">803 |</a> ** First Edition: 1991/10/23 **
<a name="line804">804 |</a> ** **
<a name="line805">805 |</a> ** Parameters: Tcl_Interp *interp The attached Tcl in- **
<a name="line806">806 |</a> ** terpreter **
<a name="line807">807 |</a> ** **
<a name="line808">808 |</a> ** Result: int TCL_OK Successful operation **
<a name="line809">809 |</a> ** **
<a name="line810">810 |</a> ** Attached Globals: aliasSetHashTable, via Output_Modulefile_Aliases**
<a name="line811">811 |</a> ** aliasUnsetHashTable via Output_Modulefile_Aliases**
<a name="line812">812 |</a> ** **
<a name="line813">813 |</a> ** ************************************************************************ **
<a name="line814">814 |</a> ++++*/
<a name="line815">815 |</a>
<a name="line816">816 |</a> static int Output_Modulefile_Aliases( Tcl_Interp *interp)
<a name="line817">817 |</a> {
<a name="line818">818 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line819">819 |</a> Tcl_HashEntry *hashEntry; /** Result from Tcl hash search **/
<a name="line820">820 |</a> char *val = NULL, /** Stored value (is a pointer!) **/
<a name="line821">821 |</a> *key; /** Tcl hash key **/
<a name="line822">822 |</a> int i, /** Loop counter **/
<a name="line823">823 |</a> openfile = 0; /** whether using a file or not **/
<a name="line824">824 |</a> char *sourceCommand; /** Command used to source the alias **/
<a name="line825">825 |</a>
<a name="line826">826 |</a> /**
<a name="line827">827 |</a> ** The following hash tables do contain all changes to be made on
<a name="line828">828 |</a> ** shell aliases
<a name="line829">829 |</a> **/
<a name="line830">830 |</a> Tcl_HashTable *table[2];
<a name="line831">831 |</a>
<a name="line832">832 |</a> table[0] = aliasSetHashTable;
<a name="line833">833 |</a> table[1] = aliasUnsetHashTable;
<a name="line834">834 |</a>
<a name="line835">835 |</a> /**
<a name="line836">836 |</a> ** If configured so, all changes to aliases are written into a temporary
<a name="line837">837 |</a> ** file which is sourced by the invoking shell ...
<a name="line838">838 |</a> ** In this case a temporary filename has to be assigned for the alias
<a name="line839">839 |</a> ** source file. The file has to be opened as 'aliasfile'.
<a name="line840">840 |</a> ** The default for aliasfile, if no shell sourcing is used, is stdout.
<a name="line841">841 |</a> **/
<a name="line842">842 |</a>
<a name="line843">843 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line844">844 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Output_Modulefile_Aliases, NULL);
<a name="line845">845 |</a> #endif
<a name="line846">846 |</a>
<a name="line847">847 |</a> /**
<a name="line848">848 |</a> ** We only need to output stuff into a temporary file if we're setting
<a name="line849">849 |</a> ** stuff. We can unset variables and aliases by just using eval.
<a name="line850">850 |</a> **/
<a name="line851">851 |</a> if( hashEntry = Tcl_FirstHashEntry( aliasSetHashTable, &amp;searchPtr)) {
<a name="line852">852 |</a>
<a name="line853">853 |</a> /**
<a name="line854">854 |</a> ** We must use an aliasfile if EVAL_ALIAS is not defined
<a name="line855">855 |</a> ** or the sh shell does not do aliases (HAS_BOURNE_ALIAS)
<a name="line856">856 |</a> ** and that the sh shell does do functions (HAS_BOURNE_FUNCS)
<a name="line857">857 |</a> **/
<a name="line858">858 |</a> if (!eval_alias
<a name="line859">859 |</a> || (!strcmp(shell_name,"sh") &amp;&amp; !bourne_alias &amp;&amp; bourne_funcs)) {
<a name="line860">860 |</a> if (OK != Open_Aliasfile(1))
<a name="line861">861 |</a> if(OK != ErrorLogger(ERR_OPEN,LOC,aliasfilename,"append",NULL))
<a name="line862">862 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line863">863 |</a> openfile = 1;
<a name="line864">864 |</a> }
<a name="line865">865 |</a> /**
<a name="line866">866 |</a> ** We only support sh and csh variants for aliases. If not either
<a name="line867">867 |</a> ** sh or csh print warning message and return
<a name="line868">868 |</a> **/
<a name="line869">869 |</a> if( !strcmp( shell_derelict, "csh")) {
<a name="line870">870 |</a> sourceCommand = "source %s%s";
<a name="line871">871 |</a> } else if( !strcmp( shell_derelict, "sh")) {
<a name="line872">872 |</a> sourceCommand = ". %s%s";
<a name="line873">873 |</a> } else {
<a name="line874">874 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line875">875 |</a> }
<a name="line876">876 |</a>
<a name="line877">877 |</a> if (openfile) {
<a name="line878">878 |</a> /**
<a name="line879">879 |</a> ** Only the source command has to be flushed to stdout. After
<a name="line880">880 |</a> ** sourcing the alias definition (temporary) file, the source
<a name="line881">881 |</a> ** file is to be removed.
<a name="line882">882 |</a> **/
<a name="line883">883 |</a> alias_separator = '\n';
<a name="line884">884 |</a>
<a name="line885">885 |</a> fprintf( stdout, sourceCommand, aliasfilename, shell_cmd_separator);
<a name="line886">886 |</a> fprintf( stdout, "/bin/rm -f %s%s",
<a name="line887">887 |</a> aliasfilename, shell_cmd_separator);
<a name="line888">888 |</a> } /** openfile **/
<a name="line889">889 |</a> } /** if( alias to set) **/
<a name="line890">890 |</a>
<a name="line891">891 |</a> /**
<a name="line892">892 |</a> ** Scan the hash tables involved in changing aliases
<a name="line893">893 |</a> **/
<a name="line894">894 |</a>
<a name="line895">895 |</a> for( i=0; i&lt;2; i++) {
<a name="line896">896 |</a>
<a name="line897">897 |</a> if( hashEntry = Tcl_FirstHashEntry( table[i], &amp;searchPtr)) {
<a name="line898">898 |</a>
<a name="line899">899 |</a> do {
<a name="line900">900 |</a> key = (char*) Tcl_GetHashKey( table[i], hashEntry);
<a name="line901">901 |</a> val = (char*) Tcl_GetHashValue( hashEntry);
<a name="line902">902 |</a>
<a name="line903">903 |</a> /**
<a name="line904">904 |</a> ** The hashtable list index is used to differ between aliases
<a name="line905">905 |</a> ** to be set and aliases to be reset
<a name="line906">906 |</a> **/
<a name="line907">907 |</a> if(i == 1) {
<a name="line908">908 |</a> output_unset_alias( key, val);
<a name="line909">909 |</a> } else {
<a name="line910">910 |</a> output_set_alias( key, val);
<a name="line911">911 |</a> }
<a name="line912">912 |</a>
<a name="line913">913 |</a> } while( hashEntry = Tcl_NextHashEntry( &amp;searchPtr));
<a name="line914">914 |</a>
<a name="line915">915 |</a> } /** if **/
<a name="line916">916 |</a> } /** for **/
<a name="line917">917 |</a>
<a name="line918">918 |</a>
<a name="line919">919 |</a> if(openfile) {
<a name="line920">920 |</a> if( OK == Open_Aliasfile(0))
<a name="line921">921 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, aliasfile, NULL))
<a name="line922">922 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line923">923 |</a>
<a name="line924">924 |</a> null_free((void *) &amp;aliasfilename);
<a name="line925">925 |</a> }
<a name="line926">926 |</a>
<a name="line927">927 |</a> return( TCL_OK);
<a name="line928">928 |</a>
<a name="line929">929 |</a> } /** End of 'Output_Modulefile_Aliases' **/
<a name="line930">930 |</a>
<a name="line931">931 |</a> /*++++
<a name="line932">932 |</a> ** ** Function-Header ***************************************************** **
<a name="line933">933 |</a> ** **
<a name="line934">934 |</a> ** Function: output_set_variable **
<a name="line935">935 |</a> ** **
<a name="line936">936 |</a> ** Description: Outputs the command required to set a shell variable **
<a name="line937">937 |</a> ** according to the current shell **
<a name="line938">938 |</a> ** **
<a name="line939">939 |</a> ** First Edition: 1991/10/23 **
<a name="line940">940 |</a> ** **
<a name="line941">941 |</a> ** Parameters: Tcl_Interp *interp The attached Tcl interpreter **
<a name="line942">942 |</a> ** const char *var Name of the variable to be **
<a name="line943">943 |</a> ** set **
<a name="line944">944 |</a> ** const char *val Value to be assigned **
<a name="line945">945 |</a> ** **
<a name="line946">946 |</a> ** Result: int TCL_OK Finished successfull **
<a name="line947">947 |</a> ** TCL_ERROR Unknown shell type **
<a name="line948">948 |</a> ** **
<a name="line949">949 |</a> ** Attached Globals: shell_derelict **
<a name="line950">950 |</a> ** **
<a name="line951">951 |</a> ** ************************************************************************ **
<a name="line952">952 |</a> ++++*/
<a name="line953">953 |</a>
<a name="line954">954 |</a> static int output_set_variable( Tcl_Interp *interp,
<a name="line955">955 |</a> const char *var,
<a name="line956">956 |</a> const char *val)
<a name="line957">957 |</a> {
<a name="line958">958 |</a>
<a name="line959">959 |</a> /**
<a name="line960">960 |</a> ** Differ between the different kinds od shells at first
<a name="line961">961 |</a> **
<a name="line962">962 |</a> ** CSH
<a name="line963">963 |</a> **/
<a name="line964">964 |</a> chop( val);
<a name="line965">965 |</a> chop( var);
<a name="line966">966 |</a>
<a name="line967">967 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line968">968 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_output_set_variable, " var='", var,
<a name="line969">969 |</a> "' val= '", val, "'", NULL);
<a name="line970">970 |</a> #endif
<a name="line971">971 |</a>
<a name="line972">972 |</a> if( !strcmp((char*) shell_derelict, "csh")) {
<a name="line973">973 |</a>
<a name="line974">974 |</a> #ifdef LMSPLIT_SIZE
<a name="line975">975 |</a>
<a name="line976">976 |</a> /**
<a name="line977">977 |</a> ** Many C Shells (specifically the Sun one) has a hard limit on
<a name="line978">978 |</a> ** the size of the environment variables around 1k. The
<a name="line979">979 |</a> ** _LMFILES_ variable can grow beyond 1000 characters. So, I'm
<a name="line980">980 |</a> ** going to break it up here since I can put it back together
<a name="line981">981 |</a> ** again when I use it.
<a name="line982">982 |</a> **
<a name="line983">983 |</a> ** You can set the split size using --with-split-size=&lt;number&gt;
<a name="line984">984 |</a> ** it should probably be &lt;1000. I don't count the size of
<a name="line985">985 |</a> ** "setenv _LMFILES_xxx" so subtract this from your limit.
<a name="line986">986 |</a> **/
<a name="line987">987 |</a> if( !strcmp( var, "_LMFILES_")) {
<a name="line988">988 |</a> char formatted[ MOD_BUFSIZE];
<a name="line989">989 |</a> char *cptr;
<a name="line990">990 |</a> int lmfiles_len;
<a name="line991">991 |</a> int count = 0;
<a name="line992">992 |</a> char* escaped = stringer(NULL,strlen(val)*2+1,NULL);
<a name="line993">993 |</a> EscapeCshString(val,escaped);
<a name="line994">994 |</a>
<a name="line995">995 |</a> if(( lmfiles_len = strlen(escaped)) &gt; LMSPLIT_SIZE) {
<a name="line996">996 |</a>
<a name="line997">997 |</a> char buffer[ LMSPLIT_SIZE + 1];
<a name="line998">998 |</a>
<a name="line999">999 |</a> /**
<a name="line1000">1000 |</a> ** Break up the _LMFILES_ variable...
<a name="line1001">1001 |</a> **/
<a name="line1002">1002 |</a> while( lmfiles_len &gt; LMSPLIT_SIZE) {
<a name="line1003">1003 |</a>
<a name="line1004">1004 |</a> strncpy( buffer, ( escaped + count*LMSPLIT_SIZE ),
<a name="line1005">1005 |</a> LMSPLIT_SIZE);
<a name="line1006">1006 |</a> buffer[ LMSPLIT_SIZE] = '\0';
<a name="line1007">1007 |</a>
<a name="line1008">1008 |</a> fprintf( stdout, "setenv %s%03d %s%s", var, count, buffer,
<a name="line1009">1009 |</a> shell_cmd_separator);
<a name="line1010">1010 |</a>
<a name="line1011">1011 |</a> lmfiles_len -= LMSPLIT_SIZE;
<a name="line1012">1012 |</a> count++;
<a name="line1013">1013 |</a> }
<a name="line1014">1014 |</a>
<a name="line1015">1015 |</a> if( lmfiles_len) {
<a name="line1016">1016 |</a> fprintf( stdout, "setenv %s%03d %s%s", var, count,
<a name="line1017">1017 |</a> (escaped + count*LMSPLIT_SIZE), shell_cmd_separator);
<a name="line1018">1018 |</a> count++;
<a name="line1019">1019 |</a> }
<a name="line1020">1020 |</a>
<a name="line1021">1021 |</a> /**
<a name="line1022">1022 |</a> ** Unset _LMFILES_ as indicator to use the multi-variable
<a name="line1023">1023 |</a> ** _LMFILES_
<a name="line1024">1024 |</a> **/
<a name="line1025">1025 |</a> fprintf(stdout, "unsetenv %s%s", var, shell_cmd_separator);
<a name="line1026">1026 |</a>
<a name="line1027">1027 |</a> } else { /** if ( lmfiles_len = strlen(val)) &gt; LMSPLIT_SIZE) **/
<a name="line1028">1028 |</a>
<a name="line1029">1029 |</a> fprintf(stdout, "setenv %s %s%s", var, escaped, shell_cmd_separator);
<a name="line1030">1030 |</a> }
<a name="line1031">1031 |</a>
<a name="line1032">1032 |</a> /**
<a name="line1033">1033 |</a> ** Unset the extra _LMFILES_%03d variables that may be set
<a name="line1034">1034 |</a> **/
<a name="line1035">1035 |</a> do {
<a name="line1036">1036 |</a> sprintf( formatted, "_LMFILES_%03d", count++);
<a name="line1037">1037 |</a> cptr = (char *) Tcl_GetVar2( interp, "env", formatted, TCL_GLOBAL_ONLY);
<a name="line1038">1038 |</a> if( cptr) {
<a name="line1039">1039 |</a> fprintf(stdout, "unsetenv %s%s", formatted, shell_cmd_separator);
<a name="line1040">1040 |</a> }
<a name="line1041">1041 |</a> } while( cptr);
<a name="line1042">1042 |</a>
<a name="line1043">1043 |</a> null_free((void *) &amp;escaped);
<a name="line1044">1044 |</a>
<a name="line1045">1045 |</a> } else { /** if( var == "_LMFILES_") **/
<a name="line1046">1046 |</a>
<a name="line1047">1047 |</a> #endif /* not LMSPLIT_SIZE */
<a name="line1048">1048 |</a>
<a name="line1049">1049 |</a> char* escaped = stringer(NULL,strlen(val)*2+1,NULL);
<a name="line1050">1050 |</a> EscapeCshString(val,escaped);
<a name="line1051">1051 |</a> fprintf(stdout, "setenv %s %s %s", var, escaped, shell_cmd_separator);
<a name="line1052">1052 |</a> null_free((void *) &amp;escaped);
<a name="line1053">1053 |</a> #ifdef LMSPLIT_SIZE
<a name="line1054">1054 |</a> }
<a name="line1055">1055 |</a> #endif /* not LMSPLIT_SIZE */
<a name="line1056">1056 |</a>
<a name="line1057">1057 |</a> /**
<a name="line1058">1058 |</a> ** SH
<a name="line1059">1059 |</a> **/
<a name="line1060">1060 |</a> } else if( !strcmp((char*) shell_derelict, "sh")) {
<a name="line1061">1061 |</a>
<a name="line1062">1062 |</a> char* escaped = (char*)malloc(strlen(val)*2+1);
<a name="line1063">1063 |</a> EscapeShString(val,escaped);
<a name="line1064">1064 |</a>
<a name="line1065">1065 |</a> fprintf( stdout, "%s=%s %sexport %s%s", var, escaped, shell_cmd_separator,
<a name="line1066">1066 |</a> var, shell_cmd_separator);
<a name="line1067">1067 |</a> free(escaped);
<a name="line1068">1068 |</a>
<a name="line1069">1069 |</a> /**
<a name="line1070">1070 |</a> ** EMACS
<a name="line1071">1071 |</a> **/
<a name="line1072">1072 |</a> } else if( !strcmp((char*) shell_derelict, "emacs")) {
<a name="line1073">1073 |</a> fprintf( stdout, "(setenv \"%s\" \'%s\')\n", var, val);
<a name="line1074">1074 |</a>
<a name="line1075">1075 |</a> /**
<a name="line1076">1076 |</a> ** PERL
<a name="line1077">1077 |</a> **/
<a name="line1078">1078 |</a> } else if( !strcmp((char*) shell_derelict, "perl")) {
<a name="line1079">1079 |</a> char* escaped = stringer(NULL,strlen(val)*2+1,NULL);
<a name="line1080">1080 |</a> EscapePerlString(val,escaped);
<a name="line1081">1081 |</a> fprintf(stdout, "$ENV{'%s'} = '%s'%s", var, escaped,
<a name="line1082">1082 |</a> shell_cmd_separator);
<a name="line1083">1083 |</a> null_free((void *) &amp;escaped);
<a name="line1084">1084 |</a>
<a name="line1085">1085 |</a> /**
<a name="line1086">1086 |</a> ** PYTHON
<a name="line1087">1087 |</a> **/
<a name="line1088">1088 |</a> } else if( !strcmp((char*) shell_derelict, "python")) {
<a name="line1089">1089 |</a> fprintf( stdout, "os.environ['%s'] = '%s'\n", var, val);
<a name="line1090">1090 |</a>
<a name="line1091">1091 |</a> /**
<a name="line1092">1092 |</a> ** SCM
<a name="line1093">1093 |</a> **/
<a name="line1094">1094 |</a> } else if ( !strcmp((char*) shell_derelict, "scm")) {
<a name="line1095">1095 |</a> fprintf( stdout, "(putenv \"%s=%s\")\n", var, val);
<a name="line1096">1096 |</a>
<a name="line1097">1097 |</a> /**
<a name="line1098">1098 |</a> ** MEL (Maya Extension Language)
<a name="line1099">1099 |</a> **/
<a name="line1100">1100 |</a> } else if ( !strcmp((char*) shell_derelict, "mel")) {
<a name="line1101">1101 |</a> fprintf( stdout, "putenv \"%s\" \"%s\";", var, val);
<a name="line1102">1102 |</a>
<a name="line1103">1103 |</a> /**
<a name="line1104">1104 |</a> ** Unknown shell type - print an error message and
<a name="line1105">1105 |</a> ** return on error
<a name="line1106">1106 |</a> **/
<a name="line1107">1107 |</a> } else {
<a name="line1108">1108 |</a> if( OK != ErrorLogger( ERR_DERELICT, LOC, shell_derelict, NULL))
<a name="line1109">1109 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line1110">1110 |</a> }
<a name="line1111">1111 |</a>
<a name="line1112">1112 |</a> /**
<a name="line1113">1113 |</a> ** Return and acknowldge success
<a name="line1114">1114 |</a> **/
<a name="line1115">1115 |</a> return( TCL_ERROR);
<a name="line1116">1116 |</a>
<a name="line1117">1117 |</a> } /** End of 'output_set_variable' **/
<a name="line1118">1118 |</a>
<a name="line1119">1119 |</a> /*++++
<a name="line1120">1120 |</a> ** ** Function-Header ***************************************************** **
<a name="line1121">1121 |</a> ** **
<a name="line1122">1122 |</a> ** Function: output_unset_variable **
<a name="line1123">1123 |</a> ** **
<a name="line1124">1124 |</a> ** Description: Outputs the command required to unset a shell **
<a name="line1125">1125 |</a> ** variable according to the current shell **
<a name="line1126">1126 |</a> ** **
<a name="line1127">1127 |</a> ** First Edition: 1991/10/23 **
<a name="line1128">1128 |</a> ** **
<a name="line1129">1129 |</a> ** Parameters: const char *var Name of the variable to be **
<a name="line1130">1130 |</a> ** unset **
<a name="line1131">1131 |</a> ** **
<a name="line1132">1132 |</a> ** Result: int TCL_OK Finished successfull **
<a name="line1133">1133 |</a> ** TCL_ERROR Unknown shell type **
<a name="line1134">1134 |</a> ** **
<a name="line1135">1135 |</a> ** Attached Globals: shell_derelict **
<a name="line1136">1136 |</a> ** **
<a name="line1137">1137 |</a> ** ************************************************************************ **
<a name="line1138">1138 |</a> ++++*/
<a name="line1139">1139 |</a>
<a name="line1140">1140 |</a> static int output_unset_variable( const char* var)
<a name="line1141">1141 |</a> {
<a name="line1142">1142 |</a> chop( var);
<a name="line1143">1143 |</a>
<a name="line1144">1144 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1145">1145 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_output_unset_variable, NULL);
<a name="line1146">1146 |</a> #endif
<a name="line1147">1147 |</a>
<a name="line1148">1148 |</a> /**
<a name="line1149">1149 |</a> ** Display the 'unsetenv' command according to the current invoking shell.
<a name="line1150">1150 |</a> **/
<a name="line1151">1151 |</a> if( !strcmp( shell_derelict, "csh")) {
<a name="line1152">1152 |</a> fprintf( stdout, "unsetenv %s%s", var, shell_cmd_separator);
<a name="line1153">1153 |</a> } else if( !strcmp( shell_derelict, "sh")) {
<a name="line1154">1154 |</a> fprintf( stdout, "unset %s%s", var, shell_cmd_separator);
<a name="line1155">1155 |</a> } else if( !strcmp( shell_derelict, "emacs")) {
<a name="line1156">1156 |</a> fprintf( stdout, "(setenv \"%s\" nil)\n", var);
<a name="line1157">1157 |</a> } else if( !strcmp( shell_derelict, "perl")) {
<a name="line1158">1158 |</a> fprintf( stdout, "delete $ENV{'%s'}%s", var, shell_cmd_separator);
<a name="line1159">1159 |</a> } else if( !strcmp( shell_derelict, "python")) {
<a name="line1160">1160 |</a> fprintf( stdout, "os.environ['%s'] = ''\ndel os.environ['%s']\n",var,var);
<a name="line1161">1161 |</a> } else if( !strcmp( shell_derelict, "scm")) {
<a name="line1162">1162 |</a> fprintf( stdout, "(putenv \"%s\")\n", var);
<a name="line1163">1163 |</a> } else if( !strcmp( shell_derelict, "mel")) {
<a name="line1164">1164 |</a> fprintf( stdout, "putenv \"%s\" \"\";", var);
<a name="line1165">1165 |</a> } else {
<a name="line1166">1166 |</a> if( OK != ErrorLogger( ERR_DERELICT, LOC, shell_derelict, NULL))
<a name="line1167">1167 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line1168">1168 |</a> }
<a name="line1169">1169 |</a>
<a name="line1170">1170 |</a> /**
<a name="line1171">1171 |</a> ** Return and acknowldge success
<a name="line1172">1172 |</a> **/
<a name="line1173">1173 |</a> return( TCL_OK);
<a name="line1174">1174 |</a>
<a name="line1175">1175 |</a> } /** End of 'output_unset_variable' **/
<a name="line1176">1176 |</a>
<a name="line1177">1177 |</a> /*++++
<a name="line1178">1178 |</a> ** ** Function-Header ***************************************************** **
<a name="line1179">1179 |</a> ** **
<a name="line1180">1180 |</a> ** Function: output_function **
<a name="line1181">1181 |</a> ** **
<a name="line1182">1182 |</a> ** Description: Actually turns the Modules set-alias information **
<a name="line1183">1183 |</a> ** into a string that a shell can source. Previously, **
<a name="line1184">1184 |</a> ** this routine just output the alias information to be **
<a name="line1185">1185 |</a> ** eval'd by the shell. **
<a name="line1186">1186 |</a> ** **
<a name="line1187">1187 |</a> ** First Edition: 1991/10/23 **
<a name="line1188">1188 |</a> ** **
<a name="line1189">1189 |</a> ** Parameters: const char *var Name of the alias to be set **
<a name="line1190">1190 |</a> ** const char *val Value to be assigned **
<a name="line1191">1191 |</a> ** **
<a name="line1192">1192 |</a> ** Result: - **
<a name="line1193">1193 |</a> ** **
<a name="line1194">1194 |</a> ** Attached Globals: aliasfile, The output file for alias commands. **
<a name="line1195">1195 |</a> ** see 'Output_Modulefile_Aliases' **
<a name="line1196">1196 |</a> ** alias_separator **
<a name="line1197">1197 |</a> ** **
<a name="line1198">1198 |</a> ** ************************************************************************ **
<a name="line1199">1199 |</a> ++++*/
<a name="line1200">1200 |</a>
<a name="line1201">1201 |</a> static void output_function( const char *var,
<a name="line1202">1202 |</a> const char *val)
<a name="line1203">1203 |</a> {
<a name="line1204">1204 |</a> const char *cptr = val;
<a name="line1205">1205 |</a> int nobackslash = 1;
<a name="line1206">1206 |</a>
<a name="line1207">1207 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1208">1208 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_output_function, NULL);
<a name="line1209">1209 |</a> #endif
<a name="line1210">1210 |</a>
<a name="line1211">1211 |</a> /**
<a name="line1212">1212 |</a> ** This opens a function ...
<a name="line1213">1213 |</a> **/
<a name="line1214">1214 |</a> fprintf( aliasfile, "%s() {%c", var, alias_separator);
<a name="line1215">1215 |</a>
<a name="line1216">1216 |</a> /**
<a name="line1217">1217 |</a> ** ... now print the value. Print it as a single line and remove any
<a name="line1218">1218 |</a> ** backslash
<a name="line1219">1219 |</a> **/
<a name="line1220">1220 |</a> while( *cptr) {
<a name="line1221">1221 |</a>
<a name="line1222">1222 |</a> if( *cptr == '\\') {
<a name="line1223">1223 |</a> if( !nobackslash)
<a name="line1224">1224 |</a> putc( *cptr, aliasfile);
<a name="line1225">1225 |</a> else
<a name="line1226">1226 |</a> nobackslash = 0;
<a name="line1227">1227 |</a> cptr++;
<a name="line1228">1228 |</a> continue;
<a name="line1229">1229 |</a> } else
<a name="line1230">1230 |</a> nobackslash = 1;
<a name="line1231">1231 |</a>
<a name="line1232">1232 |</a> putc(*cptr++, aliasfile);
<a name="line1233">1233 |</a>
<a name="line1234">1234 |</a> } /** while **/
<a name="line1235">1235 |</a>
<a name="line1236">1236 |</a> /**
<a name="line1237">1237 |</a> ** Finally close the function
<a name="line1238">1238 |</a> **/
<a name="line1239">1239 |</a> fprintf( aliasfile, "%c}%c", alias_separator,alias_separator);
<a name="line1240">1240 |</a>
<a name="line1241">1241 |</a> } /** End of 'output_function' **/
<a name="line1242">1242 |</a>
<a name="line1243">1243 |</a> /*++++
<a name="line1244">1244 |</a> ** ** Function-Header ***************************************************** **
<a name="line1245">1245 |</a> ** **
<a name="line1246">1246 |</a> ** Function: output_set_alias **
<a name="line1247">1247 |</a> ** **
<a name="line1248">1248 |</a> ** Description: Flush the commands required to set shell aliases de- **
<a name="line1249">1249 |</a> ** pending on the current invoking shell **
<a name="line1250">1250 |</a> ** **
<a name="line1251">1251 |</a> ** First Edition: 1991/10/23 **
<a name="line1252">1252 |</a> ** **
<a name="line1253">1253 |</a> ** Parameters: const char *alias Name of the alias **
<a name="line1254">1254 |</a> ** const char *val Value to be assigned **
<a name="line1255">1255 |</a> ** **
<a name="line1256">1256 |</a> ** Result: int TCL_OK Operation successfull **
<a name="line1257">1257 |</a> ** **
<a name="line1258">1258 |</a> ** Attached Globals: aliasfile, The alias command is written out to **
<a name="line1259">1259 |</a> ** alias_separator Defined the command separator **
<a name="line1260">1260 |</a> ** shell_derelict to determine the shell family **
<a name="line1261">1261 |</a> ** shell_name to determine the real shell type **
<a name="line1262">1262 |</a> ** **
<a name="line1263">1263 |</a> ** ************************************************************************ **
<a name="line1264">1264 |</a> ++++*/
<a name="line1265">1265 |</a>
<a name="line1266">1266 |</a> static int output_set_alias( const char *alias,
<a name="line1267">1267 |</a> const char *val)
<a name="line1268">1268 |</a> {
<a name="line1269">1269 |</a> int nobackslash = 1; /** Controls whether backslashes are **/
<a name="line1270">1270 |</a> /** to be print **/
<a name="line1271">1271 |</a> const char *cptr = val; /** Scan the value char by char **/
<a name="line1272">1272 |</a>
<a name="line1273">1273 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1274">1274 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_output_set_alias, NULL);
<a name="line1275">1275 |</a> #endif
<a name="line1276">1276 |</a>
<a name="line1277">1277 |</a> /**
<a name="line1278">1278 |</a> ** Check for the shell family
<a name="line1279">1279 |</a> ** CSHs need to switch $* to \!* and $n to \!\!:n unless the $ has a
<a name="line1280">1280 |</a> ** backslash before it
<a name="line1281">1281 |</a> **/
<a name="line1282">1282 |</a> if( !strcmp( shell_derelict, "csh")) {
<a name="line1283">1283 |</a>
<a name="line1284">1284 |</a> /**
<a name="line1285">1285 |</a> ** On CSHs the command is 'alias &lt;name&gt; &lt;value&gt;'. Print the beginning
<a name="line1286">1286 |</a> ** of the command and then print the value char by char.
<a name="line1287">1287 |</a> **/
<a name="line1288">1288 |</a> fprintf( aliasfile, "alias %s '", alias);
<a name="line1289">1289 |</a>
<a name="line1290">1290 |</a> while( *cptr) {
<a name="line1291">1291 |</a>
<a name="line1292">1292 |</a> /**
<a name="line1293">1293 |</a> ** Convert $n to \!\!:n
<a name="line1294">1294 |</a> **/
<a name="line1295">1295 |</a> if( *cptr == '$' &amp;&amp; nobackslash) {
<a name="line1296">1296 |</a> cptr++;
<a name="line1297">1297 |</a> if( *cptr == '*')
<a name="line1298">1298 |</a> fprintf( aliasfile, "\\!");
<a name="line1299">1299 |</a> else
<a name="line1300">1300 |</a> fprintf( aliasfile, "\\!\\!:");
<a name="line1301">1301 |</a> }
<a name="line1302">1302 |</a>
<a name="line1303">1303 |</a> /**
<a name="line1304">1304 |</a> ** Recognize backslashes
<a name="line1305">1305 |</a> **/
<a name="line1306">1306 |</a> if( *cptr == '\\') {
<a name="line1307">1307 |</a> if( !nobackslash)
<a name="line1308">1308 |</a> putc( *cptr, aliasfile);
<a name="line1309">1309 |</a> else
<a name="line1310">1310 |</a> nobackslash = 0;
<a name="line1311">1311 |</a> cptr++;
<a name="line1312">1312 |</a> continue;
<a name="line1313">1313 |</a> } else
<a name="line1314">1314 |</a> nobackslash = 1;
<a name="line1315">1315 |</a>
<a name="line1316">1316 |</a> /**
<a name="line1317">1317 |</a> ** print the read character
<a name="line1318">1318 |</a> **/
<a name="line1319">1319 |</a> putc( *cptr++, aliasfile);
<a name="line1320">1320 |</a>
<a name="line1321">1321 |</a> } /** while **/
<a name="line1322">1322 |</a>
<a name="line1323">1323 |</a> /**
<a name="line1324">1324 |</a> ** Now close up the command using the alias command terminator as
<a name="line1325">1325 |</a> ** defined in the global variable
<a name="line1326">1326 |</a> **/
<a name="line1327">1327 |</a> fprintf( aliasfile, "'%c", alias_separator);
<a name="line1328">1328 |</a>
<a name="line1329">1329 |</a> /**
<a name="line1330">1330 |</a> ** Bourne shell family: The alias has to be translated into a
<a name="line1331">1331 |</a> ** function using the function call 'output_function'
<a name="line1332">1332 |</a> **/
<a name="line1333">1333 |</a> } else if( !strcmp(shell_derelict, "sh")) {
<a name="line1334">1334 |</a> /**
<a name="line1335">1335 |</a> ** Shells supporting extended bourne shell syntax ....
<a name="line1336">1336 |</a> **/
<a name="line1337">1337 |</a> if( (!strcmp( shell_name, "sh") &amp;&amp; bourne_alias)
<a name="line1338">1338 |</a> || !strcmp( shell_name, "bash")
<a name="line1339">1339 |</a> || !strcmp( shell_name, "zsh" )
<a name="line1340">1340 |</a> || !strcmp( shell_name, "ksh")) {
<a name="line1341">1341 |</a> /**
<a name="line1342">1342 |</a> ** in this case we only have to write a function if the alias
<a name="line1343">1343 |</a> ** take arguments. This is the case if the value has somewhere
<a name="line1344">1344 |</a> ** a '$' in it without a '\' infront.
<a name="line1345">1345 |</a> **/
<a name="line1346">1346 |</a> while( *cptr) {
<a name="line1347">1347 |</a> if( *cptr == '\\') {
<a name="line1348">1348 |</a> if( nobackslash) {
<a name="line1349">1349 |</a> nobackslash = 0;
<a name="line1350">1350 |</a> }
<a name="line1351">1351 |</a> } else {
<a name="line1352">1352 |</a> if( *cptr == '$') {
<a name="line1353">1353 |</a> if( nobackslash) {
<a name="line1354">1354 |</a> output_function( alias, val);
<a name="line1355">1355 |</a> return TCL_OK;
<a name="line1356">1356 |</a> }
<a name="line1357">1357 |</a> }
<a name="line1358">1358 |</a> nobackslash = 1;
<a name="line1359">1359 |</a> }
<a name="line1360">1360 |</a> cptr++;
<a name="line1361">1361 |</a> }
<a name="line1362">1362 |</a>
<a name="line1363">1363 |</a> /**
<a name="line1364">1364 |</a> ** So, we can just output an alias with '\$' translated to '$'...
<a name="line1365">1365 |</a> **/
<a name="line1366">1366 |</a> fprintf( aliasfile, "alias %s='", alias);
<a name="line1367">1367 |</a>
<a name="line1368">1368 |</a> nobackslash = 1;
<a name="line1369">1369 |</a> cptr = val;
<a name="line1370">1370 |</a>
<a name="line1371">1371 |</a> while( *cptr) {
<a name="line1372">1372 |</a> if( *cptr == '\\') {
<a name="line1373">1373 |</a> if( nobackslash) {
<a name="line1374">1374 |</a> nobackslash = 0;
<a name="line1375">1375 |</a> cptr++;
<a name="line1376">1376 |</a> continue;
<a name="line1377">1377 |</a> }
<a name="line1378">1378 |</a> }
<a name="line1379">1379 |</a> nobackslash = 1;
<a name="line1380">1380 |</a>
<a name="line1381">1381 |</a> putc(*cptr++, aliasfile);
<a name="line1382">1382 |</a>
<a name="line1383">1383 |</a> } /** while **/
<a name="line1384">1384 |</a>
<a name="line1385">1385 |</a> fprintf( aliasfile, "'%c", alias_separator);
<a name="line1386">1386 |</a>
<a name="line1387">1387 |</a> } else if( !strcmp( shell_name, "sh")
<a name="line1388">1388 |</a> &amp;&amp; bourne_funcs) {
<a name="line1389">1389 |</a> /**
<a name="line1390">1390 |</a> ** The bourne shell itself
<a name="line1391">1391 |</a> ** need to write a function unless this sh doesn't support
<a name="line1392">1392 |</a> ** functions (then just punt)
<a name="line1393">1393 |</a> **/
<a name="line1394">1394 |</a> output_function(alias, val);
<a name="line1395">1395 |</a> }
<a name="line1396">1396 |</a> /** ??? Unknown derelict ??? **/
<a name="line1397">1397 |</a>
<a name="line1398">1398 |</a> } /** if( sh ) **/
<a name="line1399">1399 |</a>
<a name="line1400">1400 |</a> return( TCL_OK);
<a name="line1401">1401 |</a>
<a name="line1402">1402 |</a> } /** End of 'output_set_alias' **/
<a name="line1403">1403 |</a>
<a name="line1404">1404 |</a> /*++++
<a name="line1405">1405 |</a> ** ** Function-Header ***************************************************** **
<a name="line1406">1406 |</a> ** **
<a name="line1407">1407 |</a> ** Function: output_unset_alias **
<a name="line1408">1408 |</a> ** **
<a name="line1409">1409 |</a> ** Description: Flush the commands required to reset shell aliases **
<a name="line1410">1410 |</a> ** depending on the current invoking shell **
<a name="line1411">1411 |</a> ** **
<a name="line1412">1412 |</a> ** First Edition: 1991/10/23 **
<a name="line1413">1413 |</a> ** **
<a name="line1414">1414 |</a> ** Parameters: const char *alias Name of the alias **
<a name="line1415">1415 |</a> ** const char *val Value which has been **
<a name="line1416">1416 |</a> ** assigned **
<a name="line1417">1417 |</a> ** **
<a name="line1418">1418 |</a> ** Result: int TCL_OK Operation successfull **
<a name="line1419">1419 |</a> ** **
<a name="line1420">1420 |</a> ** Attached Globals: aliasfile, The alias command is writte out to **
<a name="line1421">1421 |</a> ** alias_separator Defined the command separator **
<a name="line1422">1422 |</a> ** shell_derelict to determine the shell family **
<a name="line1423">1423 |</a> ** shell_name to determine the real shell type **
<a name="line1424">1424 |</a> ** **
<a name="line1425">1425 |</a> ** ************************************************************************ **
<a name="line1426">1426 |</a> ++++*/
<a name="line1427">1427 |</a>
<a name="line1428">1428 |</a> static int output_unset_alias( const char *alias,
<a name="line1429">1429 |</a> const char *val)
<a name="line1430">1430 |</a> {
<a name="line1431">1431 |</a> int nobackslash = 1; /** Controls wether backslashes are **/
<a name="line1432">1432 |</a> /** to be print **/
<a name="line1433">1433 |</a> const char *cptr = val; /** Need to read the value char by char **/
<a name="line1434">1434 |</a>
<a name="line1435">1435 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1436">1436 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_output_unset_alias, NULL);
<a name="line1437">1437 |</a> #endif
<a name="line1438">1438 |</a>
<a name="line1439">1439 |</a> /**
<a name="line1440">1440 |</a> ** Check for the shell family at first
<a name="line1441">1441 |</a> ** Ahh! CSHs ... ;-)
<a name="line1442">1442 |</a> **/
<a name="line1443">1443 |</a> if( !strcmp( shell_derelict, "csh")) {
<a name="line1444">1444 |</a> fprintf( aliasfile, "unalias %s%c", alias, alias_separator);
<a name="line1445">1445 |</a>
<a name="line1446">1446 |</a> /**
<a name="line1447">1447 |</a> ** Hmmm ... bourne shell types ;-(
<a name="line1448">1448 |</a> ** Need to unset a function in case of sh or if the alias took parameters
<a name="line1449">1449 |</a> **/
<a name="line1450">1450 |</a> } else if( !strcmp( shell_derelict, "sh")) {
<a name="line1451">1451 |</a>
<a name="line1452">1452 |</a> if( !strcmp( shell_name, "sh")) {
<a name="line1453">1453 |</a> if (bourne_alias) {
<a name="line1454">1454 |</a> fprintf(aliasfile, "unalias %s%c", alias, alias_separator);
<a name="line1455">1455 |</a> } else if (bourne_funcs) {
<a name="line1456">1456 |</a> fprintf(aliasfile,"unset -f %s%c", alias, alias_separator);
<a name="line1457">1457 |</a> } /* else do nothing */
<a name="line1458">1458 |</a> /**
<a name="line1459">1459 |</a> ** BASH
<a name="line1460">1460 |</a> **/
<a name="line1461">1461 |</a> } else if( !strcmp( shell_name, "bash")) {
<a name="line1462">1462 |</a>
<a name="line1463">1463 |</a> /**
<a name="line1464">1464 |</a> ** If we have what the old value should have been, then look to
<a name="line1465">1465 |</a> ** see if it was a function or an alias because bash spits out an
<a name="line1466">1466 |</a> ** error if you try to unalias a non-existent alias.
<a name="line1467">1467 |</a> **/
<a name="line1468">1468 |</a> if(val) {
<a name="line1469">1469 |</a>
<a name="line1470">1470 |</a> /**
<a name="line1471">1471 |</a> ** Was it a function?
<a name="line1472">1472 |</a> ** Yes, if it has arguments...
<a name="line1473">1473 |</a> **/
<a name="line1474">1474 |</a> while( *cptr) {
<a name="line1475">1475 |</a> if( *cptr == '\\') {
<a name="line1476">1476 |</a> if( nobackslash) {
<a name="line1477">1477 |</a> nobackslash = 0;
<a name="line1478">1478 |</a> }
<a name="line1479">1479 |</a> } else {
<a name="line1480">1480 |</a> if(*cptr == '$') {
<a name="line1481">1481 |</a> if( nobackslash) {
<a name="line1482">1482 |</a> fprintf(aliasfile, "unset -f %s%c", alias,
<a name="line1483">1483 |</a> alias_separator);
<a name="line1484">1484 |</a> return TCL_OK;
<a name="line1485">1485 |</a> }
<a name="line1486">1486 |</a> }
<a name="line1487">1487 |</a> nobackslash = 1;
<a name="line1488">1488 |</a> }
<a name="line1489">1489 |</a> cptr++;
<a name="line1490">1490 |</a> }
<a name="line1491">1491 |</a>
<a name="line1492">1492 |</a> /**
<a name="line1493">1493 |</a> ** Well, it wasn't a function, so we'll put out an unalias...
<a name="line1494">1494 |</a> **/
<a name="line1495">1495 |</a> fprintf( aliasfile, "unalias %s%c", alias, alias_separator);
<a name="line1496">1496 |</a>
<a name="line1497">1497 |</a> } else { /** No value known (any more?) **/
<a name="line1498">1498 |</a>
<a name="line1499">1499 |</a> /**
<a name="line1500">1500 |</a> ** We'll assume it was a function because the unalias command
<a name="line1501">1501 |</a> ** in bash produces an error. It's possible that the alias
<a name="line1502">1502 |</a> ** will not be cleared properly here because it was an
<a name="line1503">1503 |</a> ** unset-alias command.
<a name="line1504">1504 |</a> **/
<a name="line1505">1505 |</a> fprintf( aliasfile, "unset -f %s%c", alias, alias_separator);
<a name="line1506">1506 |</a> }
<a name="line1507">1507 |</a>
<a name="line1508">1508 |</a> /**
<a name="line1509">1509 |</a> ** ZSH or KSH
<a name="line1510">1510 |</a> ** Put out both because we it could be either a function or an
<a name="line1511">1511 |</a> ** alias. This will catch both.
<a name="line1512">1512 |</a> **/
<a name="line1513">1513 |</a>
<a name="line1514">1514 |</a> } else if( !strcmp( shell_name, "zsh")){
<a name="line1515">1515 |</a>
<a name="line1516">1516 |</a> fprintf(aliasfile, "unalias %s%c", alias, alias_separator);
<a name="line1517">1517 |</a>
<a name="line1518">1518 |</a> } else if( !strcmp( shell_name, "ksh")) {
<a name="line1519">1519 |</a>
<a name="line1520">1520 |</a> fprintf(aliasfile, "unalias %s%c", alias, alias_separator);
<a name="line1521">1521 |</a> fprintf(aliasfile, "unset -f %s%c", alias, alias_separator);
<a name="line1522">1522 |</a>
<a name="line1523">1523 |</a> } /** if( bash, zsh, ksh) **/
<a name="line1524">1524 |</a>
<a name="line1525">1525 |</a> /** ??? Unknown derelict ??? **/
<a name="line1526">1526 |</a>
<a name="line1527">1527 |</a> } /** if( sh-family) **/
<a name="line1528">1528 |</a>
<a name="line1529">1529 |</a> return( TCL_OK);
<a name="line1530">1530 |</a>
<a name="line1531">1531 |</a> } /** End of 'output_unset_alias' **/
<a name="line1532">1532 |</a>
<a name="line1533">1533 |</a> /*++++
<a name="line1534">1534 |</a> ** ** Function-Header ***************************************************** **
<a name="line1535">1535 |</a> ** **
<a name="line1536">1536 |</a> ** Function: getLMFILES **
<a name="line1537">1537 |</a> ** **
<a name="line1538">1538 |</a> ** Description: Read in the _LMFILES_ environment variable. This one **
<a name="line1539">1539 |</a> ** may be split into several variables cause by limited **
<a name="line1540">1540 |</a> ** variable space of some shells (esp. the SUN csh) **
<a name="line1541">1541 |</a> ** **
<a name="line1542">1542 |</a> ** First Edition: 1991/10/23 **
<a name="line1543">1543 |</a> ** **
<a name="line1544">1544 |</a> ** Parameters: Tcl_Interp *interp Attached Tcl interpreter **
<a name="line1545">1545 |</a> ** **
<a name="line1546">1546 |</a> ** Result: char* Value of the environment varibale _LMFILES_ **
<a name="line1547">1547 |</a> ** **
<a name="line1548">1548 |</a> ** Attached Globals: **
<a name="line1549">1549 |</a> ** **
<a name="line1550">1550 |</a> ** ************************************************************************ **
<a name="line1551">1551 |</a> ++++*/
<a name="line1552">1552 |</a>
<a name="line1553">1553 |</a> char *getLMFILES( Tcl_Interp *interp)
<a name="line1554">1554 |</a> {
<a name="line1555">1555 |</a> static char *lmfiles = NULL; /** Buffer pointer for the value **/
<a name="line1556">1556 |</a>
<a name="line1557">1557 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1558">1558 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_getLMFILES, NULL);
<a name="line1559">1559 |</a> #endif
<a name="line1560">1560 |</a>
<a name="line1561">1561 |</a> /**
<a name="line1562">1562 |</a> ** Try to read the variable _LMFILES_. If the according buffer pointer
<a name="line1563">1563 |</a> ** contains a value, disallocate it before.
<a name="line1564">1564 |</a> **/
<a name="line1565">1565 |</a> if( lmfiles)
<a name="line1566">1566 |</a> null_free((void *) &amp;lmfiles);
<a name="line1567">1567 |</a>
<a name="line1568">1568 |</a> lmfiles = (char *) Tcl_GetVar2( interp, "env","_LMFILES_",TCL_GLOBAL_ONLY);
<a name="line1569">1569 |</a>
<a name="line1570">1570 |</a> /**
<a name="line1571">1571 |</a> ** Now the pointer is NULL in case of the variable has not been defined.
<a name="line1572">1572 |</a> ** In this case try to read in the splitted variable from _LMFILES_xxx
<a name="line1573">1573 |</a> **/
<a name="line1574">1574 |</a> if( !lmfiles) {
<a name="line1575">1575 |</a>
<a name="line1576">1576 |</a> char buffer[ MOD_BUFSIZE]; /** Used to set up the split variab- **/
<a name="line1577">1577 |</a> /** les name **/
<a name="line1578">1578 |</a> int count = 0; /** Split part count **/
<a name="line1579">1579 |</a> int lmsize = 0; /** Total size of _LMFILES_ content **/
<a name="line1580">1580 |</a> int old_lmsize; /** Size save buffer **/
<a name="line1581">1581 |</a> int cptr_len; /** Size of the current split part **/
<a name="line1582">1582 |</a> char *cptr; /** Split part read pointer **/
<a name="line1583">1583 |</a>
<a name="line1584">1584 |</a> /**
<a name="line1585">1585 |</a> ** Set up the split part environment variable name and try to read it
<a name="line1586">1586 |</a> ** in
<a name="line1587">1587 |</a> **/
<a name="line1588">1588 |</a> sprintf( buffer, "_LMFILES_%03d", count++);
<a name="line1589">1589 |</a> cptr = (char *) Tcl_GetVar2( interp, "env", buffer, TCL_GLOBAL_ONLY);
<a name="line1590">1590 |</a>
<a name="line1591">1591 |</a> while( cptr) { /** Something available **/
<a name="line1592">1592 |</a>
<a name="line1593">1593 |</a> /**
<a name="line1594">1594 |</a> ** Count up the variables length
<a name="line1595">1595 |</a> **/
<a name="line1596">1596 |</a> cptr_len = strlen( cptr);
<a name="line1597">1597 |</a> old_lmsize = lmsize;
<a name="line1598">1598 |</a> lmsize += cptr_len;
<a name="line1599">1599 |</a>
<a name="line1600">1600 |</a> /**
<a name="line1601">1601 |</a> ** Reallocate the value's buffer and copy the current split
<a name="line1602">1602 |</a> ** part at its end
<a name="line1603">1603 |</a> **/
<a name="line1604">1604 |</a> if((char *) NULL == (lmfiles =
<a name="line1605">1605 |</a> (char*) realloc( lmfiles, lmsize * sizeof(char) + 1))) {
<a name="line1606">1606 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line1607">1607 |</a> return( NULL); /** ---- EXIT (FAILURE) ---&gt; **/
<a name="line1608">1608 |</a> }
<a name="line1609">1609 |</a>
<a name="line1610">1610 |</a> strncpy( lmfiles + old_lmsize, cptr, cptr_len);
<a name="line1611">1611 |</a> *(lmfiles + old_lmsize + cptr_len) = '\0';
<a name="line1612">1612 |</a>
<a name="line1613">1613 |</a> /**
<a name="line1614">1614 |</a> ** Read the next split part variable
<a name="line1615">1615 |</a> **/
<a name="line1616">1616 |</a> sprintf( buffer, "_LMFILES_%03d", count++);
<a name="line1617">1617 |</a> cptr = (char *) Tcl_GetVar2( interp,"env",buffer, TCL_GLOBAL_ONLY);
<a name="line1618">1618 |</a> }
<a name="line1619">1619 |</a>
<a name="line1620">1620 |</a> } else { /** if( lmfiles) **/
<a name="line1621">1621 |</a>
<a name="line1622">1622 |</a> /**
<a name="line1623">1623 |</a> ** If the environvariable _LMFILES_ has been set, copy the contents
<a name="line1624">1624 |</a> ** of the returned buffer into a free allocated one in order to
<a name="line1625">1625 |</a> ** avoid side effects.
<a name="line1626">1626 |</a> **/
<a name="line1627">1627 |</a> char *tmp = strdup(lmfiles);
<a name="line1628">1628 |</a>
<a name="line1629">1629 |</a> if( !tmp)
<a name="line1630">1630 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line1631">1631 |</a> return( NULL); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line1632">1632 |</a>
<a name="line1633">1633 |</a> /**
<a name="line1634">1634 |</a> ** Set up lmfiles pointing to the new buffer in order to be able to
<a name="line1635">1635 |</a> ** disallocate when invoked next time.
<a name="line1636">1636 |</a> **/
<a name="line1637">1637 |</a> lmfiles = tmp;
<a name="line1638">1638 |</a>
<a name="line1639">1639 |</a> } /** if( lmfiles) **/
<a name="line1640">1640 |</a>
<a name="line1641">1641 |</a> /**
<a name="line1642">1642 |</a> ** Return the received value to the caller
<a name="line1643">1643 |</a> **/
<a name="line1644">1644 |</a> return( lmfiles);
<a name="line1645">1645 |</a>
<a name="line1646">1646 |</a> } /** end of 'getLMFILES' **/
<a name="line1647">1647 |</a>
<a name="line1648">1648 |</a> /*++++
<a name="line1649">1649 |</a> ** ** Function-Header ***************************************************** **
<a name="line1650">1650 |</a> ** **
<a name="line1651">1651 |</a> ** Function: IsLoaded **
<a name="line1652">1652 |</a> ** **
<a name="line1653">1653 |</a> ** Description: Check wether the passed modulefile is cirrently **
<a name="line1654">1654 |</a> ** loaded **
<a name="line1655">1655 |</a> ** **
<a name="line1656">1656 |</a> ** First Edition: 1991/10/23 **
<a name="line1657">1657 |</a> ** **
<a name="line1658">1658 |</a> ** Parameters: Tcl_Interp *interp According Tcl interp.**
<a name="line1659">1659 |</a> ** char *modulename Name of the module to**
<a name="line1660">1660 |</a> ** be searched for **
<a name="line1661">1661 |</a> ** char **realname Buffer for the name **
<a name="line1662">1662 |</a> ** and version of the **
<a name="line1663">1663 |</a> ** module that has mat- **
<a name="line1664">1664 |</a> ** ched the query **
<a name="line1665">1665 |</a> ** char *filename Buffer to store the **
<a name="line1666">1666 |</a> ** whole filename of a **
<a name="line1667">1667 |</a> ** found loaded module **
<a name="line1668">1668 |</a> ** **
<a name="line1669">1669 |</a> ** Result: int 0 Requested module not loaded **
<a name="line1670">1670 |</a> ** 1 module is loaded **
<a name="line1671">1671 |</a> ** **
<a name="line1672">1672 |</a> ** realname points to the name of the module that**
<a name="line1673">1673 |</a> ** has matched the query. If this poin- **
<a name="line1674">1674 |</a> ** differs form 'modulename' after this **
<a name="line1675">1675 |</a> ** function has finished, the buffer for**
<a name="line1676">1676 |</a> ** to store the module name in has been **
<a name="line1677">1677 |</a> ** allocated here. **
<a name="line1678">1678 |</a> ** if (char **) NULL is passed, no buf- **
<a name="line1679">1679 |</a> ** fer will be allocated **
<a name="line1680">1680 |</a> ** ??? Is this freed correctly by the caller ???**
<a name="line1681">1681 |</a> ** **
<a name="line1682">1682 |</a> ** filename will be filled with the full module **
<a name="line1683">1683 |</a> ** file path of the module that has **
<a name="line1684">1684 |</a> ** matched the query **
<a name="line1685">1685 |</a> ** **
<a name="line1686">1686 |</a> ** Attached Globals: **
<a name="line1687">1687 |</a> ** **
<a name="line1688">1688 |</a> ** ************************************************************************ **
<a name="line1689">1689 |</a> ++++*/
<a name="line1690">1690 |</a>
<a name="line1691">1691 |</a> /**
<a name="line1692">1692 |</a> ** Check all possibilities of module-versions
<a name="line1693">1693 |</a> **/
<a name="line1694">1694 |</a>
<a name="line1695">1695 |</a> int IsLoaded( Tcl_Interp *interp,
<a name="line1696">1696 |</a> char *modulename,
<a name="line1697">1697 |</a> char **realname,
<a name="line1698">1698 |</a> char *filename )
<a name="line1699">1699 |</a> {
<a name="line1700">1700 |</a> return( __IsLoaded( interp, modulename, realname, filename, 0));
<a name="line1701">1701 |</a> }
<a name="line1702">1702 |</a>
<a name="line1703">1703 |</a> /**
<a name="line1704">1704 |</a> ** Check only an exact match of the passed module and version
<a name="line1705">1705 |</a> **/
<a name="line1706">1706 |</a> int IsLoaded_ExactMatch( Tcl_Interp *interp,
<a name="line1707">1707 |</a> char *modulename,
<a name="line1708">1708 |</a> char **realname,
<a name="line1709">1709 |</a> char *filename )
<a name="line1710">1710 |</a> {
<a name="line1711">1711 |</a> return( __IsLoaded( interp, modulename, realname, filename, 1));
<a name="line1712">1712 |</a> }
<a name="line1713">1713 |</a>
<a name="line1714">1714 |</a> /**
<a name="line1715">1715 |</a> ** The subroutine __IsLoaded finally checks for the requested module being
<a name="line1716">1716 |</a> ** loaded or not.
<a name="line1717">1717 |</a> **/
<a name="line1718">1718 |</a> static int __IsLoaded( Tcl_Interp *interp,
<a name="line1719">1719 |</a> char *modulename,
<a name="line1720">1720 |</a> char **realname,
<a name="line1721">1721 |</a> char *filename,
<a name="line1722">1722 |</a> int exact)
<a name="line1723">1723 |</a> {
<a name="line1724">1724 |</a> char *l_modules = NULL; /** Internal module list buffer **/
<a name="line1725">1725 |</a> char *l_modulefiles = NULL; /** Internal module file list buffer **/
<a name="line1726">1726 |</a> char *loaded = NULL; /** Buffer for the module **/
<a name="line1727">1727 |</a> char *basename = NULL; /** Pointer to module basename **/
<a name="line1728">1728 |</a> char *loadedmodule_path = NULL; /** Pointer to one loaded module out **/
<a name="line1729">1729 |</a> /** of the loaded modules list **/
<a name="line1730">1730 |</a> int count = 0;
<a name="line1731">1731 |</a>
<a name="line1732">1732 |</a> /**
<a name="line1733">1733 |</a> ** Get a list of loaded modules (environment variable 'LOADEDMODULES')
<a name="line1734">1734 |</a> ** and the list of loaded module-files (env. var. __LMFILES__)
<a name="line1735">1735 |</a> **/
<a name="line1736">1736 |</a> char *loaded_modules = (char *) Tcl_GetVar2( interp, "env",
<a name="line1737">1737 |</a> "LOADEDMODULES", TCL_GLOBAL_ONLY);
<a name="line1738">1738 |</a> char *loaded_modulefiles = getLMFILES( interp);
<a name="line1739">1739 |</a>
<a name="line1740">1740 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1741">1741 |</a> ErrorLogger( NO_ERR_START, LOC, _proc___IsLoaded, NULL);
<a name="line1742">1742 |</a> #endif
<a name="line1743">1743 |</a>
<a name="line1744">1744 |</a> /**
<a name="line1745">1745 |</a> ** If no module is currently loaded ... the requested module is surely
<a name="line1746">1746 |</a> ** not loaded, too ;-)
<a name="line1747">1747 |</a> **/
<a name="line1748">1748 |</a> if( !loaded_modules)
<a name="line1749">1749 |</a> goto unwind0;
<a name="line1750">1750 |</a>
<a name="line1751">1751 |</a> /**
<a name="line1752">1752 |</a> ** Copy the list of currently loaded modules into a new allocated array
<a name="line1753">1753 |</a> ** for further handling. If this fails it will be assumed, that the
<a name="line1754">1754 |</a> ** module is *NOT* loaded.
<a name="line1755">1755 |</a> **/
<a name="line1756">1756 |</a> if((char *) NULL == (l_modules = stringer(NULL,0,loaded_modules,NULL)))
<a name="line1757">1757 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line1758">1758 |</a> goto unwind0;
<a name="line1759">1759 |</a>
<a name="line1760">1760 |</a> /**
<a name="line1761">1761 |</a> ** Copy the list of currently loaded modulefiles into a new allocated
<a name="line1762">1762 |</a> ** array for further handling. If this failes it will be assumed, that
<a name="line1763">1763 |</a> ** the module is *NOT* loaded.
<a name="line1764">1764 |</a> **/
<a name="line1765">1765 |</a> if(loaded_modulefiles)
<a name="line1766">1766 |</a> if((char *) NULL == (l_modulefiles = stringer(NULL,0,
<a name="line1767">1767 |</a> loaded_modulefiles,NULL)))
<a name="line1768">1768 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line1769">1769 |</a> goto unwind1;
<a name="line1770">1770 |</a>
<a name="line1771">1771 |</a> /**
<a name="line1772">1772 |</a> ** Assume the modulename given was an exact match so there is no
<a name="line1773">1773 |</a> ** difference to return -- this will change in the case it wasn't an
<a name="line1774">1774 |</a> ** exact match below
<a name="line1775">1775 |</a> **/
<a name="line1776">1776 |</a> if( realname)
<a name="line1777">1777 |</a> *realname = modulename;
<a name="line1778">1778 |</a>
<a name="line1779">1779 |</a> if( *l_modules) {
<a name="line1780">1780 |</a>
<a name="line1781">1781 |</a> /**
<a name="line1782">1782 |</a> ** Get each single module which is loaded by splitting up at colons
<a name="line1783">1783 |</a> ** The variable LOADEDMODULES contains a list of modulefile like the
<a name="line1784">1784 |</a> ** following:
<a name="line1785">1785 |</a> ** gnu/2.0:openwin/3.0
<a name="line1786">1786 |</a> **/
<a name="line1787">1787 |</a> loadedmodule_path = strtok( l_modules, ":");
<a name="line1788">1788 |</a> while( loadedmodule_path) {
<a name="line1789">1789 |</a>
<a name="line1790">1790 |</a> if((char *) NULL == (loaded = stringer(NULL,0,
<a name="line1791">1791 |</a> loadedmodule_path,NULL)))
<a name="line1792">1792 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line1793">1793 |</a> goto unwind2;
<a name="line1794">1794 |</a>
<a name="line1795">1795 |</a> /**
<a name="line1796">1796 |</a> ** Get a modulefile without a version and check if this is the
<a name="line1797">1797 |</a> ** requested one.
<a name="line1798">1798 |</a> **/
<a name="line1799">1799 |</a> if( !strcmp( loaded, modulename)) { /** FOUND **/
<a name="line1800">1800 |</a>
<a name="line1801">1801 |</a> null_free ((void *) &amp;loaded);
<a name="line1802">1802 |</a> break; /** leave the while loop **/
<a name="line1803">1803 |</a>
<a name="line1804">1804 |</a> } else if( !exact) { /** NOT FOUND **/
<a name="line1805">1805 |</a>
<a name="line1806">1806 |</a> /**
<a name="line1807">1807 |</a> ** Try to more and more simplify the modulename by removing
<a name="line1808">1808 |</a> ** all detail (version) information
<a name="line1809">1809 |</a> **/
<a name="line1810">1810 |</a> basename = get_module_basename( loaded);
<a name="line1811">1811 |</a> while( basename &amp;&amp; strcmp( basename, modulename)) {
<a name="line1812">1812 |</a> basename = get_module_basename( basename);
<a name="line1813">1813 |</a> }
<a name="line1814">1814 |</a>
<a name="line1815">1815 |</a> /**
<a name="line1816">1816 |</a> ** Something left after splitting again? If yes the requested
<a name="line1817">1817 |</a> ** module is found!
<a name="line1818">1818 |</a> ** Since the name given was a basename, return the fully
<a name="line1819">1819 |</a> ** loaded path
<a name="line1820">1820 |</a> **/
<a name="line1821">1821 |</a> if( basename) {
<a name="line1822">1822 |</a> null_free ((void *) &amp;loaded);
<a name="line1823">1823 |</a> if( realname)
<a name="line1824">1824 |</a> if((char *) NULL == (*realname = stringer(NULL,0,
<a name="line1825">1825 |</a> loadedmodule_path,NULL)))
<a name="line1826">1826 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line1827">1827 |</a> goto unwind2;
<a name="line1828">1828 |</a>
<a name="line1829">1829 |</a> break; /** leave the while loop **/
<a name="line1830">1830 |</a>
<a name="line1831">1831 |</a> } /** if( basename) **/
<a name="line1832">1832 |</a> } /** if not found with single basename **/
<a name="line1833">1833 |</a>
<a name="line1834">1834 |</a> /**
<a name="line1835">1835 |</a> ** Get the next entry from the loaded modules list
<a name="line1836">1836 |</a> **/
<a name="line1837">1837 |</a> loadedmodule_path = strtok( NULL, ":");
<a name="line1838">1838 |</a> count++;
<a name="line1839">1839 |</a>
<a name="line1840">1840 |</a> null_free ((void *) &amp;loaded); /** Free what has been alloc. **/
<a name="line1841">1841 |</a>
<a name="line1842">1842 |</a> } /** while **/
<a name="line1843">1843 |</a> } /** if( *l_modules) **/
<a name="line1844">1844 |</a>
<a name="line1845">1845 |</a> /**
<a name="line1846">1846 |</a> ** If we found something locate it's associated modulefile
<a name="line1847">1847 |</a> **/
<a name="line1848">1848 |</a> if( loadedmodule_path) {
<a name="line1849">1849 |</a> if( filename &amp;&amp; l_modulefiles &amp;&amp; *l_modulefiles) {
<a name="line1850">1850 |</a>
<a name="line1851">1851 |</a> /**
<a name="line1852">1852 |</a> ** The position of the loaded module within the list of loaded
<a name="line1853">1853 |</a> ** modules has been counted in 'count'. The position of the
<a name="line1854">1854 |</a> ** associated modulefile should be the same. So tokenize the
<a name="line1855">1855 |</a> ** list of modulefiles by the colon until the wanted position
<a name="line1856">1856 |</a> ** is reached.
<a name="line1857">1857 |</a> **/
<a name="line1858">1858 |</a> char* modulefile_path = strtok(l_modulefiles, ":");
<a name="line1859">1859 |</a>
<a name="line1860">1860 |</a> while( count) {
<a name="line1861">1861 |</a> if( !( modulefile_path = strtok( NULL, ":"))) {
<a name="line1862">1862 |</a>
<a name="line1863">1863 |</a> /**
<a name="line1864">1864 |</a> ** Oops! Fewer entries in the list of loaded modulefiles
<a name="line1865">1865 |</a> ** than in the list of loaded modules. This will
<a name="line1866">1866 |</a> ** generally suggest that _LMFILES_ has become corrupted,
<a name="line1867">1867 |</a> ** but it may just mean we're working intermittantly with
<a name="line1868">1868 |</a> ** an old version. So, I'll just not touch filename which
<a name="line1869">1869 |</a> ** means the search will continue using the old method of
<a name="line1870">1870 |</a> ** looking through MODULEPATH.
<a name="line1871">1871 |</a> */
<a name="line1872">1872 |</a> goto success0;
<a name="line1873">1873 |</a> }
<a name="line1874">1874 |</a> count--;
<a name="line1875">1875 |</a>
<a name="line1876">1876 |</a> } /** while **/
<a name="line1877">1877 |</a>
<a name="line1878">1878 |</a> /**
<a name="line1879">1879 |</a> ** Copy the result into the buffer passed from the caller
<a name="line1880">1880 |</a> **/
<a name="line1881">1881 |</a> strcpy( filename, modulefile_path);
<a name="line1882">1882 |</a> }
<a name="line1883">1883 |</a>
<a name="line1884">1884 |</a> /**
<a name="line1885">1885 |</a> ** FOUND.
<a name="line1886">1886 |</a> ** free up everything which has been allocated and return on success
<a name="line1887">1887 |</a> **/
<a name="line1888">1888 |</a> goto success0;
<a name="line1889">1889 |</a> }
<a name="line1890">1890 |</a>
<a name="line1891">1891 |</a> /**
<a name="line1892">1892 |</a> ** NOT FOUND. Free up everything which has been alloc'd and return on
<a name="line1893">1893 |</a> ** failure
<a name="line1894">1894 |</a> **/
<a name="line1895">1895 |</a>
<a name="line1896">1896 |</a> unwind2:
<a name="line1897">1897 |</a> if( l_modulefiles)
<a name="line1898">1898 |</a> null_free((void *) &amp;l_modulefiles);
<a name="line1899">1899 |</a> unwind1:
<a name="line1900">1900 |</a> null_free((void *) &amp;l_modules);
<a name="line1901">1901 |</a> unwind0:
<a name="line1902">1902 |</a> return( 0); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line1903">1903 |</a>
<a name="line1904">1904 |</a> success0:
<a name="line1905">1905 |</a> if( l_modulefiles)
<a name="line1906">1906 |</a> null_free((void *) &amp;l_modulefiles);
<a name="line1907">1907 |</a> null_free((void *) &amp;l_modules);
<a name="line1908">1908 |</a> return( 1); /** -------- EXIT (SUCCESS) -------&gt; **/
<a name="line1909">1909 |</a>
<a name="line1910">1910 |</a> } /** End of '__IsLoaded' **/
<a name="line1911">1911 |</a>
<a name="line1912">1912 |</a> /*++++
<a name="line1913">1913 |</a> ** ** Function-Header ***************************************************** **
<a name="line1914">1914 |</a> ** **
<a name="line1915">1915 |</a> ** Function: chk_marked_entry, set_marked_entry **
<a name="line1916">1916 |</a> ** **
<a name="line1917">1917 |</a> ** Description: When switching, the variables are marked with a mar- **
<a name="line1918">1918 |</a> ** ker that is tested to see if the variable was changed**
<a name="line1919">1919 |</a> ** in the second modulefile. If it was not, then the **
<a name="line1920">1920 |</a> ** variable is unset. **
<a name="line1921">1921 |</a> ** **
<a name="line1922">1922 |</a> ** First Edition: 1992/10/25 **
<a name="line1923">1923 |</a> ** **
<a name="line1924">1924 |</a> ** Parameters: Tcl_HashTable *table Attached hash table **
<a name="line1925">1925 |</a> ** char *var According variable name **
<a name="line1926">1926 |</a> ** int val Value to be set. **
<a name="line1927">1927 |</a> ** **
<a name="line1928">1928 |</a> ** Result: int 0 Mark not set (or the value of the **
<a name="line1929">1929 |</a> ** mark was 0 ;-) **
<a name="line1930">1930 |</a> ** else Value of the mark that has been set **
<a name="line1931">1931 |</a> ** with set_marked_entry. **
<a name="line1932">1932 |</a> ** Attached Globals: - **
<a name="line1933">1933 |</a> ** **
<a name="line1934">1934 |</a> ** ************************************************************************ **
<a name="line1935">1935 |</a> ++++*/
<a name="line1936">1936 |</a>
<a name="line1937">1937 |</a> intptr_t chk_marked_entry( Tcl_HashTable *table,
<a name="line1938">1938 |</a> char *var)
<a name="line1939">1939 |</a> {
<a name="line1940">1940 |</a> Tcl_HashEntry *hentry;
<a name="line1941">1941 |</a>
<a name="line1942">1942 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1943">1943 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_chk_marked_entry, NULL);
<a name="line1944">1944 |</a> #endif
<a name="line1945">1945 |</a>
<a name="line1946">1946 |</a> if( hentry = Tcl_FindHashEntry( table, var))
<a name="line1947">1947 |</a> return((intptr_t) Tcl_GetHashValue( hentry));
<a name="line1948">1948 |</a> else
<a name="line1949">1949 |</a> return 0;
<a name="line1950">1950 |</a> }
<a name="line1951">1951 |</a>
<a name="line1952">1952 |</a> void set_marked_entry( Tcl_HashTable *table,
<a name="line1953">1953 |</a> char *var,
<a name="line1954">1954 |</a> intptr_t val)
<a name="line1955">1955 |</a> {
<a name="line1956">1956 |</a> Tcl_HashEntry *hentry;
<a name="line1957">1957 |</a> int new;
<a name="line1958">1958 |</a>
<a name="line1959">1959 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1960">1960 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_set_marked_entry, NULL);
<a name="line1961">1961 |</a> #endif
<a name="line1962">1962 |</a>
<a name="line1963">1963 |</a> if( hentry = Tcl_CreateHashEntry( table, var, &amp;new)) {
<a name="line1964">1964 |</a> if( val)
<a name="line1965">1965 |</a> Tcl_SetHashValue( hentry, val);
<a name="line1966">1966 |</a> }
<a name="line1967">1967 |</a>
<a name="line1968">1968 |</a> /** ??? Shouldn't there be an error return in case of hash creation
<a name="line1969">1969 |</a> failing ??? **/
<a name="line1970">1970 |</a> }
<a name="line1971">1971 |</a>
<a name="line1972">1972 |</a> /*++++
<a name="line1973">1973 |</a> ** ** Function-Header ***************************************************** **
<a name="line1974">1974 |</a> ** **
<a name="line1975">1975 |</a> ** Function: get_module_basename **
<a name="line1976">1976 |</a> ** **
<a name="line1977">1977 |</a> ** Description: Get the name of a module without its version. **
<a name="line1978">1978 |</a> ** This function modifies the string passed in. **
<a name="line1979">1979 |</a> ** **
<a name="line1980">1980 |</a> ** First Edition: 1991/10/23 **
<a name="line1981">1981 |</a> ** **
<a name="line1982">1982 |</a> ** Parameters: char *modulename Full module name **
<a name="line1983">1983 |</a> ** **
<a name="line1984">1984 |</a> ** Result: char* Module name without version **
<a name="line1985">1985 |</a> ** **
<a name="line1986">1986 |</a> ** Attached Globals: **
<a name="line1987">1987 |</a> ** **
<a name="line1988">1988 |</a> ** ************************************************************************ **
<a name="line1989">1989 |</a> ++++*/
<a name="line1990">1990 |</a>
<a name="line1991">1991 |</a> static char *get_module_basename( char *modulename)
<a name="line1992">1992 |</a> {
<a name="line1993">1993 |</a> char *version; /** Used to locate the version sep. **/
<a name="line1994">1994 |</a>
<a name="line1995">1995 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line1996">1996 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_get_module_basename, NULL);
<a name="line1997">1997 |</a> #endif
<a name="line1998">1998 |</a>
<a name="line1999">1999 |</a> /**
<a name="line2000">2000 |</a> ** Use strrchr to locate the very last version string on the module
<a name="line2001">2001 |</a> ** name.
<a name="line2002">2002 |</a> **/
<a name="line2003">2003 |</a> if((version = strrchr( modulename, '/'))) {
<a name="line2004">2004 |</a> *version = '\0';
<a name="line2005">2005 |</a> } else {
<a name="line2006">2006 |</a> modulename = NULL;
<a name="line2007">2007 |</a> }
<a name="line2008">2008 |</a>
<a name="line2009">2009 |</a> /**
<a name="line2010">2010 |</a> ** Return the *COPIED* string
<a name="line2011">2011 |</a> **/
<a name="line2012">2012 |</a> return( modulename);
<a name="line2013">2013 |</a>
<a name="line2014">2014 |</a> } /** End of 'get_module_basename' **/
<a name="line2015">2015 |</a>
<a name="line2016">2016 |</a> /*++++
<a name="line2017">2017 |</a> ** ** Function-Header ***************************************************** **
<a name="line2018">2018 |</a> ** **
<a name="line2019">2019 |</a> ** Function: Update_LoadedList **
<a name="line2020">2020 |</a> ** **
<a name="line2021">2021 |</a> ** Description: Add or remove the passed modulename and filename to/ **
<a name="line2022">2022 |</a> ** from LOADEDMODULES and _LMFILES_ **
<a name="line2023">2023 |</a> ** **
<a name="line2024">2024 |</a> ** First Edition: 1991/10/23 **
<a name="line2025">2025 |</a> ** **
<a name="line2026">2026 |</a> ** Parameters: Tcl_Interp *interp Attached Tcl Interp. **
<a name="line2027">2027 |</a> ** char *modulename Name of the module **
<a name="line2028">2028 |</a> ** char *filename Full path name of the**
<a name="line2029">2029 |</a> ** related modulefile **
<a name="line2030">2030 |</a> ** **
<a name="line2031">2031 |</a> ** Result: int 1 Successfull operation **
<a name="line2032">2032 |</a> ** **
<a name="line2033">2033 |</a> ** Attached Globals: g_flags Controls whether the modulename **
<a name="line2034">2034 |</a> ** should be added (M_XXXX) or removed **
<a name="line2035">2035 |</a> ** (M_REMOVE) from the list of loaded **
<a name="line2036">2036 |</a> ** modules **
<a name="line2037">2037 |</a> ** **
<a name="line2038">2038 |</a> ** ************************************************************************ **
<a name="line2039">2039 |</a> ++++*/
<a name="line2040">2040 |</a>
<a name="line2041">2041 |</a> int Update_LoadedList( Tcl_Interp *interp,
<a name="line2042">2042 |</a> char *modulename,
<a name="line2043">2043 |</a> char *filename)
<a name="line2044">2044 |</a> {
<a name="line2045">2045 |</a> char *argv[4];
<a name="line2046">2046 |</a> char *basename;
<a name="line2047">2047 |</a> char *module;
<a name="line2048">2048 |</a>
<a name="line2049">2049 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line2050">2050 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Update_LoadedList, NULL);
<a name="line2051">2051 |</a> #endif
<a name="line2052">2052 |</a>
<a name="line2053">2053 |</a> /**
<a name="line2054">2054 |</a> ** Apply changes to LOADEDMODULES first
<a name="line2055">2055 |</a> **/
<a name="line2056">2056 |</a> argv[1] = "LOADEDMODULES";
<a name="line2057">2057 |</a> argv[2] = modulename;
<a name="line2058">2058 |</a> argv[3] = NULL;
<a name="line2059">2059 |</a>
<a name="line2060">2060 |</a> if(g_flags &amp; M_REMOVE) {
<a name="line2061">2061 |</a> argv[0] = "remove-path";
<a name="line2062">2062 |</a> cmdRemovePath( 0, interp, 3, (CONST84 char **) argv);
<a name="line2063">2063 |</a> } else {
<a name="line2064">2064 |</a> argv[0] = "append-path";
<a name="line2065">2065 |</a> cmdSetPath( 0, interp, 3, (CONST84 char **) argv);
<a name="line2066">2066 |</a> }
<a name="line2067">2067 |</a>
<a name="line2068">2068 |</a> /**
<a name="line2069">2069 |</a> ** Apply changes to _LMFILES_ now
<a name="line2070">2070 |</a> **/
<a name="line2071">2071 |</a> argv[1] = "_LMFILES_";
<a name="line2072">2072 |</a> argv[2] = filename;
<a name="line2073">2073 |</a> argv[3] = NULL;
<a name="line2074">2074 |</a>
<a name="line2075">2075 |</a> if(g_flags &amp; M_REMOVE) {
<a name="line2076">2076 |</a> argv[0] = "remove-path";
<a name="line2077">2077 |</a> cmdRemovePath( 0, interp, 3, (CONST84 char **) argv);
<a name="line2078">2078 |</a> } else {
<a name="line2079">2079 |</a> argv[0] = "append-path";
<a name="line2080">2080 |</a> cmdSetPath( 0, interp, 3, (CONST84 char **) argv);
<a name="line2081">2081 |</a> }
<a name="line2082">2082 |</a>
<a name="line2083">2083 |</a> /**
<a name="line2084">2084 |</a> ** A module with just the basename might have been added and now we're
<a name="line2085">2085 |</a> ** removing one of its versions. We'll want to look for the basename in
<a name="line2086">2086 |</a> ** the path too.
<a name="line2087">2087 |</a> **/
<a name="line2088">2088 |</a> if( g_flags &amp; M_REMOVE) {
<a name="line2089">2089 |</a> module = strdup( modulename);
<a name="line2090">2090 |</a> basename = module;
<a name="line2091">2091 |</a> if( basename = get_module_basename( basename)) {
<a name="line2092">2092 |</a> argv[2] = basename;
<a name="line2093">2093 |</a> argv[0] = "remove-path";
<a name="line2094">2094 |</a> cmdRemovePath( 0, interp, 3, (CONST84 char **) argv);
<a name="line2095">2095 |</a> }
<a name="line2096">2096 |</a> null_free((void *) &amp;module);
<a name="line2097">2097 |</a> }
<a name="line2098">2098 |</a>
<a name="line2099">2099 |</a> /**
<a name="line2100">2100 |</a> ** Return on success
<a name="line2101">2101 |</a> **/
<a name="line2102">2102 |</a> return( 1);
<a name="line2103">2103 |</a>
<a name="line2104">2104 |</a> } /** End of 'Update_LoadedList' **/
<a name="line2105">2105 |</a>
<a name="line2106">2106 |</a> /*++++
<a name="line2107">2107 |</a> ** ** Function-Header ***************************************************** **
<a name="line2108">2108 |</a> ** **
<a name="line2109">2109 |</a> ** Function: check_magic **
<a name="line2110">2110 |</a> ** **
<a name="line2111">2111 |</a> ** Description: Check the magic cookie of the file passed as para- **
<a name="line2112">2112 |</a> ** meter if it is a valid module file **
<a name="line2113">2113 |</a> ** Based on check_magic in Richard Elling's **
<a name="line2114">2114 |</a> ** find_by_magic &lt;Richard.Elling"@eng.auburn.edu&gt; **
<a name="line2115">2115 |</a> ** **
<a name="line2116">2116 |</a> ** First Edition: 1991/10/23 **
<a name="line2117">2117 |</a> ** **
<a name="line2118">2118 |</a> ** Parameters: char *filename Name of the file to check **
<a name="line2119">2119 |</a> ** char *magic_name Magic cookie **
<a name="line2120">2120 |</a> ** int magic_len Length of the magic cookie **
<a name="line2121">2121 |</a> ** **
<a name="line2122">2122 |</a> ** Result: int 0 Magic cookie doesn't match or any **
<a name="line2123">2123 |</a> ** I/O error **
<a name="line2124">2124 |</a> ** 1 Success - Magic cookie has matched **
<a name="line2125">2125 |</a> ** **
<a name="line2126">2126 |</a> ** Attached Globals: - **
<a name="line2127">2127 |</a> ** **
<a name="line2128">2128 |</a> ** ************************************************************************ **
<a name="line2129">2129 |</a> ++++*/
<a name="line2130">2130 |</a>
<a name="line2131">2131 |</a> int check_magic( char *filename,
<a name="line2132">2132 |</a> char *magic_name,
<a name="line2133">2133 |</a> int magic_len)
<a name="line2134">2134 |</a> {
<a name="line2135">2135 |</a> int fd; /** File descriptor for reading in **/
<a name="line2136">2136 |</a> int read_len; /** Number of bytes read **/
<a name="line2137">2137 |</a> char buf[BUFSIZ]; /** Read buffer **/
<a name="line2138">2138 |</a>
<a name="line2139">2139 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line2140">2140 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_check_magic, NULL);
<a name="line2141">2141 |</a> #endif
<a name="line2142">2142 |</a>
<a name="line2143">2143 |</a> /**
<a name="line2144">2144 |</a> ** Parameter check. The length of the magic cookie shouldn't exceed the
<a name="line2145">2145 |</a> ** length of out read buffer
<a name="line2146">2146 |</a> **/
<a name="line2147">2147 |</a> if( magic_len &gt; BUFSIZ)
<a name="line2148">2148 |</a> return 0;
<a name="line2149">2149 |</a>
<a name="line2150">2150 |</a> /**
<a name="line2151">2151 |</a> ** Open the file and read in as many bytes as required for checking the
<a name="line2152">2152 |</a> ** magic cookie. If there's an I/O error (Unable to open the file or
<a name="line2153">2153 |</a> ** less than magic_len have been read) return on failure.
<a name="line2154">2154 |</a> **/
<a name="line2155">2155 |</a> if( 0 &gt; (fd = open( filename, O_RDONLY)))
<a name="line2156">2156 |</a> if( OK != ErrorLogger( ERR_OPEN, LOC, filename, "reading", NULL))
<a name="line2157">2157 |</a> return( 0); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line2158">2158 |</a>
<a name="line2159">2159 |</a> read_len = read( fd, buf, magic_len);
<a name="line2160">2160 |</a>
<a name="line2161">2161 |</a> if( 0 &gt; close(fd))
<a name="line2162">2162 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, filename, NULL))
<a name="line2163">2163 |</a> return( 0); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line2164">2164 |</a>
<a name="line2165">2165 |</a> if( read_len &lt; magic_len)
<a name="line2166">2166 |</a> return( 0);
<a name="line2167">2167 |</a>
<a name="line2168">2168 |</a> /**
<a name="line2169">2169 |</a> ** Check the magic cookie now
<a name="line2170">2170 |</a> **/
<a name="line2171">2171 |</a> return( !strncmp( buf, magic_name, magic_len));
<a name="line2172">2172 |</a>
<a name="line2173">2173 |</a> } /** end of 'check_magic' **/
<a name="line2174">2174 |</a>
<a name="line2175">2175 |</a> /*++++
<a name="line2176">2176 |</a> ** ** Function-Header ***************************************************** **
<a name="line2177">2177 |</a> ** **
<a name="line2178">2178 |</a> ** Function: cleanse_path **
<a name="line2179">2179 |</a> ** **
<a name="line2180">2180 |</a> ** Description: Copy the passed path into the new path buffer and **
<a name="line2181">2181 |</a> ** devalue '.' and '+' **
<a name="line2182">2182 |</a> ** **
<a name="line2183">2183 |</a> ** First Edition: 1991/10/23 **
<a name="line2184">2184 |</a> ** **
<a name="line2185">2185 |</a> ** Parameters: const char *path Original path **
<a name="line2186">2186 |</a> ** char *newpath Buffer for to copy the new **
<a name="line2187">2187 |</a> ** path in **
<a name="line2188">2188 |</a> ** int len Max length of the new path **
<a name="line2189">2189 |</a> ** **
<a name="line2190">2190 |</a> ** Result: newpath will be filled up with the new, de- **
<a name="line2191">2191 |</a> ** valuated path **
<a name="line2192">2192 |</a> ** **
<a name="line2193">2193 |</a> ** Attached Globals: - **
<a name="line2194">2194 |</a> ** **
<a name="line2195">2195 |</a> ** ************************************************************************ **
<a name="line2196">2196 |</a> ++++*/
<a name="line2197">2197 |</a>
<a name="line2198">2198 |</a> void cleanse_path( const char *path,
<a name="line2199">2199 |</a> char *newpath,
<a name="line2200">2200 |</a> int len)
<a name="line2201">2201 |</a> {
<a name="line2202">2202 |</a> unsigned int path_len = strlen( path); /** Length of the orig. path **/
<a name="line2203">2203 |</a> int i, /** Read index **/
<a name="line2204">2204 |</a> j; /** Write index **/
<a name="line2205">2205 |</a>
<a name="line2206">2206 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line2207">2207 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_cleanse_path, NULL);
<a name="line2208">2208 |</a> #endif
<a name="line2209">2209 |</a>
<a name="line2210">2210 |</a> /**
<a name="line2211">2211 |</a> ** Stopping at (len - 1) ensures that the newpath string can be
<a name="line2212">2212 |</a> ** null-terminated below.
<a name="line2213">2213 |</a> **/
<a name="line2214">2214 |</a> for( i=0, j=0; i&lt;path_len &amp;&amp; j&lt;(len - 1); i++, j++) {
<a name="line2215">2215 |</a>
<a name="line2216">2216 |</a> switch(*path) {
<a name="line2217">2217 |</a> case '.':
<a name="line2218">2218 |</a> case '+':
<a name="line2219">2219 |</a> *newpath++ = '\\'; /** devalue '.' and '+' **/
<a name="line2220">2220 |</a> j++;
<a name="line2221">2221 |</a> break;
<a name="line2222">2222 |</a> }
<a name="line2223">2223 |</a>
<a name="line2224">2224 |</a> /**
<a name="line2225">2225 |</a> ** Flush the current character into the newpath buffer
<a name="line2226">2226 |</a> **/
<a name="line2227">2227 |</a> *newpath++ = *path++;
<a name="line2228">2228 |</a>
<a name="line2229">2229 |</a> } /** for **/
<a name="line2230">2230 |</a>
<a name="line2231">2231 |</a> /**
<a name="line2232">2232 |</a> ** Put a string terminator at the newpaths end
<a name="line2233">2233 |</a> **/
<a name="line2234">2234 |</a> *newpath = '\0';
<a name="line2235">2235 |</a>
<a name="line2236">2236 |</a> } /** End of 'cleanse_path' **/
<a name="line2237">2237 |</a>
<a name="line2238">2238 |</a> /*++++
<a name="line2239">2239 |</a> ** ** Function-Header ***************************************************** **
<a name="line2240">2240 |</a> ** **
<a name="line2241">2241 |</a> ** Function: chop **
<a name="line2242">2242 |</a> ** **
<a name="line2243">2243 |</a> ** Description: Remove '\n' characters from the passed string **
<a name="line2244">2244 |</a> ** **
<a name="line2245">2245 |</a> ** First Edition: 1991/10/23 **
<a name="line2246">2246 |</a> ** **
<a name="line2247">2247 |</a> ** Parameters: char *string String to be chopped **
<a name="line2248">2248 |</a> ** **
<a name="line2249">2249 |</a> ** Result: string The chopped string **
<a name="line2250">2250 |</a> ** **
<a name="line2251">2251 |</a> ** Attached Globals: - **
<a name="line2252">2252 |</a> ** **
<a name="line2253">2253 |</a> ** ************************************************************************ **
<a name="line2254">2254 |</a> ++++*/
<a name="line2255">2255 |</a>
<a name="line2256">2256 |</a> static char *chop( const char *string)
<a name="line2257">2257 |</a> {
<a name="line2258">2258 |</a> char *s, *t; /** source and target pointers **/
<a name="line2259">2259 |</a>
<a name="line2260">2260 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line2261">2261 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_chop, NULL);
<a name="line2262">2262 |</a> #endif
<a name="line2263">2263 |</a>
<a name="line2264">2264 |</a> /**
<a name="line2265">2265 |</a> ** Remove '\n'
<a name="line2266">2266 |</a> **/
<a name="line2267">2267 |</a>
<a name="line2268">2268 |</a> s = t = (char *) string;
<a name="line2269">2269 |</a> while( *s) {
<a name="line2270">2270 |</a> if( '\n' == *s)
<a name="line2271">2271 |</a> s++;
<a name="line2272">2272 |</a> else
<a name="line2273">2273 |</a> *t++ = *s++;
<a name="line2274">2274 |</a> }
<a name="line2275">2275 |</a>
<a name="line2276">2276 |</a> /**
<a name="line2277">2277 |</a> ** Copy the trailing terminator and return
<a name="line2278">2278 |</a> **/
<a name="line2279">2279 |</a> *t++ = '\0';
<a name="line2280">2280 |</a> return( (char *) string);
<a name="line2281">2281 |</a>
<a name="line2282">2282 |</a> } /** End of 'chop' **/
<a name="line2283">2283 |</a>
<a name="line2284">2284 |</a> #ifndef HAVE_STRDUP
<a name="line2285">2285 |</a>
<a name="line2286">2286 |</a> /*++++
<a name="line2287">2287 |</a> ** ** Function-Header ***************************************************** **
<a name="line2288">2288 |</a> ** **
<a name="line2289">2289 |</a> ** Function: strdup **
<a name="line2290">2290 |</a> ** **
<a name="line2291">2291 |</a> ** Description: Makes new space to put a copy of the given string **
<a name="line2292">2292 |</a> ** into and then copies the string into the new space. **
<a name="line2293">2293 |</a> ** Just like the "standard" strdup(3). **
<a name="line2294">2294 |</a> ** **
<a name="line2295">2295 |</a> ** First Edition: 1991/10/23 **
<a name="line2296">2296 |</a> ** **
<a name="line2297">2297 |</a> ** Parameters: **
<a name="line2298">2298 |</a> ** Result: **
<a name="line2299">2299 |</a> ** Attached Globals: **
<a name="line2300">2300 |</a> ** **
<a name="line2301">2301 |</a> ** ************************************************************************ **
<a name="line2302">2302 |</a> ++++*/
<a name="line2303">2303 |</a>
<a name="line2304">2304 |</a> char *strdup( char *str)
<a name="line2305">2305 |</a> {
<a name="line2306">2306 |</a> char* new;
<a name="line2307">2307 |</a> if ((char *) NULL) == (new = stringer(NULL,0, str, NULL))
<a name="line2308">2308 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, filename, NULL))
<a name="line2309">2309 |</a> return( (char*) NULL); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line2310">2310 |</a> return( new); /** -------- EXIT (SUCCESS) -------&gt; **/
<a name="line2311">2311 |</a> }
<a name="line2312">2312 |</a> #endif /* HAVE_STRDUP */
<a name="line2313">2313 |</a>
<a name="line2314">2314 |</a> #ifndef HAVE_STRTOK
<a name="line2315">2315 |</a>
<a name="line2316">2316 |</a> /*++++
<a name="line2317">2317 |</a> ** ** Function-Header ***************************************************** **
<a name="line2318">2318 |</a> ** **
<a name="line2319">2319 |</a> ** Function: strtok **
<a name="line2320">2320 |</a> ** **
<a name="line2321">2321 |</a> ** Description: Considers the string s1 to consist of a sequence of **
<a name="line2322">2322 |</a> ** zero or more text tokens separated by spans of one **
<a name="line2323">2323 |</a> ** or more characters from the separator string s2. **
<a name="line2324">2324 |</a> ** Just like the "standard" strtok(3). **
<a name="line2325">2325 |</a> ** **
<a name="line2326">2326 |</a> ** Note: This function is from the Berkeley BSD distribution. **
<a name="line2327">2327 |</a> ** It was modified to fit our needs! **
<a name="line2328">2328 |</a> ** **
<a name="line2329">2329 |</a> ** First Edition: 1991/10/23 **
<a name="line2330">2330 |</a> ** **
<a name="line2331">2331 |</a> ** Parameters: **
<a name="line2332">2332 |</a> ** Result: **
<a name="line2333">2333 |</a> ** Attached Globals: **
<a name="line2334">2334 |</a> ** **
<a name="line2335">2335 |</a> ** ************************************************************************ **
<a name="line2336">2336 |</a> ++++*/
<a name="line2337">2337 |</a>
<a name="line2338">2338 |</a> /*
<a name="line2339">2339 |</a> * Copyright (c) 1988 Regents of the University of California.
<a name="line2340">2340 |</a> * All rights reserved.
<a name="line2341">2341 |</a> *
<a name="line2342">2342 |</a> * Redistribution and use in source and binary forms, with or without
<a name="line2343">2343 |</a> * modification, are permitted provided that the following conditions
<a name="line2344">2344 |</a> * are met:
<a name="line2345">2345 |</a> * 1. Redistributions of source code must retain the above copyright
<a name="line2346">2346 |</a> * notice, this list of conditions and the following disclaimer.
<a name="line2347">2347 |</a> * 2. Redistributions in binary form must reproduce the above copyright
<a name="line2348">2348 |</a> * notice, this list of conditions and the following disclaimer in the
<a name="line2349">2349 |</a> * documentation and/or other materials provided with the distribution.
<a name="line2350">2350 |</a> * 3. All advertising materials mentioning features or use of this software
<a name="line2351">2351 |</a> * must display the following acknowledgement:
<a name="line2352">2352 |</a> * This product includes software developed by the University of
<a name="line2353">2353 |</a> * California, Berkeley and its contributors.
<a name="line2354">2354 |</a> * 4. Neither the name of the University nor the names of its contributors
<a name="line2355">2355 |</a> * may be used to endorse or promote products derived from this software
<a name="line2356">2356 |</a> * without specific prior written permission.
<a name="line2357">2357 |</a> *
<a name="line2358">2358 |</a> * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
<a name="line2359">2359 |</a> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<a name="line2360">2360 |</a> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
<a name="line2361">2361 |</a> * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
<a name="line2362">2362 |</a> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<a name="line2363">2363 |</a> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
<a name="line2364">2364 |</a> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
<a name="line2365">2365 |</a> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
<a name="line2366">2366 |</a> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
<a name="line2367">2367 |</a> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
<a name="line2368">2368 |</a> * SUCH DAMAGE.
<a name="line2369">2369 |</a> */
<a name="line2370">2370 |</a>
<a name="line2371">2371 |</a> char *strtok( char *s,
<a name="line2372">2372 |</a> const char *delim)
<a name="line2373">2373 |</a> {
<a name="line2374">2374 |</a> register char *spanp;
<a name="line2375">2375 |</a> register int c, sc;
<a name="line2376">2376 |</a> char *tok;
<a name="line2377">2377 |</a> static char *last;
<a name="line2378">2378 |</a>
<a name="line2379">2379 |</a>
<a name="line2380">2380 |</a> if( s == NULL &amp;&amp; (s = last) == NULL)
<a name="line2381">2381 |</a> return (NULL);
<a name="line2382">2382 |</a>
<a name="line2383">2383 |</a> /*
<a name="line2384">2384 |</a> * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
<a name="line2385">2385 |</a> */
<a name="line2386">2386 |</a> cont:
<a name="line2387">2387 |</a> c = *s++;
<a name="line2388">2388 |</a> for( spanp = (char *)delim; (sc = *spanp++) != 0;) {
<a name="line2389">2389 |</a> if (c == sc)
<a name="line2390">2390 |</a> goto cont;
<a name="line2391">2391 |</a> }
<a name="line2392">2392 |</a>
<a name="line2393">2393 |</a> if( !c) { /* no non-delimiter characters */
<a name="line2394">2394 |</a> last = NULL;
<a name="line2395">2395 |</a> return (NULL);
<a name="line2396">2396 |</a> }
<a name="line2397">2397 |</a> tok = s - 1;
<a name="line2398">2398 |</a>
<a name="line2399">2399 |</a> /*
<a name="line2400">2400 |</a> * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
<a name="line2401">2401 |</a> * Note that delim must have one NUL; we stop if we see that, too.
<a name="line2402">2402 |</a> */
<a name="line2403">2403 |</a> for (;;) {
<a name="line2404">2404 |</a> c = *s++;
<a name="line2405">2405 |</a> spanp = (char *)delim;
<a name="line2406">2406 |</a> do {
<a name="line2407">2407 |</a> if ((sc = *spanp++) == c) {
<a name="line2408">2408 |</a> if (c == 0)
<a name="line2409">2409 |</a> s = NULL;
<a name="line2410">2410 |</a> else
<a name="line2411">2411 |</a> s[-1] = 0;
<a name="line2412">2412 |</a> last = s;
<a name="line2413">2413 |</a> return (tok);
<a name="line2414">2414 |</a> }
<a name="line2415">2415 |</a> } while (sc != 0);
<a name="line2416">2416 |</a> }
<a name="line2417">2417 |</a> /* NOTREACHED */
<a name="line2418">2418 |</a>
<a name="line2419">2419 |</a> } /** End of 'strtok' **/
<a name="line2420">2420 |</a> #endif
<a name="line2421">2421 |</a>
<a name="line2422">2422 |</a> /*++++
<a name="line2423">2423 |</a> ** ** Function-Header ***************************************************** **
<a name="line2424">2424 |</a> ** **
<a name="line2425">2425 |</a> ** Function: chk4spch **
<a name="line2426">2426 |</a> ** **
<a name="line2427">2427 |</a> ** Description: goes through the given string and changes any non- **
<a name="line2428">2428 |</a> ** printable characters to question marks. **
<a name="line2429">2429 |</a> ** **
<a name="line2430">2430 |</a> ** First Edition: 1991/10/23 **
<a name="line2431">2431 |</a> ** **
<a name="line2432">2432 |</a> ** Parameters: char *s String to be checke **
<a name="line2433">2433 |</a> ** **
<a name="line2434">2434 |</a> ** Result: *s Will be changed accordingly **
<a name="line2435">2435 |</a> ** **
<a name="line2436">2436 |</a> ** Attached Globals: - **
<a name="line2437">2437 |</a> ** **
<a name="line2438">2438 |</a> ** ************************************************************************ **
<a name="line2439">2439 |</a> ++++*/
<a name="line2440">2440 |</a>
<a name="line2441">2441 |</a> void chk4spch(char* s)
<a name="line2442">2442 |</a> {
<a name="line2443">2443 |</a> for( ; *s; s++)
<a name="line2444">2444 |</a> if( !isgraph( *s)) *s = '?';
<a name="line2445">2445 |</a>
<a name="line2446">2446 |</a> } /** End of 'chk4spch' **/
<a name="line2447">2447 |</a>
<a name="line2448">2448 |</a> /*++++
<a name="line2449">2449 |</a> ** ** Function-Header ***************************************************** **
<a name="line2450">2450 |</a> ** **
<a name="line2451">2451 |</a> ** Function: xdup **
<a name="line2452">2452 |</a> ** **
<a name="line2453">2453 |</a> ** Description: will return a string with 1 level of environment **
<a name="line2454">2454 |</a> ** variables expanded. The limit is MOD_BUFSIZE. **
<a name="line2455">2455 |</a> ** An env.var. is denoted with either $name or ${name} **
<a name="line2456">2456 |</a> ** \$ escapes the expansion and substitutes a '$' in **
<a name="line2457">2457 |</a> ** its place. **
<a name="line2458">2458 |</a> ** **
<a name="line2459">2459 |</a> ** First Edition: 2000/01/21 R.K.Owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line2460">2460 |</a> ** **
<a name="line2461">2461 |</a> ** Parameters: char *string Environment variable **
<a name="line2462">2462 |</a> ** **
<a name="line2463">2463 |</a> ** Result: char * An allocated string **
<a name="line2464">2464 |</a> ** **
<a name="line2465">2465 |</a> ** ************************************************************************ **
<a name="line2466">2466 |</a> ++++*/
<a name="line2467">2467 |</a>
<a name="line2468">2468 |</a>
<a name="line2469">2469 |</a> char *xdup(char const *string) {
<a name="line2470">2470 |</a> char *result = NULL;
<a name="line2471">2471 |</a> char *dollarptr;
<a name="line2472">2472 |</a>
<a name="line2473">2473 |</a> if (string == (char *)NULL) return result;
<a name="line2474">2474 |</a>
<a name="line2475">2475 |</a> /** need to work from copy of string **/
<a name="line2476">2476 |</a> if (((char *) NULL) == (result = stringer(NULL,0, string, NULL)))
<a name="line2477">2477 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line2478">2478 |</a> return( (char*) NULL); /** -------- EXIT (FAILURE) -------&gt; **/
<a name="line2479">2479 |</a>
<a name="line2480">2480 |</a> /** check for '$' else just pass strdup of it **/
<a name="line2481">2481 |</a> if ((dollarptr = strchr(result, '$')) == (char *) NULL) {
<a name="line2482">2482 |</a> return result;
<a name="line2483">2483 |</a> } else {
<a name="line2484">2484 |</a> /** found something **/
<a name="line2485">2485 |</a> char const *envvar;
<a name="line2486">2486 |</a> char buffer[MOD_BUFSIZE];
<a name="line2487">2487 |</a> char oldbuffer[MOD_BUFSIZE];
<a name="line2488">2488 |</a> size_t blen = 0; /** running buffer length **/
<a name="line2489">2489 |</a> char *slashptr = result;/** where to continue parsing **/
<a name="line2490">2490 |</a> char slashchr; /** store slash char **/
<a name="line2491">2491 |</a> int brace; /** flag if ${name} **/
<a name="line2492">2492 |</a> pid_t pid; /** the process id **/
<a name="line2493">2493 |</a>
<a name="line2494">2494 |</a> /** zero out buffers */
<a name="line2495">2495 |</a> memset( buffer, '\0', MOD_BUFSIZE);
<a name="line2496">2496 |</a> memset(oldbuffer, '\0', MOD_BUFSIZE);
<a name="line2497">2497 |</a>
<a name="line2498">2498 |</a> /** copy everything upto $ into old buffer **/
<a name="line2499">2499 |</a> *dollarptr = '\0';
<a name="line2500">2500 |</a> strncpy(oldbuffer, slashptr, MOD_BUFSIZE);
<a name="line2501">2501 |</a> *dollarptr = '$';
<a name="line2502">2502 |</a>
<a name="line2503">2503 |</a> while (dollarptr) {
<a name="line2504">2504 |</a> if (*oldbuffer) strncpy(buffer, oldbuffer, MOD_BUFSIZE);
<a name="line2505">2505 |</a> blen = strlen(buffer);
<a name="line2506">2506 |</a>
<a name="line2507">2507 |</a> /** get the env.var. name **/
<a name="line2508">2508 |</a> if (*(dollarptr + 1) == '{') {
<a name="line2509">2509 |</a> brace = 1;
<a name="line2510">2510 |</a> slashptr = strchr(dollarptr + 1, '}');
<a name="line2511">2511 |</a> } else if (*(dollarptr + 1) == '$') {
<a name="line2512">2512 |</a> slashptr = dollarptr + 2;
<a name="line2513">2513 |</a> } else {
<a name="line2514">2514 |</a> slashptr = dollarptr + 1
<a name="line2515">2515 |</a> + strcspn(dollarptr + 1,"/:$\\");
<a name="line2516">2516 |</a> brace = 0;
<a name="line2517">2517 |</a> }
<a name="line2518">2518 |</a> if (*slashptr) {
<a name="line2519">2519 |</a> slashchr = *slashptr;
<a name="line2520">2520 |</a> *slashptr = '\0';
<a name="line2521">2521 |</a> } else slashptr = (char *)NULL;
<a name="line2522">2522 |</a>
<a name="line2523">2523 |</a> /** see if escaped **/
<a name="line2524">2524 |</a> if ((result != dollarptr) &amp;&amp; *(dollarptr - 1) == '\\') {
<a name="line2525">2525 |</a> /** replace \ with 0 and copy rest of name **/
<a name="line2526">2526 |</a> buffer[blen - 1] = '\0';
<a name="line2527">2527 |</a> strncat(buffer, dollarptr, MOD_BUFSIZE-blen);
<a name="line2528">2528 |</a> blen = strlen(buffer);
<a name="line2529">2529 |</a> if(brace)
<a name="line2530">2530 |</a> strncat(buffer,"}",MOD_BUFSIZE-blen-1);
<a name="line2531">2531 |</a> } else {
<a name="line2532">2532 |</a> if (! strcmp(dollarptr + 1 + brace, "$")) {
<a name="line2533">2533 |</a> /** put in the process pid **/
<a name="line2534">2534 |</a> pid = getpid();
<a name="line2535">2535 |</a> sprintf(buffer + blen,"%ld",(long)pid);
<a name="line2536">2536 |</a> } else {
<a name="line2537">2537 |</a> /** get env.var. value **/
<a name="line2538">2538 |</a> envvar = getenv(dollarptr + 1 + brace);
<a name="line2539">2539 |</a>
<a name="line2540">2540 |</a> /** cat value to rest of string **/
<a name="line2541">2541 |</a> if (envvar) strncat(buffer,envvar,
<a name="line2542">2542 |</a> MOD_BUFSIZE-blen-1);
<a name="line2543">2543 |</a> }
<a name="line2544">2544 |</a> }
<a name="line2545">2545 |</a> blen = strlen(buffer);
<a name="line2546">2546 |</a>
<a name="line2547">2547 |</a> /** start at slashptr and find next $ **/
<a name="line2548">2548 |</a> if (slashptr) {
<a name="line2549">2549 |</a> *slashptr = slashchr;
<a name="line2550">2550 |</a> dollarptr = strchr(slashptr, '$');
<a name="line2551">2551 |</a> /** copy everything upto $ **/
<a name="line2552">2552 |</a> if (dollarptr) *dollarptr = '\0';
<a name="line2553">2553 |</a> strncat(buffer, slashptr + brace,
<a name="line2554">2554 |</a> MOD_BUFSIZE -blen -1);
<a name="line2555">2555 |</a> if (dollarptr) {
<a name="line2556">2556 |</a> *dollarptr = '$';
<a name="line2557">2557 |</a> strncpy(oldbuffer, buffer, MOD_BUFSIZE);
<a name="line2558">2558 |</a> }
<a name="line2559">2559 |</a> } else { /** no more to show **/
<a name="line2560">2560 |</a> dollarptr = (char *)NULL;
<a name="line2561">2561 |</a> }
<a name="line2562">2562 |</a> }
<a name="line2563">2563 |</a> null_free((void *) &amp;result);
<a name="line2564">2564 |</a> return strdup(buffer);
<a name="line2565">2565 |</a> }
<a name="line2566">2566 |</a>
<a name="line2567">2567 |</a> } /** End of 'xdup' **/
<a name="line2568">2568 |</a>
<a name="line2569">2569 |</a> /*++++
<a name="line2570">2570 |</a> ** ** Function-Header ***************************************************** **
<a name="line2571">2571 |</a> ** **
<a name="line2572">2572 |</a> ** Function: xgetenv **
<a name="line2573">2573 |</a> ** **
<a name="line2574">2574 |</a> ** Description: will return an expanded environment variable. **
<a name="line2575">2575 |</a> ** However, it will only expand 1 level. **
<a name="line2576">2576 |</a> ** See xdup() for details. **
<a name="line2577">2577 |</a> ** **
<a name="line2578">2578 |</a> ** First Edition: 2000/01/18 R.K.Owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line2579">2579 |</a> ** **
<a name="line2580">2580 |</a> ** Parameters: char *var Environment variable **
<a name="line2581">2581 |</a> ** **
<a name="line2582">2582 |</a> ** Result: char * An allocated string **
<a name="line2583">2583 |</a> ** **
<a name="line2584">2584 |</a> ** Attached Globals: - **
<a name="line2585">2585 |</a> ** **
<a name="line2586">2586 |</a> ** ************************************************************************ **
<a name="line2587">2587 |</a> ++++*/
<a name="line2588">2588 |</a>
<a name="line2589">2589 |</a> char *xgetenv(char const * var) {
<a name="line2590">2590 |</a> char *result = NULL;
<a name="line2591">2591 |</a>
<a name="line2592">2592 |</a> if (var == (char *)NULL) return result;
<a name="line2593">2593 |</a>
<a name="line2594">2594 |</a> return xdup(getenv(var));
<a name="line2595">2595 |</a>
<a name="line2596">2596 |</a> } /** End of 'xgetenv' **/
<a name="line2597">2597 |</a>
<a name="line2598">2598 |</a> /*++++
<a name="line2599">2599 |</a> ** ** Function-Header ***************************************************** **
<a name="line2600">2600 |</a> ** **
<a name="line2601">2601 |</a> ** Function: EscapeCshString(char* in,char* out) **
<a name="line2602">2602 |</a> ** **
<a name="line2603">2603 |</a> ** Description: will translate input string to escaped output string **
<a name="line2604">2604 |</a> ** out must be allocated first **
<a name="line2605">2605 |</a> ** **
<a name="line2606">2606 |</a> ** First Edition: 2002/04/10 **
<a name="line2607">2607 |</a> ** **
<a name="line2608">2608 |</a> ** Parameters: char *in input **
<a name="line2609">2609 |</a> ** char *out output **
<a name="line2610">2610 |</a> ** **
<a name="line2611">2611 |</a> ** Attached Globals: - **
<a name="line2612">2612 |</a> ** **
<a name="line2613">2613 |</a> ** ************************************************************************ **
<a name="line2614">2614 |</a> ++++*/
<a name="line2615">2615 |</a>
<a name="line2616">2616 |</a> void EscapeCshString(const char* in,
<a name="line2617">2617 |</a> char* out) {
<a name="line2618">2618 |</a>
<a name="line2619">2619 |</a> for(;*in;in++) {
<a name="line2620">2620 |</a> if (*in == ' ' ||
<a name="line2621">2621 |</a> *in == '\t'||
<a name="line2622">2622 |</a> *in == '\\'||
<a name="line2623">2623 |</a> *in == '{' ||
<a name="line2624">2624 |</a> *in == '}' ||
<a name="line2625">2625 |</a> *in == '|' ||
<a name="line2626">2626 |</a> *in == '&lt;' ||
<a name="line2627">2627 |</a> *in == '&gt;' ||
<a name="line2628">2628 |</a> *in == '!' ||
<a name="line2629">2629 |</a> *in == '#' ||
<a name="line2630">2630 |</a> *in == '$' ||
<a name="line2631">2631 |</a> *in == '^' ||
<a name="line2632">2632 |</a> *in == '&amp;' ||
<a name="line2633">2633 |</a> *in == '*' ||
<a name="line2634">2634 |</a> *in == '\''||
<a name="line2635">2635 |</a> *in == '"' ||
<a name="line2636">2636 |</a> *in == '(' ||
<a name="line2637">2637 |</a> *in == ')') {
<a name="line2638">2638 |</a> *out++ = '\\';
<a name="line2639">2639 |</a> }
<a name="line2640">2640 |</a> *out++ = *in;
<a name="line2641">2641 |</a> }
<a name="line2642">2642 |</a> *out = 0;
<a name="line2643">2643 |</a> }
<a name="line2644">2644 |</a>
<a name="line2645">2645 |</a> void EscapeShString(const char* in,
<a name="line2646">2646 |</a> char* out) {
<a name="line2647">2647 |</a>
<a name="line2648">2648 |</a> for(;*in;in++) {
<a name="line2649">2649 |</a> if (*in == ' ' ||
<a name="line2650">2650 |</a> *in == '\t'||
<a name="line2651">2651 |</a> *in == '\\'||
<a name="line2652">2652 |</a> *in == '{' ||
<a name="line2653">2653 |</a> *in == '}' ||
<a name="line2654">2654 |</a> *in == '|' ||
<a name="line2655">2655 |</a> *in == '&lt;' ||
<a name="line2656">2656 |</a> *in == '&gt;' ||
<a name="line2657">2657 |</a> *in == '!' ||
<a name="line2658">2658 |</a> *in == '#' ||
<a name="line2659">2659 |</a> *in == '$' ||
<a name="line2660">2660 |</a> *in == '^' ||
<a name="line2661">2661 |</a> *in == '&amp;' ||
<a name="line2662">2662 |</a> *in == '*' ||
<a name="line2663">2663 |</a> *in == '\''||
<a name="line2664">2664 |</a> *in == '"' ||
<a name="line2665">2665 |</a> *in == '(' ||
<a name="line2666">2666 |</a> *in == ')') {
<a name="line2667">2667 |</a> *out++ = '\\';
<a name="line2668">2668 |</a> }
<a name="line2669">2669 |</a> *out++ = *in;
<a name="line2670">2670 |</a> }
<a name="line2671">2671 |</a> *out = 0;
<a name="line2672">2672 |</a> }
<a name="line2673">2673 |</a>
<a name="line2674">2674 |</a> void EscapePerlString(const char* in,
<a name="line2675">2675 |</a> char* out) {
<a name="line2676">2676 |</a>
<a name="line2677">2677 |</a> for(;*in;in++) {
<a name="line2678">2678 |</a> if (*in == '\\'||
<a name="line2679">2679 |</a> *in == '\'') {
<a name="line2680">2680 |</a> *out++ = '\\';
<a name="line2681">2681 |</a> }
<a name="line2682">2682 |</a> *out++ = *in;
<a name="line2683">2683 |</a> }
<a name="line2684">2684 |</a> *out = 0;
<a name="line2685">2685 |</a> }
<a name="line2686">2686 |</a>
<a name="line2687">2687 |</a> /*++++
<a name="line2688">2688 |</a> ** ** Function-Header ***************************************************** **
<a name="line2689">2689 |</a> ** **
<a name="line2690">2690 |</a> ** Function: tmpfile_mod **
<a name="line2691">2691 |</a> ** **
<a name="line2692">2692 |</a> ** Description: emulates tempnam and tmpnam and mktemp **
<a name="line2693">2693 |</a> ** Atomically creates a unique temp file and opens it **
<a name="line2694">2694 |</a> ** for writing. returns 0 on success, 1 on failure **
<a name="line2695">2695 |</a> ** Filename and file handle are returned through **
<a name="line2696">2696 |</a> ** argument pointers **
<a name="line2697">2697 |</a> ** **
<a name="line2698">2698 |</a> ** First Edition: 2002/04/22 **
<a name="line2699">2699 |</a> ** **
<a name="line2700">2700 |</a> ** Parameters: char **filename pointer to char* **
<a name="line2701">2701 |</a> ** char **file pointer to FILE* **
<a name="line2702">2702 |</a> ** **
<a name="line2703">2703 |</a> ** Attached Globals: - **
<a name="line2704">2704 |</a> ** **
<a name="line2705">2705 |</a> ** ************************************************************************ **
<a name="line2706">2706 |</a> ++++*/
<a name="line2707">2707 |</a>
<a name="line2708">2708 |</a> int tmpfile_mod(char** filename, FILE** file) {
<a name="line2709">2709 |</a> char* filename2;
<a name="line2710">2710 |</a> FILE* f = NULL;
<a name="line2711">2711 |</a> int trial = 0;
<a name="line2712">2712 |</a>
<a name="line2713">2713 |</a> if ((char *) NULL == (filename2 =
<a name="line2714">2714 |</a> stringer(NULL, strlen(TMP_DIR)+strlen("modulesource")+20, NULL)))
<a name="line2715">2715 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
<a name="line2716">2716 |</a> return 1;
<a name="line2717">2717 |</a>
<a name="line2718">2718 |</a> do {
<a name="line2719">2719 |</a> int fildes;
<a name="line2720">2720 |</a>
<a name="line2721">2721 |</a> sprintf(filename2,"%s/modulesource_%d",TMP_DIR,trial++);
<a name="line2722">2722 |</a> fildes = open(filename2,O_WRONLY | O_CREAT | O_EXCL | O_TRUNC,0755);
<a name="line2723">2723 |</a> #if 0
<a name="line2724">2724 |</a> fprintf(stderr,"DEBUG: filename=%s fildes=%d\n",
<a name="line2725">2725 |</a> filename2,fildes);
<a name="line2726">2726 |</a> #endif
<a name="line2727">2727 |</a> if (fildes &gt;=0) {
<a name="line2728">2728 |</a> *file = fdopen(fildes,"w");
<a name="line2729">2729 |</a> *filename = filename2;
<a name="line2730">2730 |</a> return 0;
<a name="line2731">2731 |</a> }
<a name="line2732">2732 |</a> } while (trial &lt; 1000);
<a name="line2733">2733 |</a>
<a name="line2734">2734 |</a> null_free((void *) &amp;filename2);
<a name="line2735">2735 |</a> fprintf(stderr,
<a name="line2736">2736 |</a> "FATAL: could not get a temp file! at %s(%d)",__FILE__,__LINE__);
<a name="line2737">2737 |</a>
<a name="line2738">2738 |</a> return 1;
<a name="line2739">2739 |</a> }
<a name="line2740">2740 |</a>
<a name="line2741">2741 |</a>
<a name="line2742">2742 |</a> /*++++
<a name="line2743">2743 |</a> ** ** Function-Header ***************************************************** **
<a name="line2744">2744 |</a> ** **
<a name="line2745">2745 |</a> ** Function: stringer **
<a name="line2746">2746 |</a> ** **
<a name="line2747">2747 |</a> ** Description: Safely copies and concats series of strings **
<a name="line2748">2748 |</a> ** until it hits a NULL argument. **
<a name="line2749">2749 |</a> ** Either a buffer &amp; length are given or if the buffer **
<a name="line2750">2750 |</a> ** pointer is NULL then it will allocate memory to the **
<a name="line2751">2751 |</a> ** given length. If the length is 0 then get the length **
<a name="line2752">2752 |</a> ** from the series of strings. **
<a name="line2753">2753 |</a> ** The resultant buffer is returned unless there **
<a name="line2754">2754 |</a> ** is an error then NULL is returned. **
<a name="line2755">2755 |</a> ** (Therefore, one of the main uses of stringer is to **
<a name="line2756">2756 |</a> ** allocate string memory.) **
<a name="line2757">2757 |</a> ** **
<a name="line2758">2758 |</a> ** **
<a name="line2759">2759 |</a> ** First Edition: 2001/08/08 R.K.Owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line2760">2760 |</a> ** **
<a name="line2761">2761 |</a> ** Parameters: char *buffer string buffer (if not NULL) **
<a name="line2762">2762 |</a> ** int len maximum length of buffer **
<a name="line2763">2763 |</a> ** const char *str1 1st string to copy to buffer **
<a name="line2764">2764 |</a> ** const char *str2 2nd string to cat to buffer **
<a name="line2765">2765 |</a> ** ... **
<a name="line2766">2766 |</a> ** const char *strN Nth string to cat to buffer **
<a name="line2767">2767 |</a> ** const char *NULL end of arguments **
<a name="line2768">2768 |</a> ** **
<a name="line2769">2769 |</a> ** Result: char *buffer if successfull completion **
<a name="line2770">2770 |</a> ** else NULL **
<a name="line2771">2771 |</a> ** **
<a name="line2772">2772 |</a> ** Attached Globals: - **
<a name="line2773">2773 |</a> ** **
<a name="line2774">2774 |</a> ** ************************************************************************ **
<a name="line2775">2775 |</a> ++++*/
<a name="line2776">2776 |</a>
<a name="line2777">2777 |</a> char *stringer( char * buffer,
<a name="line2778">2778 |</a> int len,
<a name="line2779">2779 |</a> ... )
<a name="line2780">2780 |</a> {
<a name="line2781">2781 |</a> va_list argptr; /** stdarg argument ptr **/
<a name="line2782">2782 |</a> char *ptr; /** argument string ptr **/
<a name="line2783">2783 |</a> char *tbuf = buffer; /** tempory buffer ptr **/
<a name="line2784">2784 |</a> int sumlen = 0; /** length of all the concat strings **/
<a name="line2785">2785 |</a> char *(*strfn)(char*,const char*) = strcpy;
<a name="line2786">2786 |</a> /** ptr to 1st string function **/
<a name="line2787">2787 |</a>
<a name="line2788">2788 |</a> #if WITH_DEBUGGING_UTIL_2
<a name="line2789">2789 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_stringer, NULL);
<a name="line2790">2790 |</a> #endif
<a name="line2791">2791 |</a>
<a name="line2792">2792 |</a> /* get start of optional arguments and sum string lengths */
<a name="line2793">2793 |</a> va_start(argptr, len);
<a name="line2794">2794 |</a> while ((ptr = va_arg(argptr, char *))) {
<a name="line2795">2795 |</a> sumlen += strlen(ptr);
<a name="line2796">2796 |</a> }
<a name="line2797">2797 |</a> va_end(argptr);
<a name="line2798">2798 |</a>
<a name="line2799">2799 |</a> /* can we even proceed? */
<a name="line2800">2800 |</a> if (tbuf &amp;&amp; (sumlen &gt;= len || len &lt; 0)) {
<a name="line2801">2801 |</a> return (char *) NULL;
<a name="line2802">2802 |</a> }
<a name="line2803">2803 |</a>
<a name="line2804">2804 |</a> /* do we need to allocate memory? */
<a name="line2805">2805 |</a> if (tbuf == (char *) NULL) {
<a name="line2806">2806 |</a> if (len == 0) {
<a name="line2807">2807 |</a> len = sumlen + 1;
<a name="line2808">2808 |</a> }
<a name="line2809">2809 |</a> if ((char *) NULL == (tbuf = (char*) malloc(len))) {
<a name="line2810">2810 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
<a name="line2811">2811 |</a> return (char *) NULL;
<a name="line2812">2812 |</a> }
<a name="line2813">2813 |</a> }
<a name="line2814">2814 |</a>
<a name="line2815">2815 |</a> /* concat all the strings to buffer */
<a name="line2816">2816 |</a> va_start(argptr, len);
<a name="line2817">2817 |</a> while ((ptr = va_arg(argptr, char *))) {
<a name="line2818">2818 |</a> strfn(tbuf, ptr);
<a name="line2819">2819 |</a> strfn = strcat;
<a name="line2820">2820 |</a> }
<a name="line2821">2821 |</a> va_end(argptr);
<a name="line2822">2822 |</a>
<a name="line2823">2823 |</a> /* got here successfully - return buffer */
<a name="line2824">2824 |</a> return tbuf;
<a name="line2825">2825 |</a>
<a name="line2826">2826 |</a> } /** End of 'stringer' **/
<a name="line2827">2827 |</a>
<a name="line2828">2828 |</a> /*++++
<a name="line2829">2829 |</a> ** ** Function-Header ***************************************************** **
<a name="line2830">2830 |</a> ** **
<a name="line2831">2831 |</a> ** Function: null_free **
<a name="line2832">2832 |</a> ** **
<a name="line2833">2833 |</a> ** Description: does a free and then nulls the pointer. **
<a name="line2834">2834 |</a> ** **
<a name="line2835">2835 |</a> ** first edition: 2000/08/24 r.k.owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line2836">2836 |</a> ** **
<a name="line2837">2837 |</a> ** parameters: void **var allocated memory **
<a name="line2838">2838 |</a> ** **
<a name="line2839">2839 |</a> ** result: void (nothing) **
<a name="line2840">2840 |</a> ** **
<a name="line2841">2841 |</a> ** attached globals: - **
<a name="line2842">2842 |</a> ** **
<a name="line2843">2843 |</a> ** ************************************************************************ **
<a name="line2844">2844 |</a> ++++*/
<a name="line2845">2845 |</a>
<a name="line2846">2846 |</a> void null_free(void ** var) {
<a name="line2847">2847 |</a>
<a name="line2848">2848 |</a> if (! *var) return; /* passed in a NULL ptr */
<a name="line2849">2849 |</a>
<a name="line2850">2850 |</a> #ifdef USE_FREE
<a name="line2851">2851 |</a> free( *var);
<a name="line2852">2852 |</a> #endif
<a name="line2853">2853 |</a> *var = NULL;
<a name="line2854">2854 |</a>
<a name="line2855">2855 |</a> } /** End of 'null_free' **/
<a name="line2856">2856 |</a>
<a name="line2857">2857 |</a> /*++++
<a name="line2858">2858 |</a> ** ** Function-Header ***************************************************** **
<a name="line2859">2859 |</a> ** **
<a name="line2860">2860 |</a> ** Function: countTclHash **
<a name="line2861">2861 |</a> ** **
<a name="line2862">2862 |</a> ** Description: returns the number of hash entries in a TclHash **
<a name="line2863">2863 |</a> ** **
<a name="line2864">2864 |</a> ** first edition: 2005/09/01 R.K.Owen &lt;rk@owen.sj.ca.us&gt; **
<a name="line2865">2865 |</a> ** **
<a name="line2866">2866 |</a> ** Parameters: Tcl_HashTable *table Hash to count **
<a name="line2867">2867 |</a> ** **
<a name="line2868">2868 |</a> ** Result: size_t Count of Hash Entries **
<a name="line2869">2869 |</a> ** **
<a name="line2870">2870 |</a> ** Attached Globals: - **
<a name="line2871">2871 |</a> ** **
<a name="line2872">2872 |</a> ** ************************************************************************ **
<a name="line2873">2873 |</a> ++++*/
<a name="line2874">2874 |</a>
<a name="line2875">2875 |</a>
<a name="line2876">2876 |</a> size_t countTclHash(Tcl_HashTable *table) {
<a name="line2877">2877 |</a> size_t result = 0;
<a name="line2878">2878 |</a> Tcl_HashSearch searchPtr; /** Tcl hash search handle **/
<a name="line2879">2879 |</a>
<a name="line2880">2880 |</a> if(Tcl_FirstHashEntry(table, &amp;searchPtr)) {
<a name="line2881">2881 |</a>
<a name="line2882">2882 |</a> do {
<a name="line2883">2883 |</a> result++;
<a name="line2884">2884 |</a> } while(Tcl_NextHashEntry( &amp;searchPtr));
<a name="line2885">2885 |</a>
<a name="line2886">2886 |</a> } /** if **/
<a name="line2887">2887 |</a>
<a name="line2888">2888 |</a> return result;
<a name="line2889">2889 |</a> } /** End of 'countHashTable' **/
</pre>
</BODY>
</HTML>