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

  1. // $Id: CodeCache.C,v 1.9 1998/03/25 12:42:36 zeller Exp $ -*- C++ -*-
  2. // Machine Code Cache
  3.  
  4. // Copyright (C) 1995 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 CodeCache_rcsid[] = 
  30.     "$Id: CodeCache.C,v 1.9 1998/03/25 12:42:36 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #pragma implementation "VarArray.h"
  35. #pragma implementation "DynArray.h"
  36. #endif
  37.  
  38. #include <Xm/Xm.h>
  39. #include "CodeCache.h"
  40.  
  41. // Return digit value
  42. inline int xdigit(char c)
  43. {
  44.     switch (c)
  45.     {
  46.     case '0':           return 0;
  47.     case '1':           return 1;
  48.     case '2':           return 2;
  49.     case '3':           return 3;
  50.     case '4':           return 4;
  51.     case '5':           return 5;
  52.     case '6':           return 6;
  53.     case '7':           return 7;
  54.     case '8':           return 8;
  55.     case '9':           return 9;
  56.     case 'a': case 'A': return 10;
  57.     case 'b': case 'B': return 11;
  58.     case 'c': case 'C': return 12;
  59.     case 'd': case 'D': return 13;
  60.     case 'e': case 'E': return 14;
  61.     case 'f': case 'F': return 15;
  62.     default:            return -1;
  63.     }
  64. }
  65.  
  66. // Compare addresses: 
  67. // return Z such that Z < 0 if X < Y, Z == 0 if X == Y, Z > 0 if X > Y
  68. int compare_address(const string& x, const string& y)
  69. {
  70.     unsigned int px = 0;
  71.     unsigned int py = 0;
  72.  
  73.     while (px < x.length() && is_leading_zero(x[px]))
  74.     px++;
  75.     while (py < y.length() && is_leading_zero(y[py]))
  76.     py++;
  77.  
  78.     unsigned int lx = x.length() - px;
  79.     unsigned int ly = y.length() - py;
  80.  
  81.     while (lx > 0 && is_trailing_zero(x[px + lx - 1]))
  82.     lx--;
  83.     while (ly > 0 && is_trailing_zero(y[py + ly - 1]))
  84.     ly--;
  85.  
  86.     int ret = lx - ly;
  87.     for (unsigned i = 0; ret == 0 && i < lx; i++)
  88.     ret = xdigit(x[px + i]) - xdigit(y[py + i]);
  89.  
  90. #if 0
  91.     if (ret < 0)
  92.     clog << x << " < " << y << "\n";
  93.     else if (ret > 0)
  94.     clog << x << " > " << y << "\n";
  95.     else
  96.     clog << x << " = " << y << "\n";
  97. #endif
  98.  
  99.     return ret;
  100. }
  101.