1/* ----------------------------------------------------------------------- * 2 * 3 * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved 4 * 5 * Permission is hereby granted, free of charge, to any person 6 * obtaining a copy of this software and associated documentation 7 * files (the "Software"), to deal in the Software without 8 * restriction, including without limitation the rights to use, 9 * copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom 11 * the Software is furnished to do so, subject to the following 12 * conditions: 13 * 14 * The above copyright notice and this permission notice shall 15 * be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 * OTHER DEALINGS IN THE SOFTWARE. 25 * 26 * ----------------------------------------------------------------------- */ 27 28/* 29 * line_input.c 30 * 31 * Line-oriented input discupline 32 */ 33 34#include "file.h" 35#include <errno.h> 36#include <syslinux/idle.h> 37 38ssize_t __line_input(struct file_info * fp, char *buf, size_t bufsize, 39 ssize_t(*get_char) (struct file_info *, void *, size_t)) 40{ 41 size_t n = 0; 42 char ch; 43 int rv; 44 ssize_t(*const Write) (struct file_info *, const void *, size_t) = 45 fp->oop->write; 46 47 for (;;) { 48 rv = get_char(fp, &ch, 1); 49 50 if (rv != 1) { 51 syslinux_idle(); 52 continue; 53 } 54 55 switch (ch) { 56 case '\n': /* Ignore incoming linefeed */ 57 break; 58 59 case '\r': 60 *buf = '\n'; 61 Write(fp, "\n", 1); 62 return n + 1; 63 64 case '\b': 65 if (n > 0) { 66 n--; 67 buf--; 68 Write(fp, "\b \b", 3); 69 } 70 break; 71 72 case '\x15': /* Ctrl-U */ 73 while (n) { 74 n--; 75 buf--; 76 Write(fp, "\b \b", 3); 77 } 78 break; 79 80 default: 81 if (n < bufsize - 1) { 82 *buf = ch; 83 Write(fp, buf, 1); 84 n++; 85 buf++; 86 } 87 break; 88 } 89 } 90} 91