|
- /* vview.c - drawing for the c64 vim clone: scroll, rows, status row. */
-
- extern char *bfr;
- extern unsigned blen;
- extern unsigned lptr[];
- extern int nlines, cy, cx, top, leftcol, mode, dirty;
- extern char *note;
- extern char fname[];
- extern char ybuf[];
- extern int ylen, yok;
-
- /* decimal of v into t at p, returns the position after it */
- dnum(t, p, v)
- char *t;
- int p, v;
- {
- char d[6];
- int n;
-
- n = 0;
- if (v == 0) {
- t[p++] = 48;
- return p;
- }
- while (v > 0 && n < 5) {
- d[n++] = 48 + (v % 10);
- v = v / 10;
- }
- while (n > 0) t[p++] = d[--n];
- return p;
- }
-
- /* bring the cursor back into view */
- scroll()
- {
- if (cy < top) top = cy;
- if (cy > top + 23) top = cy - 23;
- if (top < 0) top = 0;
- if (cx < leftcol) leftcol = cx;
- if (cx > leftcol + 39) leftcol = cx - 39;
- if (leftcol < 0) leftcol = 0;
- return 0;
- }
-
- /* draw screen row sr from buffer line top+sr */
- drow(sr)
- int sr;
- {
- int ln, n, cc;
- unsigned i, e, d;
-
- d = 1024 + sr * 40; /* screen RAM address of the row */
- ln = top + sr;
- if (ln >= nlines) {
- mlrow(0, 0, d, 255, 0);
- return 0;
- }
- i = lptr[ln] + leftcol;
- e = linend(ln);
- n = 0;
- if (e > i) n = e - i;
- if (n > 40) n = 40;
- cc = 255; /* cursor column, 255 = not here */
- if (ln == cy) {
- cc = cx - leftcol;
- if (cc < 0) cc = 255;
- if (cc > 39) cc = 255;
- }
- mlrow((unsigned) bfr + i, n, d, cc, 0); /* machine code does the rest */
- return 0;
- }
-
- /* the status row: message, mode or name on the left; modified flag; line/total */
- dstat()
- {
- char t[40];
- char *s;
- int i, n, p;
-
- if (note != 0) s = note;
- else if (mode) s = "-- insert --";
- else if (fname[0] == 0) s = "[no name]";
- else s = fname;
-
- n = 0;
- for (i = 0; s[i] && i < 26; i++) t[n++] = s[i];
- while (n < 28) t[n++] = 32;
- if (dirty) t[n++] = 43; /* + */
- else t[n++] = 32;
- while (n < 31) t[n++] = 32;
- p = dnum(t, n, cy + 1);
- t[p++] = 47; /* / */
- p = dnum(t, p, nlines);
-
- mlrow((unsigned) t, p, 1984, 255, 128); /* row 24 = $0400 + 960, reverse */
- return 0;
- }
-
- dall()
- {
- int r;
-
- for (r = 0; r < 24; r++) drow(r);
- dstat();
- return 0;
- }
-
-
- /* end of vview.c */
|