Ignore:
Timestamp:
Aug 12, 2010, 10:45:31 AM (14 years ago)
Author:
rybkin
Message:

See C.L. 434

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMT/HEAD/source/cmt_symbol.cxx

    r547 r549  
    828828
    829829  symbol.selected_value = -1;
     830  symbol.printed = false;
    830831
    831832  return (&symbol);
     
    14901491  if (Symbols.size () == 0) return;
    14911492
    1492   for (number = 0; number < Symbol::symbol_number (); number++)
    1493     {
    1494       Symbol& symbol = Symbol::symbol (number);
    1495 
    1496       if ((symbol.type == SymbolSet) ||
    1497           (symbol.type == SymbolAlias) ||
    1498           (symbol.type == SymbolSetupScript) ||
    1499           (symbol.type == SymbolPath))
    1500         {
    1501           if (symbol.print (mode))
    1502             {
    1503               if (mode == Bat)
    1504                 {
    1505                   cout << endl;
    1506                 }
    1507               else
    1508                 {
    1509                   cout << endl;
    1510                 }
    1511             }
    1512         }
     1493  switch (mode)
     1494    {
     1495    case Requirements :
     1496      for (number = 0; number < Symbol::symbol_number (); number++)
     1497        {
     1498          Symbol& symbol = Symbol::symbol (number);
     1499
     1500          if ((symbol.type == SymbolSet) ||
     1501              (symbol.type == SymbolAlias) ||
     1502              (symbol.type == SymbolSetupScript) ||
     1503              (symbol.type == SymbolPath) ||
     1504              (symbol.type == SymbolMacro))
     1505            {
     1506              if (symbol.print_macro (mode))
     1507                {
     1508                  //              cout << endl;
     1509                }
     1510            }
     1511        }
     1512      break;
     1513    default :
     1514      for (number = 0; number < Symbol::symbol_number (); number++)
     1515        {
     1516          Symbol& symbol = Symbol::symbol (number);
     1517         
     1518          if ((symbol.type == SymbolSet) ||
     1519              (symbol.type == SymbolAlias) ||
     1520              (symbol.type == SymbolSetupScript) ||
     1521              (symbol.type == SymbolPath))
     1522            {
     1523              if (symbol.print (mode))
     1524                {
     1525                  if (mode == Bat)
     1526                    {
     1527                      cout << endl;
     1528                    }
     1529                  else
     1530                    {
     1531                      cout << endl;
     1532                    }
     1533                }
     1534            }
     1535        }
     1536      break;
    15131537    }
    15141538}
     
    17991823
    18001824//-------------------------------------------------------------
     1825int Symbol::print_macro (PrintMode mode, ostream& out) const
     1826{
     1827  if (mode != Requirements || printed) return 0;
     1828  return builder->print (*this, out);
     1829}
     1830
     1831//-------------------------------------------------------------
    18011832cmt_string Symbol::clean_macro_value () const
    18021833{
     
    19772008
    19782009  return (temp);
     2010}
     2011
     2012//-------------------------------------------------------------
     2013int ValueBuilder::print (const Symbol& symbol, ostream& out)
     2014{
     2015  int result (0);
     2016
     2017  bool first_definition = true;
     2018 
     2019  for (int i = 0; i < symbol.value_lists.size (); i++)
     2020    {
     2021      const SymbolValueList& value_list = symbol.value_lists[i];
     2022
     2023      if ((value_list.use != 0) &&
     2024          (value_list.use->discarded)) continue;
     2025
     2026      const int selected = value_list.select_first ();
     2027
     2028      if (selected < 0) continue;
     2029
     2030      SymbolValue& value = value_list.values[selected];
     2031
     2032      result += value_list.print (symbol, value, first_definition);
     2033    }
     2034
     2035  return result;
    19792036}
    19802037
     
    29863043
    29873044//-------------------------------------------------------------
     3045//  Quote separators (spaces and tabs) with double quotes,
     3046//  double quotes with single quotes,
     3047//  single quotes with double quotes in text.
     3048//  Note: quotes preceded by backslash (i.e., \" or \') are NOT quoted
     3049//  (considered escaped)
     3050//-------------------------------------------------------------
     3051static cmt_string quote (const cmt_string& text,
     3052                         const cmt_string& separators)
     3053{
     3054  //cerr << "quote: `" << text << "'" << endl;
     3055  cmt_string result;
     3056  if (text.size () == 0) return result;
     3057
     3058  int allocated = 3 * text.size (); // if EACH character of text quoted with " or '
     3059  char* const buffer = (char*) malloc (allocated + 1);
     3060  char* b (buffer);
     3061
     3062  //  char* const beg (buffer);
     3063  const char* p = text.c_str ();
     3064  const char* const text_c (p);
     3065  //  const char* const beg_t (p);
     3066  //  cerr << "quote: p = `" << p << "'" << endl;
     3067
     3068  while (*p)
     3069    //  while (*p != '\0')
     3070    {
     3071      size_t l_nonsep = strcspn (p, separators.c_str ());
     3072      //cerr << "quote: l_nonsep = " << l_nonsep << " *p = '" << *p << "'" << endl;
     3073      while (l_nonsep--)
     3074        {
     3075          if (*p == '\"' &&
     3076              (p > text_c && *(p - 1) != '\\' || p == text_c))
     3077            { // quote " with '
     3078              *b++ = '\'';
     3079              *b++ = *p++;
     3080              *b++ = '\'';
     3081            }
     3082          else if (*p == '\'' &&
     3083                   (p > text_c && *(p - 1) != '\\' || p == text_c))
     3084            { // quote ' with "
     3085              *b++ = '\"';
     3086              *b++ = *p++;
     3087              *b++ = '\"';
     3088            }
     3089          else
     3090            { // simply copy
     3091              *b++ = *p++;
     3092            }
     3093        }
     3094      size_t l_sep = strspn (p, separators.c_str ());
     3095      //cerr << "quote: l_sep = " << l_sep << " *p = '" << *p << "'" << endl;
     3096      if (l_sep)
     3097        { // quote separators with "
     3098          // place quote before all backslashes preceding separators, if any
     3099          char* r = b;
     3100          while (r > buffer && *(r - 1) == '\\')
     3101            r--;
     3102          if (r == b)
     3103            *b++ = '\"';
     3104          else
     3105            *r = '\"', *b++ = '\\';
     3106          while (l_sep--)
     3107            *b++ = *p++;
     3108          *b++ = '\"';
     3109        }
     3110    }
     3111  *b = '\0';
     3112  result = buffer;
     3113  free (buffer);
     3114  return result;
     3115}
     3116
     3117//-------------------------------------------------------------
     3118int SymbolValueList::print (const Symbol& symbol,
     3119                            const SymbolValue& value,
     3120                            bool& first_definition) const
     3121{
     3122  int result (0);
     3123
     3124  if (use->get_package_name () == "CMT") return result;
     3125
     3126  cmt_string discarded_text;
     3127  cmt_string define_text;
     3128  ActionType action = Cmt::get_action ();
     3129
     3130  switch (command_type)
     3131    {
     3132      //case CommandSet :
     3133      case CommandSetAppend :
     3134      case CommandSetPrepend :
     3135      case CommandSetRemove :
     3136      case CommandSetRemoveRegexp :
     3137        //case CommandAlias :
     3138        //case CommandPath :
     3139      case CommandPathAppend :
     3140      case CommandPathPrepend :
     3141      case CommandPathRemove :
     3142      case CommandPathRemoveRegexp :
     3143      case CommandMacroPrepend :
     3144        //case CommandMacro :
     3145      case CommandMacroAppend :
     3146      case CommandMacroRemove :
     3147      case CommandMacroRemoveRegexp :
     3148      case CommandMacroRemoveAll :
     3149      case CommandMacroRemoveAllRegexp :
     3150        //case CommandAction :
     3151        if (value.text == "") return result;
     3152        break;
     3153    }
     3154
     3155  if (discarded) discarded_text = " (discarded by override)";
     3156  else discarded_text = "";
     3157
     3158  if (first_definition) define_text = "defines";
     3159  else define_text = "overrides";
     3160
     3161  cout << "# Package ";
     3162  if (use != 0)
     3163    {
     3164      cout << use->get_package_name () << " " << use->version;
     3165    }
     3166
     3167  switch (command_type)
     3168    {
     3169      case CommandSet :
     3170        cout << " " << define_text << " set " << symbol.name << " as " << endl;
     3171        //        cout << " " << define_text << " set " << symbol.name << " as ";
     3172        cout << "set " << symbol.name;
     3173        first_definition = false;
     3174        result = 1;
     3175        break;
     3176      case CommandSetAppend :
     3177        cout << " appends to set " << symbol.name << " : " << endl;;
     3178        //        cout << " appends to set " << symbol.name << " : ";
     3179        cout << "set_append " << symbol.name;
     3180        result = 1;
     3181        break;
     3182      case CommandSetPrepend :
     3183        cout << " prepends to set " << symbol.name << " : " << endl;
     3184        //        cout << " prepends to set " << symbol.name << " : ";
     3185        cout << "set_prepend " << symbol.name;
     3186        result = 1;
     3187        break;
     3188      case CommandSetRemove :
     3189        cout << " removes from set " << symbol.name << " : " << endl;
     3190        //        cout << " removes from set " << symbol.name << " : ";
     3191        cout << "set_remove " << symbol.name;
     3192        result = 1;
     3193        break;
     3194      case CommandSetRemoveRegexp :
     3195        cout << " removes RE from set " << symbol.name << " : " << endl;
     3196        //        cout << " removes RE from set " << symbol.name << " : ";
     3197        cout << "set_remove_regexp " << symbol.name;
     3198        result = 1;
     3199        break;
     3200      case CommandAlias :
     3201        cout << " " << define_text << " alias " << symbol.name << endl;
     3202        //        cout << " " << define_text << " alias " << symbol.name << " as ";
     3203        cout << "alias " << symbol.name;
     3204        first_definition = false;
     3205        result = 1;
     3206        break;
     3207      case CommandPath :
     3208        cout << " " << define_text << " path " << symbol.name << endl;
     3209        //        cout << " " << define_text << " path " << symbol.name << " as ";
     3210        cout << "path " << symbol.name;
     3211        first_definition = false;
     3212        result = 1;
     3213        break;
     3214      case CommandPathAppend :
     3215        cout << " appends to path " << symbol.name << endl;
     3216        //        cout << " appends to path " << symbol.name << " : ";
     3217        cout << "path_append " << symbol.name;
     3218        result = 1;
     3219        break;
     3220      case CommandPathPrepend :
     3221        cout << " prepends to path " << symbol.name << " : " << endl;
     3222        //        cout << " prepends to path " << symbol.name << " : ";
     3223        cout << "path_prepend " << symbol.name;
     3224        result = 1;
     3225        break;
     3226      case CommandPathRemove :
     3227        cout << " removes from path " << symbol.name << " : " << endl;
     3228        //        cout << " removes from path " << symbol.name << " : ";
     3229        cout << "path_remove " << symbol.name;
     3230        result = 1;
     3231        break;
     3232      case CommandPathRemoveRegexp :
     3233        cout << " removes RE from path " << symbol.name << " : " << endl;
     3234        //        cout << " removes RE from path " << symbol.name << " : ";
     3235        cout << "path_remove_regexp " << symbol.name;
     3236        result = 1;
     3237        break;
     3238      case CommandMacro :
     3239        cout << " " << define_text << " macro " << symbol.name << " as " << endl;
     3240        //        cout << " " << define_text << " macro " << symbol.name << " as ";
     3241        cout << "macro " << symbol.name;
     3242        result = 1;
     3243        break;
     3244      case CommandMacroPrepend :
     3245        cout << " prepends to macro " << symbol.name << " : " << endl;
     3246        //        cout << " prepends to macro " << symbol.name << " : ";
     3247        cout << "macro_prepend " << symbol.name;
     3248        result = 1;
     3249        break;
     3250      case CommandMacroAppend :
     3251        cout << " appends to macro " << symbol.name << " : " << endl;
     3252        //        cout << " appends to macro " << symbol.name << " : ";
     3253        cout << "macro_append " << symbol.name;
     3254        result = 1;
     3255        break;
     3256      case CommandMacroRemove :
     3257        cout << " remove from macro " << symbol.name << " : " << endl;
     3258        //        cout << " remove from macro " << symbol.name << " : ";
     3259        cout << "macro_remove " << symbol.name;
     3260        result = 1;
     3261        break;
     3262      case CommandMacroRemoveRegexp :
     3263        cout << " remove RE from macro " << symbol.name << " : " << endl;
     3264        //        cout << " remove RE from macro " << symbol.name << " : ";
     3265        cout << "macro_remove_regexp " << symbol.name;
     3266        result = 1;
     3267        break;
     3268      case CommandMacroRemoveAll :
     3269        cout << " remove all from macro " << symbol.name << " : " << endl;
     3270        //        cout << " remove all from macro " << symbol.name << " : ";
     3271        cout << "macro_remove_all " << symbol.name;
     3272        result = 1;
     3273        break;
     3274      case CommandMacroRemoveAllRegexp :
     3275        cout << " remove all RE from macro " << symbol.name << " : " << endl;
     3276        //        cout << " remove all RE from macro " << symbol.name << " : ";
     3277        cout << "macro_remove_all_regexp " << symbol.name;
     3278        result = 1;
     3279        break;
     3280      case CommandSetupScript :
     3281        cout << " " << define_text << " setup script " << symbol.name << endl;
     3282        //       cout << " " << define_text << " action " << symbol.name << " as ";
     3283        cout << "setup_script" /* << symbol.name */;
     3284        first_definition = false;
     3285        result = 1;
     3286        break;
     3287        /*
     3288      case CommandAction :
     3289        cout << " " << define_text << " action " << symbol.name << " as ";
     3290        first_definition = false;
     3291        break;
     3292        */
     3293    }
     3294
     3295  cout << " " << quote (value.text, " \t");
     3296  //  cout << "'" << value.text << "'";
     3297         
     3298  /*
     3299  Tag* selected_tag = value.tag;
     3300         
     3301  if ((selected_tag == 0) ||
     3302      (selected_tag == Tag::get_default ()))
     3303    {
     3304      cout << " for default tag";
     3305    }
     3306  else
     3307    {
     3308      cout << " for tag '" << selected_tag->get_name () << "'";
     3309    }
     3310  */
     3311
     3312  cout << endl;
     3313  //  cout << discarded_text << endl;
     3314  return result;
     3315}
     3316
     3317//-------------------------------------------------------------
    29883318bool Symbol::check_tag_used (Tag* tag)
    29893319{
Note: See TracChangeset for help on using the changeset viewer.