stringtable.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /**********
  2.  * Copyright (c) 2004 Greg Parker.  All rights reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  * 1. Redistributions of source code must retain the above copyright
  8.  *    notice, this list of conditions and the following disclaimer.
  9.  * 2. Redistributions in binary form must reproduce the above copyright
  10.  *    notice, this list of conditions and the following disclaimer in the
  11.  *    documentation and/or other materials provided with the distribution.
  12.  *
  13.  * THIS SOFTWARE IS PROVIDED BY GREG PARKER ``AS IS'' AND ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  15.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  16.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  17.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  18.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  19.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  20.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  21.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  22.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  23.  **********/
  24. #ifndef STRINGTABLE_H
  25. #define STRINGTABLE_H
  26. #include <string.h>
  27. #include <vector>
  28. #include <string>
  29. using namespace std;
  30. #include "elf.h"
  31. #include "swap.h"
  32. #include "image.h"
  33. #include "section.h"
  34. #include "complain.h"
  35. using namespace std;
  36. class StringTable : public Section {
  37. public:
  38.     StringTable(Image& newImage)
  39.         : Section(newImage, string(".strtab"), SHT_STRTAB, 0, 0, (uint8_t *)calloc(1, 1), 1)
  40.     { 
  41.         // strtab containing the empty string, unless read() replaces it
  42.     }
  43.     void read(Elf32_Shdr *shdr)
  44.     {
  45.         Section::read(shdr);
  46.         char *strings = (char *)malloc(mSize);
  47.         memcpy(strings, mContents, mSize);
  48.         mContents = (uint8_t *)strings;
  49.     }
  50.     
  51.     string operator[](int offset) const
  52.     {
  53.         return string((char *)mContents+offset);
  54.     }
  55.     void addString(const string& str) 
  56.     {
  57.         const char *cstr = str.c_str();
  58.         int len = strlen(cstr) + 1;
  59.         mContents = (uint8_t *)realloc((char *)mContents, mSize + len);
  60.         memcpy((char *)mContents + mSize, cstr, len);
  61.         mSize += len;
  62.     }
  63.     int indexOf(const string& str) const
  64.     {
  65.         const char *cstr = str.c_str();
  66.         const char *strings = (const char *)mContents;
  67.         for (const char *s = strings; 
  68.              s < strings+mSize; 
  69.              s++) 
  70.         {
  71.             if (0 == strcmp(s, cstr)) return s - strings;
  72.         }
  73.         error("string %s not in strtab", cstr);
  74.         return -1;
  75.     }
  76. };
  77. #endif