termcap.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <termcap.h>
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <AK/HashMap.h>
  6. #include <AK/AKString.h>
  7. //#define TERMCAP_DEBUG
  8. extern "C" {
  9. char PC;
  10. char* UP;
  11. char* BC;
  12. int tgetent(char* bp, const char* name)
  13. {
  14. (void)bp;
  15. (void)name;
  16. #ifdef TERMCAP_DEBUG
  17. fprintf(stderr, "tgetent: bp=%p, name='%s'\n", bp, name);
  18. #endif
  19. PC = '\0';
  20. BC = const_cast<char*>("\033[D");
  21. UP = const_cast<char*>("\033[A");
  22. return 1;
  23. }
  24. static HashMap<String, const char*>* caps = nullptr;
  25. void ensure_caps()
  26. {
  27. if (caps)
  28. return;
  29. caps = new HashMap<String, const char*>;
  30. caps->set("DC", "\033[%p1%dP");
  31. caps->set("IC", "\033[%p1%d@");
  32. caps->set("ce", "\033[K");
  33. caps->set("cl", "\033[H\033[J");
  34. caps->set("cr", "\015");
  35. caps->set("dc", "\033[P");
  36. caps->set("ei", "");
  37. caps->set("ic", "");
  38. caps->set("im", "");
  39. caps->set("kd", "\033[B");
  40. caps->set("kl", "\033[D");
  41. caps->set("kr", "\033[C");
  42. caps->set("ku", "\033[A");
  43. caps->set("ks", "");
  44. caps->set("ke", "");
  45. caps->set("le", "\033[D");
  46. caps->set("mm", "");
  47. caps->set("mo", "");
  48. caps->set("pc", "");
  49. caps->set("up", "\033[A");
  50. caps->set("vb", "");
  51. caps->set("am", "");
  52. caps->set("@7", "");
  53. caps->set("kH", "");
  54. caps->set("kI", "\033[L");
  55. caps->set("kh", "\033[H");
  56. caps->set("vs", "");
  57. caps->set("ve", "");
  58. caps->set("E3", "");
  59. caps->set("kD", "");
  60. caps->set("nd", "\033[C");
  61. caps->set("co", "80");
  62. caps->set("li", "25");
  63. }
  64. char* tgetstr(const char* id, char** area)
  65. {
  66. ensure_caps();
  67. #ifdef TERMCAP_DEBUG
  68. fprintf(stderr, "tgetstr: id='%s'\n", id);
  69. #endif
  70. auto it = caps->find(id);
  71. if (it != caps->end()) {
  72. char* ret = *area;
  73. const char* val = (*it).value;
  74. strcpy(*area, val);
  75. *area += strlen(val) + 1;
  76. return ret;
  77. }
  78. fprintf(stderr, "tgetstr: missing cap id='%s'\n", id);
  79. return nullptr;
  80. }
  81. int tgetflag(const char* id)
  82. {
  83. (void)id;
  84. #ifdef TERMCAP_DEBUG
  85. fprintf(stderr, "tgetflag: '%s'\n", id);
  86. #endif
  87. auto it = caps->find(id);
  88. if (it != caps->end())
  89. return 1;
  90. return 0;
  91. }
  92. int tgetnum(const char* id)
  93. {
  94. #ifdef TERMCAP_DEBUG
  95. fprintf(stderr, "tgetnum: '%s'\n", id);
  96. #endif
  97. auto it = caps->find(id);
  98. if (it != caps->end())
  99. return atoi((*it).value);
  100. assert(false);
  101. }
  102. char* tgoto(const char* cap, int col, int row)
  103. {
  104. (void)cap;
  105. (void)col;
  106. (void)row;
  107. assert(false);
  108. }
  109. int tputs(const char* str, int affcnt, int (*putc)(int))
  110. {
  111. (void)affcnt;
  112. size_t len = strlen(str);
  113. for (size_t i = 0; i < len; ++i)
  114. putc(str[i]);
  115. return 0;
  116. }
  117. }