Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

110 wiersze
2.3KB

  1. /* vview.c - drawing for the c64 vim clone: scroll, rows, status row. */
  2. extern char *bfr;
  3. extern unsigned blen;
  4. extern unsigned lptr[];
  5. extern int nlines, cy, cx, top, leftcol, mode, dirty;
  6. extern char *note;
  7. extern char fname[];
  8. extern char ybuf[];
  9. extern int ylen, yok;
  10. /* decimal of v into t at p, returns the position after it */
  11. dnum(t, p, v)
  12. char *t;
  13. int p, v;
  14. {
  15. char d[6];
  16. int n;
  17. n = 0;
  18. if (v == 0) {
  19. t[p++] = 48;
  20. return p;
  21. }
  22. while (v > 0 && n < 5) {
  23. d[n++] = 48 + (v % 10);
  24. v = v / 10;
  25. }
  26. while (n > 0) t[p++] = d[--n];
  27. return p;
  28. }
  29. /* bring the cursor back into view */
  30. scroll()
  31. {
  32. if (cy < top) top = cy;
  33. if (cy > top + 23) top = cy - 23;
  34. if (top < 0) top = 0;
  35. if (cx < leftcol) leftcol = cx;
  36. if (cx > leftcol + 39) leftcol = cx - 39;
  37. if (leftcol < 0) leftcol = 0;
  38. return 0;
  39. }
  40. /* draw screen row sr from buffer line top+sr */
  41. drow(sr)
  42. int sr;
  43. {
  44. int ln, n, cc;
  45. unsigned i, e, d;
  46. d = 1024 + sr * 40; /* screen RAM address of the row */
  47. ln = top + sr;
  48. if (ln >= nlines) {
  49. mlrow(0, 0, d, 255, 0);
  50. return 0;
  51. }
  52. i = lptr[ln] + leftcol;
  53. e = linend(ln);
  54. n = 0;
  55. if (e > i) n = e - i;
  56. if (n > 40) n = 40;
  57. cc = 255; /* cursor column, 255 = not here */
  58. if (ln == cy) {
  59. cc = cx - leftcol;
  60. if (cc < 0) cc = 255;
  61. if (cc > 39) cc = 255;
  62. }
  63. mlrow((unsigned) bfr + i, n, d, cc, 0); /* machine code does the rest */
  64. return 0;
  65. }
  66. /* the status row: message, mode or name on the left; modified flag; line/total */
  67. dstat()
  68. {
  69. char t[40];
  70. char *s;
  71. int i, n, p;
  72. if (note != 0) s = note;
  73. else if (mode) s = "-- insert --";
  74. else if (fname[0] == 0) s = "[no name]";
  75. else s = fname;
  76. n = 0;
  77. for (i = 0; s[i] && i < 26; i++) t[n++] = s[i];
  78. while (n < 28) t[n++] = 32;
  79. if (dirty) t[n++] = 43; /* + */
  80. else t[n++] = 32;
  81. while (n < 31) t[n++] = 32;
  82. p = dnum(t, n, cy + 1);
  83. t[p++] = 47; /* / */
  84. p = dnum(t, p, nlines);
  85. mlrow((unsigned) t, p, 1984, 255, 128); /* row 24 = $0400 + 960, reverse */
  86. return 0;
  87. }
  88. dall()
  89. {
  90. int r;
  91. for (r = 0; r < 24; r++) drow(r);
  92. dstat();
  93. return 0;
  94. }
  95. /* end of vview.c */

Powered by TurnKey Linux.