mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
321 lines
18 KiB
HTML
321 lines
18 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 ModuleCmd_Update.c
|
|
CPP : cxref-cpp -lang-c -C -dD -dI
|
|
-->
|
|
|
|
<HTML>
|
|
|
|
<HEAD>
|
|
<TITLE>Source File ModuleCmd_Update.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: ModuleCmd_Update.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: Uses the beginning environment stored the first time **
|
|
<a name="line14">14 |</a> ** each login session to reload all of the currently **
|
|
<a name="line15">15 |</a> ** **
|
|
<a name="line16">16 |</a> ** Notes: **
|
|
<a name="line17">17 |</a> ** **
|
|
<a name="line18">18 |</a> ** ************************************************************************ **
|
|
<a name="line19">19 |</a> ****/
|
|
<a name="line20">20 |</a>
|
|
<a name="line21">21 |</a> /** ** Copyright *********************************************************** **
|
|
<a name="line22">22 |</a> ** **
|
|
<a name="line23">23 |</a> ** Copyright 1991-1994 by John L. Furlan. **
|
|
<a name="line24">24 |</a> ** see LICENSE.GPL, which must be provided, for details **
|
|
<a name="line25">25 |</a> ** **
|
|
<a name="line26">26 |</a> ** ************************************************************************ **/
|
|
<a name="line27">27 |</a>
|
|
<a name="line28">28 |</a> static char Id[] = "@(#)$Id: ModuleCmd_Update.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
|
|
<a name="line29">29 |</a> static void *UseId[] = { &UseId, Id };
|
|
<a name="line30">30 |</a>
|
|
<a name="line31">31 |</a> /** ************************************************************************ **/
|
|
<a name="line32">32 |</a> /** HEADERS **/
|
|
<a name="line33">33 |</a> /** ************************************************************************ **/
|
|
<a name="line34">34 |</a>
|
|
<a name="line35">35 |</a> #include "modules_def.h"
|
|
<a name="line36">36 |</a>
|
|
<a name="line37">37 |</a> /** ************************************************************************ **/
|
|
<a name="line38">38 |</a> /** LOCAL DATATYPES **/
|
|
<a name="line39">39 |</a> /** ************************************************************************ **/
|
|
<a name="line40">40 |</a>
|
|
<a name="line41">41 |</a> /** not applicable **/
|
|
<a name="line42">42 |</a>
|
|
<a name="line43">43 |</a> /** ************************************************************************ **/
|
|
<a name="line44">44 |</a> /** CONSTANTS **/
|
|
<a name="line45">45 |</a> /** ************************************************************************ **/
|
|
<a name="line46">46 |</a>
|
|
<a name="line47">47 |</a> #define UPD_BUFSIZE 1024
|
|
<a name="line48">48 |</a>
|
|
<a name="line49">49 |</a> /** ************************************************************************ **/
|
|
<a name="line50">50 |</a> /** MACROS **/
|
|
<a name="line51">51 |</a> /** ************************************************************************ **/
|
|
<a name="line52">52 |</a>
|
|
<a name="line53">53 |</a> /** not applicable **/
|
|
<a name="line54">54 |</a>
|
|
<a name="line55">55 |</a> /** ************************************************************************ **/
|
|
<a name="line56">56 |</a> /** LOCAL DATA **/
|
|
<a name="line57">57 |</a> /** ************************************************************************ **/
|
|
<a name="line58">58 |</a>
|
|
<a name="line59">59 |</a> static char module_name[] = "ModuleCmd_Update.c"; /** File name of this module **/
|
|
<a name="line60">60 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line61">61 |</a> static char _proc_ModuleCmd_Update[] = "ModuleCmd_Update";
|
|
<a name="line62">62 |</a> #endif
|
|
<a name="line63">63 |</a>
|
|
<a name="line64">64 |</a> /** ************************************************************************ **/
|
|
<a name="line65">65 |</a> /** PROTOTYPES **/
|
|
<a name="line66">66 |</a> /** ************************************************************************ **/
|
|
<a name="line67">67 |</a>
|
|
<a name="line68">68 |</a> /** not applicable **/
|
|
<a name="line69">69 |</a>
|
|
<a name="line70">70 |</a>
|
|
<a name="line71">71 |</a> /*++++
|
|
<a name="line72">72 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line73">73 |</a> ** **
|
|
<a name="line74">74 |</a> ** Function: ModuleCmd_Update **
|
|
<a name="line75">75 |</a> ** **
|
|
<a name="line76">76 |</a> ** Description: Execution of the module-command 'update' **
|
|
<a name="line77">77 |</a> ** **
|
|
<a name="line78">78 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line79">79 |</a> ** **
|
|
<a name="line80">80 |</a> ** Parameters: Tcl_Interp *interp Attached Tcl Interp. **
|
|
<a name="line81">81 |</a> ** int argc Number of arguments **
|
|
<a name="line82">82 |</a> ** char *argv[] Argument list **
|
|
<a name="line83">83 |</a> ** **
|
|
<a name="line84">84 |</a> ** Result: int TCL_ERROR Failure **
|
|
<a name="line85">85 |</a> ** TCL_OK Successfull operation **
|
|
<a name="line86">86 |</a> ** **
|
|
<a name="line87">87 |</a> ** Attached Globals: flags Controllig the callback functions **
|
|
<a name="line88">88 |</a> ** **
|
|
<a name="line89">89 |</a> ** ************************************************************************ **
|
|
<a name="line90">90 |</a> ++++*/
|
|
<a name="line91">91 |</a>
|
|
<a name="line92">92 |</a> int ModuleCmd_Update( Tcl_Interp *interp,
|
|
<a name="line93">93 |</a> int count,
|
|
<a name="line94">94 |</a> char *module_list[])
|
|
<a name="line95">95 |</a> {
|
|
<a name="line96">96 |</a> #ifdef BEGINENV
|
|
<a name="line97">97 |</a> char *buf, /** Read buffer **/
|
|
<a name="line98">98 |</a> *var_ptr, /** Pointer to a variables name **/
|
|
<a name="line99">99 |</a> *val_ptr, /** Pointer to a variables value **/
|
|
<a name="line100">100 |</a> **load_list, /** List of loaded modules **/
|
|
<a name="line101">101 |</a> *tmpload, /** LOADEDMODULES contents **/
|
|
<a name="line102">102 |</a> *loaded, /** Buffer for tokenization **/
|
|
<a name="line103">103 |</a> *filename; /** The name of the file, where the **/
|
|
<a name="line104">104 |</a> /** beginning environment resides **/
|
|
<a name="line105">105 |</a> FILE *file; /** Handle to read in a file **/
|
|
<a name="line106">106 |</a> int list_count = 0,
|
|
<a name="line107">107 |</a> maxlist = 16, /** Max. number of list entries **/
|
|
<a name="line108">108 |</a> buffer_size = UPD_BUFSIZE;
|
|
<a name="line109">109 |</a> /** Current size of the input buffer **/
|
|
<a name="line110">110 |</a> char *ptr, c; /** Read pointers and char buffer **/
|
|
<a name="line111">111 |</a>
|
|
<a name="line112">112 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line113">113 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_ModuleCmd_Update, NULL);
|
|
<a name="line114">114 |</a> #endif
|
|
<a name="line115">115 |</a>
|
|
<a name="line116">116 |</a> #if BEGINENV == 99
|
|
<a name="line117">117 |</a> if (!Tcl_GetVar2( interp,"env","MODULESBEGINENV", TCL_GLOBAL_ONLY)) {
|
|
<a name="line118">118 |</a> ErrorLogger( ERR_BEGINENVX, LOC, NULL);
|
|
<a name="line119">119 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------> **/
|
|
<a name="line120">120 |</a> }
|
|
<a name="line121">121 |</a> #endif
|
|
<a name="line122">122 |</a> /**
|
|
<a name="line123">123 |</a> ** Nothing loaded so far - we're ready!
|
|
<a name="line124">124 |</a> **/
|
|
<a name="line125">125 |</a>
|
|
<a name="line126">126 |</a> if( !( tmpload = (char *) getenv("LOADEDMODULES"))) {
|
|
<a name="line127">127 |</a> if( OK != ErrorLogger( ERR_MODULE_PATH, LOC, NULL))
|
|
<a name="line128">128 |</a> goto unwind0;
|
|
<a name="line129">129 |</a> else
|
|
<a name="line130">130 |</a> goto success0;
|
|
<a name="line131">131 |</a> }
|
|
<a name="line132">132 |</a>
|
|
<a name="line133">133 |</a> /**
|
|
<a name="line134">134 |</a> ** First I'll update the environment with what's in _MODULESBEGINENV_
|
|
<a name="line135">135 |</a> **/
|
|
<a name="line136">136 |</a> filename = (char *) Tcl_GetVar2( interp,"env","_MODULESBEGINENV_",
|
|
<a name="line137">137 |</a> TCL_GLOBAL_ONLY);
|
|
<a name="line138">138 |</a> if( filename) {
|
|
<a name="line139">139 |</a>
|
|
<a name="line140">140 |</a> /**
|
|
<a name="line141">141 |</a> ** Read the beginning environment
|
|
<a name="line142">142 |</a> **/
|
|
<a name="line143">143 |</a> if( NULL != (file = fopen( filename, "r"))) {
|
|
<a name="line144">144 |</a>
|
|
<a name="line145">145 |</a> if((char *) NULL == (buf = stringer(NULL, buffer_size, NULL )))
|
|
<a name="line146">146 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line147">147 |</a> goto unwind0;
|
|
<a name="line148">148 |</a>
|
|
<a name="line149">149 |</a> while( !feof( file)) {
|
|
<a name="line150">150 |</a>
|
|
<a name="line151">151 |</a> /**
|
|
<a name="line152">152 |</a> ** Trigger to entries of the type
|
|
<a name="line153">153 |</a> ** <variable> = <value>
|
|
<a name="line154">154 |</a> **/
|
|
<a name="line155">155 |</a>
|
|
<a name="line156">156 |</a> ptr = buf;
|
|
<a name="line157">157 |</a> while( !feof( file)) {
|
|
<a name="line158">158 |</a>
|
|
<a name="line159">159 |</a> if((ptr-buf) >= buffer_size-10) { /** 10 bytes safety **/
|
|
<a name="line160">160 |</a> null_free((void *) &buf);
|
|
<a name="line161">161 |</a> if((char *) NULL == (buf = stringer(NULL,
|
|
<a name="line162">162 |</a> buffer_size += UPD_BUFSIZE, NULL )))
|
|
<a name="line163">163 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line164">164 |</a> goto unwind0;
|
|
<a name="line165">165 |</a> }
|
|
<a name="line166">166 |</a>
|
|
<a name="line167">167 |</a> /**
|
|
<a name="line168">168 |</a> ** Read a character and put it into the read buffer. Check
|
|
<a name="line169">169 |</a> ** for the lines (CR) or a terminator character ...
|
|
<a name="line170">170 |</a> **/
|
|
<a name="line171">171 |</a> if( '\n' == (*ptr++ = c = fgetc( file))) {
|
|
<a name="line172">172 |</a> *ptr++ = c = '\0';
|
|
<a name="line173">173 |</a> break;
|
|
<a name="line174">174 |</a> }
|
|
<a name="line175">175 |</a>
|
|
<a name="line176">176 |</a> if( !c)
|
|
<a name="line177">177 |</a> break;
|
|
<a name="line178">178 |</a>
|
|
<a name="line179">179 |</a> } /** while **/
|
|
<a name="line180">180 |</a>
|
|
<a name="line181">181 |</a> /**
|
|
<a name="line182">182 |</a> ** If there hasn't been a terminator so far, put it at the
|
|
<a name="line183">183 |</a> ** end of the line. Therefor we've left a safety space at the
|
|
<a name="line184">184 |</a> ** buffers end ;-)
|
|
<a name="line185">185 |</a> **/
|
|
<a name="line186">186 |</a> if( c)
|
|
<a name="line187">187 |</a> *ptr++ = '\0';
|
|
<a name="line188">188 |</a>
|
|
<a name="line189">189 |</a> /**
|
|
<a name="line190">190 |</a> ** Now let's evaluate the read line
|
|
<a name="line191">191 |</a> **/
|
|
<a name="line192">192 |</a> if( var_ptr = strchr( buf, '=')) {
|
|
<a name="line193">193 |</a>
|
|
<a name="line194">194 |</a> *var_ptr = '\0';
|
|
<a name="line195">195 |</a> val_ptr = var_ptr+1;
|
|
<a name="line196">196 |</a> var_ptr = buf;
|
|
<a name="line197">197 |</a>
|
|
<a name="line198">198 |</a> /**
|
|
<a name="line199">199 |</a> ** Reset the environment to the values derivered from the
|
|
<a name="line200">200 |</a> ** _MODULESBEGINENV_.
|
|
<a name="line201">201 |</a> ** Do not change the LOADEDMODULES variable ;-)
|
|
<a name="line202">202 |</a> ** Do not change the TCL_LIBRARY and TK_LIBRARY also.
|
|
<a name="line203">203 |</a> **/
|
|
<a name="line204">204 |</a> if( strncmp( var_ptr, "LOADEDMODULES", 12) &&
|
|
<a name="line205">205 |</a> strncmp( var_ptr, "TCL_LIBRARY", 10 ) &&
|
|
<a name="line206">206 |</a> strncmp( var_ptr, "TK_LIBRARY", 9 ))
|
|
<a name="line207">207 |</a> if( !strncmp( var_ptr, "MODULEPATH", 10))
|
|
<a name="line208">208 |</a> moduleSetenv( interp, var_ptr, val_ptr, 1);
|
|
<a name="line209">209 |</a> else
|
|
<a name="line210">210 |</a> Tcl_SetVar2( interp, "env", var_ptr, val_ptr,
|
|
<a name="line211">211 |</a> TCL_GLOBAL_ONLY);
|
|
<a name="line212">212 |</a> } /** if( var_ptr) **/
|
|
<a name="line213">213 |</a> } /** while **/
|
|
<a name="line214">214 |</a>
|
|
<a name="line215">215 |</a> /**
|
|
<a name="line216">216 |</a> ** Close the _MODULESBEGINENV_ file anf free up the read buffer.
|
|
<a name="line217">217 |</a> **/
|
|
<a name="line218">218 |</a> null_free((void *) &buf);
|
|
<a name="line219">219 |</a>
|
|
<a name="line220">220 |</a> if( EOF == fclose( file))
|
|
<a name="line221">221 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, filename, NULL))
|
|
<a name="line222">222 |</a> goto unwind0;
|
|
<a name="line223">223 |</a>
|
|
<a name="line224">224 |</a> } else { /** if( fopen) **/
|
|
<a name="line225">225 |</a>
|
|
<a name="line226">226 |</a> if( OK != ErrorLogger( ERR_OPEN, LOC, filename, "reading", NULL))
|
|
<a name="line227">227 |</a> goto unwind0;
|
|
<a name="line228">228 |</a>
|
|
<a name="line229">229 |</a> } /** if( fopen) **/
|
|
<a name="line230">230 |</a> } /** if( filename) **/
|
|
<a name="line231">231 |</a>
|
|
<a name="line232">232 |</a> /**
|
|
<a name="line233">233 |</a> ** Allocate memory for a buffer to tokenize the list of loaded modules
|
|
<a name="line234">234 |</a> ** and a list buffer
|
|
<a name="line235">235 |</a> **/
|
|
<a name="line236">236 |</a> if( NULL == (load_list = (char**) malloc( maxlist*sizeof(char**))))
|
|
<a name="line237">237 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line238">238 |</a> goto unwind0;
|
|
<a name="line239">239 |</a>
|
|
<a name="line240">240 |</a> if( NULL == (loaded = stringer(NULL, 0, tmpload, NULL)))
|
|
<a name="line241">241 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line242">242 |</a> goto unwind1;
|
|
<a name="line243">243 |</a>
|
|
<a name="line244">244 |</a> /**
|
|
<a name="line245">245 |</a> ** Tokenize and build the list
|
|
<a name="line246">246 |</a> **/
|
|
<a name="line247">247 |</a> if( *loaded) {
|
|
<a name="line248">248 |</a>
|
|
<a name="line249">249 |</a> for( load_list[ list_count++] = strtok( loaded, ":");
|
|
<a name="line250">250 |</a> load_list[ list_count-1];
|
|
<a name="line251">251 |</a> load_list[ list_count++] = strtok( NULL, ":") ) {
|
|
<a name="line252">252 |</a>
|
|
<a name="line253">253 |</a> /**
|
|
<a name="line254">254 |</a> ** Conditionally we have to double the space, we've allocated for
|
|
<a name="line255">255 |</a> ** the list
|
|
<a name="line256">256 |</a> **/
|
|
<a name="line257">257 |</a>
|
|
<a name="line258">258 |</a> if( list_count >= maxlist) {
|
|
<a name="line259">259 |</a> maxlist = maxlist<<1;
|
|
<a name="line260">260 |</a>
|
|
<a name="line261">261 |</a> if( NULL == (load_list = (char**) realloc((char *) load_list,
|
|
<a name="line262">262 |</a> maxlist*sizeof(char**))))
|
|
<a name="line263">263 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line264">264 |</a> goto unwind1;
|
|
<a name="line265">265 |</a>
|
|
<a name="line266">266 |</a> } /** if( maxlist) **/
|
|
<a name="line267">267 |</a> } /** for **/
|
|
<a name="line268">268 |</a>
|
|
<a name="line269">269 |</a> /**
|
|
<a name="line270">270 |</a> ** Load all the modules in the list
|
|
<a name="line271">271 |</a> **/
|
|
<a name="line272">272 |</a> ModuleCmd_Load( interp, 1, list_count, load_list);
|
|
<a name="line273">273 |</a> }
|
|
<a name="line274">274 |</a>
|
|
<a name="line275">275 |</a> /**
|
|
<a name="line276">276 |</a> ** Free up what has been allocated and return on success
|
|
<a name="line277">277 |</a> **/
|
|
<a name="line278">278 |</a> null_free((void *) &loaded);
|
|
<a name="line279">279 |</a> null_free((void *) &load_list);
|
|
<a name="line280">280 |</a>
|
|
<a name="line281">281 |</a> success0:
|
|
<a name="line282">282 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line283">283 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_ModuleCmd_Update, NULL);
|
|
<a name="line284">284 |</a> #endif
|
|
<a name="line285">285 |</a>
|
|
<a name="line286">286 |</a> return( TCL_OK); /** -------- EXIT (SUCCESS) -------> **/
|
|
<a name="line287">287 |</a>
|
|
<a name="line288">288 |</a> unwind1:
|
|
<a name="line289">289 |</a> null_free((void *) &load_list);
|
|
<a name="line290">290 |</a> unwind0:
|
|
<a name="line291">291 |</a> #else /* BEGINENV */
|
|
<a name="line292">292 |</a> ErrorLogger( ERR_BEGINENV, LOC, NULL);
|
|
<a name="line293">293 |</a> #endif /* BEGINENV */
|
|
<a name="line294">294 |</a> return( TCL_ERROR); /** -------- EXIT (FAILURE) -------> **/
|
|
<a name="line295">295 |</a>
|
|
<a name="line296">296 |</a> } /** End of 'ModuleCmd_Update' **/
|
|
</pre>
|
|
|
|
</BODY>
|
|
</HTML>
|