3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
4 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
34 #define VERSION "0.0.7"
36 #define MENU_REQUEST_OPEN 0
37 #define MENU_REQUEST_CLOSE 1
40 #define KBD_BUF_LEN 32
42 #define LINE_MAX_LEN 512
45 typedef struct line_context
{
46 struct line_context
*next
, *prev
;
55 char buffer
[LINE_MAX_LEN
];
62 unsigned cmd_handler (char *buffer
, unsigned len
);
64 line_t
*line_add (char *buf
, unsigned len
)
69 if (cmd_handler (buf
, len
))
74 /* alloc and init context */
75 line
= (line_t
*) malloc (sizeof (line_t
));
80 line
->buffer
= strndup (buf
, len
);
84 line
->next
= &line_list
;
85 line
->prev
= line_list
.prev
;
86 line
->prev
->next
= line
;
87 line
->next
->prev
= line
;
92 int line_print (line_t
*line
)
94 printf (line
->buffer
);
102 for (line
= line_list
.next
; line
!= &line_list
; line
= line
->next
)
108 int file_load (char *name
)
110 FILE *f
= fopen (name
, "r");
113 printf ("err: %s\n", name
);
118 char *r
= fgets (page
.buffer
, LINE_MAX_LEN
, f
);
123 unsigned l
= strlen (page
.buffer
);
125 if (l
>= LINE_MAX_LEN
)
128 line_add (page
.buffer
, l
);
136 int file_save (char *name
)
138 FILE *f
= fopen (name
, "w");
141 printf ("err: %s\n", name
);
148 for (line
= line_list
.next
; line
!= &line_list
; line
= line
->next
)
149 len
+= line
->len
+ 1;
151 char *p
= (char *) malloc (sizeof (char) * (len
+ 1));
159 for (line
= line_list
.next
; line
!= &line_list
; line
= line
->next
) {
160 memcpy (p
+len
, line
->buffer
, line
->len
);
161 p
[len
+line
->len
] = '\n';
162 len
+= line
->len
+ 1;
165 int r
= fwrite (p
, len
, 1, f
);
168 printf ("ERROR -> fwrite ()\n");
178 unsigned cmd_handler (char *buffer
, unsigned len
)
181 if (!strncmp (buffer
, ":quit", len
)) {
186 if (!strncmp (buffer
, ":save", 4)) {
188 if (buffer
[5] != ' ')
191 creat (buffer
+6, O_CREAT
);
193 file_save (buffer
+6);
194 printf ("Saved: '%s'\n", buffer
+6);
204 void cursor_update (unsigned short x
, unsigned short y
)
227 //cursor_update (page.csr_x, page.csr_y);
232 page
.buffer
[page
.len
] = '\0';
234 line_add (page
.buffer
, page
.len
);
236 memset (page
.buffer
, 0, page
.len
);
239 //cursor_update (page.csr_x, page.csr_y);
251 unsigned text_handler ()
253 char c
= kbd_getchar ();
256 page
.buffer
[page
.csr_x
- 1] = c
;
284 line_list
.next
= &line_list
;
285 line_list
.prev
= &line_list
;
292 int main (int argc
, char **argv
)
296 int oldFlag
= fcntl (1, F_GETFL
, 0);
297 if (fcntl (1, F_SETFL
, oldFlag
| O_NONBLOCK
) == -1) {
298 printf ("Cant set socket to nonblocking mode\n");
302 //file_load ("file");