Subversion Repositories SvarDOS

Rev

Rev 1288 | Rev 1292 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1288 Rev 1289
Line 57... Line 57...
57
  unsigned short xoffset;
57
  unsigned short xoffset;
58
};
58
};
59
 
59
 
60
 
60
 
61
/* returns non-zero on error */
61
/* returns non-zero on error */
62
int line_add(struct linedb *db, const char *line) {
62
static int line_add(struct linedb *db, const char far *line) {
63
  unsigned short slen = strlen(line);
63
  unsigned short slen;
64
  struct line far *l;
64
  struct line far *l;
65
 
65
 
-
 
66
  /* slen = strlen(line) (but for far pointer) */
-
 
67
  for (slen = 0; line[slen] != 0; slen++);
-
 
68
 
66
  /* trim out CR/LF line endings */
69
  /* trim out CR/LF line endings */
67
  if ((slen >= 2) && (line[slen - 2] == '\r')) {
70
  if ((slen >= 2) && (line[slen - 2] == '\r')) {
68
    slen -= 2;
71
    slen -= 2;
69
  } else if ((slen >= 1) && (line[slen - 1] == '\n')) {
72
  } else if ((slen >= 1) && (line[slen - 1] == '\n')) {
70
    slen--;
73
    slen--;
Line 85... Line 88...
85
 
88
 
86
  return(0);
89
  return(0);
87
}
90
}
88
 
91
 
89
 
92
 
90
void db_rewind(struct linedb *db) {
93
static void db_rewind(struct linedb *db) {
91
  if (db->cursor == NULL) return;
94
  if (db->cursor == NULL) return;
92
  while (db->cursor->prev) db->cursor = db->cursor->prev;
95
  while (db->cursor->prev) db->cursor = db->cursor->prev;
93
  db->topscreen = db->cursor;
96
  db->topscreen = db->cursor;
94
}
97
}
95
 
98
 
96
 
99
 
97
void load_colorscheme(void) {
100
static void load_colorscheme(void) {
98
  scheme[COL_TXT] = 0x17;
101
  scheme[COL_TXT] = 0x17;
99
  scheme[COL_STATUSBAR1] = 0x70;
102
  scheme[COL_STATUSBAR1] = 0x70;
100
  scheme[COL_STATUSBAR2] = 0x78;
103
  scheme[COL_STATUSBAR2] = 0x78;
101
  scheme[COL_SCROLLBAR] = 0x70;
104
  scheme[COL_SCROLLBAR] = 0x70;
102
}
105
}
Line 134... Line 137...
134
  static char m = 'a';
137
  static char m = 'a';
135
  m++;
138
  m++;
136
  if (m > 'z') m = 'a';
139
  if (m > 'z') m = 'a';
137
#endif
140
#endif
138
 
141
 
139
  for (l = db->topscreen; l != NULL; l = l->next) {
142
  for (l = db->topscreen; l != NULL; l = l->next, y++) {
140
 
143
 
141
    /* skip lines that do not to be refreshed */
144
    /* skip lines that do not to be refreshed */
142
    if ((y < uidirtyfrom) || (y > uidirtyto)) continue;
145
    if (y < uidirtyfrom) continue;
-
 
146
    if (y > uidirtyto) break;
143
 
147
 
144
    if (db->xoffset < l->len) {
148
    if (db->xoffset < l->len) {
145
      for (len = 0; l->payload[len] != 0; len++) mdr_cout_char(y, len, l->payload[len], scheme[COL_TXT]);
149
      for (len = 0; l->payload[len] != 0; len++) mdr_cout_char(y, len, l->payload[len], scheme[COL_TXT]);
146
    } else {
150
    } else {
147
      len = 0;
151
      len = 0;
Line 151... Line 155...
151
#ifdef DBG_REFRESH
155
#ifdef DBG_REFRESH
152
    mdr_cout_char(y, 0, m, scheme[COL_STATUSBAR1]);
156
    mdr_cout_char(y, 0, m, scheme[COL_STATUSBAR1]);
153
#endif
157
#endif
154
 
158
 
155
    if (y == screenh - 2) break;
159
    if (y == screenh - 2) break;
156
    y++;
-
 
157
  }
160
  }
158
}
161
}
159
 
162
 
160
 
163
 
161
static void check_cursor_not_after_eol(struct linedb *db, unsigned char *cursorpos, unsigned char *uidirtyfrom, unsigned char *uidirtyto) {
164
static void check_cursor_not_after_eol(struct linedb *db, unsigned char *cursorpos, unsigned char *uidirtyfrom, unsigned char *uidirtyto) {
Line 388... Line 391...
388
       cursor_eol(&db, &cursorposx, screenw, &uidirtyfrom, &uidirtyto);
391
       cursor_eol(&db, &cursorposx, screenw, &uidirtyfrom, &uidirtyto);
389
 
392
 
390
    } else if (k == 0x1B) { /* ESC */
393
    } else if (k == 0x1B) { /* ESC */
391
      break;
394
      break;
392
 
395
 
-
 
396
    } else if (k == 0x0D) { /* ENTER */
-
 
397
      /* add a new line */
-
 
398
      if (line_add(&db, db.cursor->payload + db.xoffset + cursorposx) == 0) {
-
 
399
        /* trim the line above */
-
 
400
        db.cursor->prev->len = db.xoffset + cursorposx;
-
 
401
        db.cursor->prev->payload[db.cursor->prev->len] = 0;
-
 
402
        /* move cursor to the (new) line below */
-
 
403
        cursorposx = 0;
-
 
404
        if (cursorposy < screenh - 2) {
-
 
405
          uidirtyfrom = cursorposy;
-
 
406
          cursorposy++;
-
 
407
        } else {
-
 
408
          db.topscreen = db.topscreen->next;
-
 
409
          uidirtyfrom = 0;
-
 
410
        }
-
 
411
        uidirtyto = 0xff;
-
 
412
      } else {
-
 
413
        /* ERROR: OUT OF MEMORY */
-
 
414
      }
-
 
415
 
393
    } else { /* UNHANDLED KEY - TODO IGNORE THIS IN PRODUCTION RELEASE */
416
    } else { /* UNHANDLED KEY - TODO IGNORE THIS IN PRODUCTION RELEASE */
394
      char buff[4];
417
      char buff[4];
395
      const char *HEX = "0123456789ABCDEF";
418
      const char *HEX = "0123456789ABCDEF";
396
      buff[0] = HEX[(k >> 8) & 15];
419
      buff[0] = HEX[(k >> 8) & 15];
397
      buff[1] = HEX[(k >> 4) & 15];
420
      buff[1] = HEX[(k >> 4) & 15];