Changeset fbcfc4da in mainline for uspace/app/edit/edit.c
- Timestamp:
- 2009-12-03T19:25:17Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9510be2
- Parents:
- cb3d641a (diff), 22e6802 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/edit/edit.c
rcb3d641a rfbcfc4da 36 36 37 37 #include <stdio.h> 38 #include <stdlib.h> 38 39 #include <sys/types.h> 39 40 #include <vfs/vfs.h> … … 101 102 #define ED_INFTY 65536 102 103 104 /** Maximum filename length that can be entered. */ 105 #define INFNAME_MAX_LEN 128 106 103 107 static void key_handle_unmod(console_event_t const *ev); 104 108 static void key_handle_ctrl(console_event_t const *ev); 105 109 static int file_save(char const *fname); 110 static void file_save_as(void); 106 111 static int file_insert(char *fname); 107 112 static int file_save_range(char const *fname, spt_t const *spos, 108 113 spt_t const *epos); 114 static char *filename_prompt(char const *prompt, char const *init_value); 109 115 static void pane_text_display(void); 110 116 static void pane_row_display(void); … … 150 156 151 157 if (argc == 2) { 152 doc.file_name = argv[1];158 doc.file_name = str_dup(argv[1]); 153 159 } else if (argc > 1) { 154 160 printf("Invalid arguments.\n"); 155 161 return -2; 156 162 } else { 157 doc.file_name = "/edit.txt";163 doc.file_name = NULL; 158 164 } 159 165 160 166 new_file = false; 161 167 162 if ( file_insert(doc.file_name) != EOK)168 if (doc.file_name == NULL || file_insert(doc.file_name) != EOK) 163 169 new_file = true; 164 170 … … 170 176 pane_text_display(); 171 177 pane_status_display(); 172 if (new_file )173 status_display("File not found. Createdempty file.");178 if (new_file && doc.file_name != NULL) 179 status_display("File not found. Starting empty file."); 174 180 pane_caret_display(); 175 181 … … 266 272 break; 267 273 case KC_S: 268 (void) file_save(doc.file_name); 274 if (doc.file_name != NULL) 275 file_save(doc.file_name); 276 else 277 file_save_as(); 278 break; 279 case KC_E: 280 file_save_as(); 269 281 break; 270 282 default: … … 272 284 } 273 285 } 274 275 286 276 287 /** Save the document. */ … … 285 296 286 297 rc = file_save_range(fname, &sp, &ep); 287 status_display("File saved."); 298 299 switch (rc) { 300 case EINVAL: 301 status_display("Error opening file!"); 302 break; 303 case EIO: 304 status_display("Error writing data!"); 305 break; 306 default: 307 status_display("File saved."); 308 break; 309 } 288 310 289 311 return rc; 312 } 313 314 /** Change document name and save. */ 315 static void file_save_as(void) 316 { 317 char *old_fname, *fname; 318 int rc; 319 320 old_fname = (doc.file_name != NULL) ? doc.file_name : ""; 321 fname = filename_prompt("Save As", old_fname); 322 if (fname == NULL) { 323 status_display("Save cancelled."); 324 return; 325 } 326 327 rc = file_save(fname); 328 if (rc != EOK) 329 return; 330 331 if (doc.file_name != NULL) 332 free(doc.file_name); 333 doc.file_name = fname; 334 } 335 336 /** Ask for a file name. */ 337 static char *filename_prompt(char const *prompt, char const *init_value) 338 { 339 console_event_t ev; 340 char *str; 341 wchar_t buffer[INFNAME_MAX_LEN + 1]; 342 int max_len; 343 int nc; 344 bool done; 345 346 asprintf(&str, "%s: %s", prompt, init_value); 347 status_display(str); 348 console_goto(con, 1 + str_length(str), scr_rows - 1); 349 free(str); 350 351 console_set_color(con, COLOR_WHITE, COLOR_BLACK, 0); 352 353 max_len = min(INFNAME_MAX_LEN, scr_columns - 4 - str_length(prompt)); 354 str_to_wstr(buffer, max_len + 1, init_value); 355 nc = wstr_length(buffer); 356 done = false; 357 358 while (!done) { 359 console_get_event(con, &ev); 360 361 if (ev.type == KEY_PRESS) { 362 /* Handle key press. */ 363 if (((ev.mods & KM_ALT) == 0) && 364 (ev.mods & KM_CTRL) != 0) { 365 ; 366 } else if ((ev.mods & (KM_CTRL | KM_ALT)) == 0) { 367 switch (ev.key) { 368 case KC_ESCAPE: 369 return NULL; 370 case KC_BACKSPACE: 371 if (nc > 0) { 372 putchar('\b'); 373 fflush(stdout); 374 --nc; 375 } 376 break; 377 case KC_ENTER: 378 done = true; 379 break; 380 default: 381 if (ev.c >= 32 && nc < max_len) { 382 putchar(ev.c); 383 fflush(stdout); 384 buffer[nc++] = ev.c; 385 } 386 break; 387 } 388 } 389 } 390 } 391 392 buffer[nc] = '\0'; 393 str = wstr_to_astr(buffer); 394 395 console_set_color(con, COLOR_BLACK, COLOR_WHITE, 0); 396 397 return str; 290 398 } 291 399 … … 359 467 } while (!spt_equal(&bep, epos)); 360 468 361 fclose(f); 469 if (fclose(f) != EOK) 470 return EIO; 362 471 363 472 return EOK; … … 473 582 spt_t caret_pt; 474 583 coord_t coord; 584 char *fname; 475 585 int n; 476 586 … … 478 588 spt_get_coord(&caret_pt, &coord); 479 589 590 fname = (doc.file_name != NULL) ? doc.file_name : "<unnamed>"; 591 480 592 console_goto(con, 0, scr_rows - 1); 481 593 console_set_color(con, COLOR_WHITE, COLOR_BLACK, 0); 482 n = printf(" %d, %d: File '%s'. Ctrl- S Save Ctrl-Q Quit",483 coord.row, coord.column, doc.file_name);594 n = printf(" %d, %d: File '%s'. Ctrl-Q Quit Ctrl-S Save " 595 "Ctrl-E Save As", coord.row, coord.column, fname); 484 596 printf("%*s", scr_columns - 1 - n, ""); 485 597 fflush(stdout);
Note:
See TracChangeset
for help on using the changeset viewer.