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 / tabs.C < prev    next >
C/C++ Source or Header  |  1998-03-25  |  3KB  |  101 lines

  1. // $Id: tabs.C,v 1.7 1998/03/25 12:46:42 zeller Exp $ -*- C++ -*-
  2. // Tabulator functions
  3.  
  4. // Copyright (C) 1997 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 tabs_rcsid[] = 
  30.     "$Id: tabs.C,v 1.7 1998/03/25 12:46:42 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "tabs.h"
  37.  
  38. //-----------------------------------------------------------------------
  39. // Tabulator stuff
  40. //-----------------------------------------------------------------------
  41.  
  42. // Replace first '\t' by filling up spaces until POS is reached
  43. void tabto(string& s, int pos)
  44. {
  45.     for (int i = 0; unsigned(i) < s.length() && i < pos; i++)
  46.     {
  47.     if (s[i] == '\t')
  48.     {
  49.         int offset = pos - i;
  50.         s(i, 1) = replicate(' ', offset);
  51.         return;
  52.     }
  53.     }
  54. }
  55.     
  56. // Replace all '\t' by filling up spaces until multiple of TAB_WIDTH
  57. // is reached; ignore first INDENT characters.
  58. void untabify(string& str, int tab_width, int indent)
  59. {
  60.     char *buffer = 
  61.     new char[str.length() + str.freq('\t') * (tab_width - 1) + 1];
  62.     char *b = buffer;
  63.  
  64.     int column = 0;
  65.     int spaces;
  66.     const char *s = str.chars();
  67.     while (*s != '\0')
  68.     {
  69.     switch (*s)
  70.     {
  71.     case '\t':
  72.         if (column >= indent)
  73.         spaces = tab_width - ((column - indent) % tab_width);
  74.         else
  75.         spaces = 1;
  76.         while (spaces-- > 0)
  77.         {
  78.         *b++ = ' ';
  79.         column++;
  80.         }
  81.         break;
  82.  
  83.     case '\n':
  84.     case '\r':
  85.         *b++   = *s;
  86.         column = 0;
  87.         break;
  88.  
  89.     default:
  90.         *b++ = *s;
  91.         column++;
  92.         break;
  93.     }
  94.     s++;
  95.     }
  96.     *b++ = '\0';
  97.  
  98.     str = buffer;
  99.     delete[] buffer;
  100. }
  101.