00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include <ctype.h>
00005
00006 #include "cmt_script.h"
00007 #include "cmt_use.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016 void Script::action (const CmtSystem::cmt_string_vector& words,
00017 ScriptType type,
00018 Use* use)
00019
00020 {
00021 cmt_string name;
00022 Script* script;
00023
00024 if (use == 0) use = &(Use::current());
00025
00026 name = words[1];
00027 if (name == "") return;
00028
00029 script = add (name, type, use);
00030 }
00031
00032
00033 Script* Script::find (const cmt_string& name, Use* use)
00034
00035 {
00036 int script_index;
00037
00038 if (use == 0) use = &(Use::current());
00039
00040 if (use->scripts.size () == 0) return (0);
00041
00042 for (script_index = 0;
00043 script_index < use->scripts.size ();
00044 script_index++)
00045 {
00046 Script& script = use->scripts[script_index];
00047
00048 if (script.name == name)
00049 {
00050 return (&script);
00051 }
00052 }
00053
00054 return (0);
00055 }
00056
00057
00058 Script* Script::add (const cmt_string& name, ScriptType type, Use* use)
00059
00060 {
00061 cmt_string short_name = name;
00062
00063 if (use == 0) use = &(Use::current());
00064
00065 int pos;
00066
00067 pos = short_name.find (".csh");
00068 if (pos != cmt_string::npos)
00069 {
00070 short_name.erase (pos);
00071 }
00072
00073 pos = short_name.find (".sh");
00074 if (pos != cmt_string::npos)
00075 {
00076 short_name.erase (pos);
00077 }
00078
00079 {
00080 Script* script;
00081
00082 if (short_name == "") return (0);
00083 script = find (short_name, use);
00084 if (script != 0)
00085 {
00086 script->type = type;
00087 return (script);
00088 }
00089 }
00090
00091 Script& script = use->scripts.add ();
00092
00093 script.name = short_name;
00094 script.type = type;
00095
00096 return (&script);
00097 }
00098
00099
00100 void Script::all_print_clean (PrintMode mode)
00101
00102 {
00103 int number;
00104 int script_number;
00105 Use::UsePtrVector& uses = Use::uses ();
00106
00107 if (uses.size () > 0)
00108 {
00109 for (number = 0; number < uses.size (); number++)
00110 {
00111 const Use* use = uses[number];
00112
00113 if (use->package == "CMT") continue;
00114
00115 for (script_number = 0;
00116 script_number < use->scripts.size ();
00117 script_number++)
00118 {
00119 Script& script = use->scripts[script_number];
00120
00121 if (script.type == CleanupScript)
00122 {
00123 if (script.print (mode, use)) cout << "; ";
00124 }
00125 }
00126 }
00127 }
00128 }
00129
00130
00131 void Script::all_print (PrintMode mode)
00132
00133 {
00134 int number;
00135 int script_number;
00136 Use::UsePtrVector& uses = Use::uses ();
00137
00138 if (uses.size () > 0)
00139 {
00140 for (number = 0; number < uses.size (); number++)
00141 {
00142 const Use* use = uses[number];
00143
00144 if (use->package == "CMT") continue;
00145
00146 for (script_number = 0;
00147 script_number < use->scripts.size ();
00148 script_number++)
00149 {
00150 Script& script = use->scripts[script_number];
00151
00152 if (script.type == SetupScript)
00153 {
00154 if (script.print (mode, use)) cout << "; ";
00155 }
00156 }
00157 }
00158 }
00159
00160 {
00161 const Use& use = Use::current ();
00162
00163 for (script_number = 0;
00164 script_number < use.scripts.size ();
00165 script_number++)
00166 {
00167 Script& script = use.scripts[script_number];
00168
00169 if (script.type == SetupScript)
00170 {
00171 if (script.print (mode, &use)) cout << "; ";
00172 }
00173 }
00174 }
00175 }
00176
00177
00178 void Script::clear_all ()
00179
00180 {
00181 }
00182
00183
00184 Script::Script ()
00185
00186 {
00187 }
00188
00189
00190 Script::~Script ()
00191
00192 {
00193 }
00194
00195
00196 int Script::print (PrintMode mode, const Use* use)
00197
00198 {
00199 int result = 1;
00200 cmt_string suffix;
00201
00202 if (name == "") return (0);
00203
00204 switch (mode)
00205 {
00206 case Csh :
00207 suffix = ".csh";
00208 cout << "source ";
00209 break;
00210 case Sh :
00211 suffix = ".sh";
00212 cout << ". ";
00213 break;
00214 }
00215
00216 if (name.find (SLASH) == cmt_string::npos)
00217 {
00218 cout << "${" << use->prefix << "ROOT}/";
00219 if (use->style == cmt_style) cout << "cmt/";
00220 else cout << "mgr/";
00221 }
00222
00223 cout << name << suffix;
00224
00225 return (result);
00226 }