home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / uniquify.C < prev    next >
C/C++ Source or Header  |  1998-06-12  |  3KB  |  115 lines

  1. // $Id: uniquify.C,v 1.2 1998/06/12 13:23:08 zeller Exp $ -*- C++ -*-
  2. // Shorten file names to unique base names
  3.  
  4. // Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char uniquify_rcsid[] = 
  30.     "$Id: uniquify.C,v 1.2 1998/06/12 13:23:08 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "uniquify.h"
  37. #include "SmartC.h"
  38. #include "bool.h"
  39.  
  40. static const char *file_basename(const char *name, char sep)
  41. {
  42.     const char *base = name;
  43.  
  44.     while (*name)
  45.     {
  46.     if (*name++ == sep)
  47.         base = name;
  48.     }
  49.  
  50.     return base;
  51. }
  52.  
  53. // FULL_PATH is /X/Y/Z/NAME; expand NAME to Z/NAME.
  54. static bool expand_label(string& name, const string& full_path, char sep)
  55. {
  56.     // Set index to the last SEP before NAME
  57.     int index = full_path.length() - name.length();
  58.     index = full_path.index(sep, index - full_path.length() - 1);
  59.  
  60.     if (index >= 1)
  61.     {
  62.     // Set index to the last SEP before Z
  63.     index--;
  64.     index = full_path.index(sep, index - full_path.length() - 1);
  65.     }
  66.  
  67.     if (index >= 1)
  68.     {
  69.     name = full_path.after(index);
  70.     return true;
  71.     }
  72.     else
  73.     {
  74.     name = full_path;
  75.     return false;
  76.     }
  77. }
  78.  
  79.  
  80. // Make each item in LABELS a base name of FILES, such that all
  81. // items have unique names.
  82. extern void uniquify(StringArray& files, StringArray& labels, char sep)
  83. {
  84.     // Start with base names
  85.     static StringArray empty;
  86.     labels = empty;
  87.     int i;
  88.     for (i = 0; i < files.size(); i++)
  89.     labels += file_basename(files[i], sep);
  90.  
  91.     // While there are any duplicate labels, add the directory names
  92.     i = 0;
  93.     while (i < labels.size())
  94.     {
  95.     bool expanded = false;
  96.     for (int j = i + 1; j < labels.size(); j++)
  97.     {
  98.         if (labels[i] == labels[j])
  99.         {
  100.         if (expand_label(labels[j], files[j], sep))
  101.             expanded = true;
  102.         }
  103.     }
  104.  
  105.     if (expanded && expand_label(labels[i], files[i], sep))
  106.     {
  107.         // Try again with expanded labels
  108.     }
  109.     else
  110.     {
  111.         i++;
  112.     }
  113.     }
  114. }
  115.