translator.cpp
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "translator.h"
  4. #ifdef WIN32
  5. #include "winfilereader.h"
  6. #else
  7. #include "unixfilereader.h"
  8. #endif
  9. #define COUNT_OFFSET 8
  10. #define ORIG_TABLE_POINTER_OFFSET 12
  11. #define TRANSLATION_TABLE_POINTER_OFFSET 16
  12. #include <stdio.h>
  13. Translator::Translator (const char *filename)
  14. {
  15. #ifdef WIN32
  16. reader = new WinFileReader (filename);
  17. #else
  18. reader = new UnixFileReader (filename);
  19. #endif
  20. // Sanity check file size.
  21. if (reader->getSize () < TRANSLATION_TABLE_POINTER_OFFSET)
  22. throw 0;
  23. // Load pointer info.
  24. count = reader->
  25. readInt (COUNT_OFFSET);
  26. origTableOffset = reader->
  27. readInt (ORIG_TABLE_POINTER_OFFSET);
  28. translationTableOffset = reader->
  29. readInt (TRANSLATION_TABLE_POINTER_OFFSET);
  30. // Further sanity check file size.
  31. if (reader->getSize () < origTableOffset
  32.     || reader->getSize () < translationTableOffset)
  33. throw 1;
  34. }
  35. Translator::~Translator ()
  36. {
  37. delete reader;
  38. }
  39. const char *
  40. Translator::getOrigMessage (unsigned int index)
  41. {
  42. int len, msgOffset;
  43. len = reader->readInt (origTableOffset + index * 8);
  44. msgOffset = reader->readInt (origTableOffset + index * 8 + 4);
  45. return reader->readStr (msgOffset);
  46. }
  47. const char *
  48. Translator::getTranslationMessage (unsigned int index, unsigned int &len)
  49. {
  50. int msgOffset;
  51. len = reader->readInt (translationTableOffset + index * 8);
  52. msgOffset = reader->readInt (translationTableOffset + index * 8 + 4);
  53. return reader->readStr (msgOffset);
  54. }
  55. #include <stdio.h>
  56. const char *
  57. Translator::translate (const char *message, unsigned int &retlen)
  58. {
  59. unsigned int low, high, mid;
  60. // Lookup the translation with binary search.
  61. low = 0;
  62. high = count - 1;
  63. while (low <= high) {
  64. int i;
  65. mid = (low + high) / 2;
  66. i = strcmp (message, getOrigMessage (mid));
  67. if (i < 0)
  68. high = mid - 1;
  69. else if (i > 0)
  70. low = mid + 1;
  71. else
  72. // Translation found.
  73. return getTranslationMessage (mid, retlen);
  74. }
  75. // Translation not found.
  76. return NULL;
  77. }