64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <sys/socket.h>
|
|
#include <unistd.h>
|
|
#include "MagiDoor.h"
|
|
|
|
char md_getc() {
|
|
char c;
|
|
ssize_t ret;
|
|
while (1) {
|
|
if (mdcontrol.socket == -1) {
|
|
ret = read(STDIN_FILENO, &c, 1);
|
|
} else {
|
|
ret = recv(mdcontrol.socket, &c, 1, 0);
|
|
}
|
|
if (ret == 0) {
|
|
md_exit(0);
|
|
}
|
|
if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
|
|
usleep(1);
|
|
continue;
|
|
}
|
|
return c;
|
|
}
|
|
}
|
|
|
|
int md_getstring(char *ptr, int maxlen, char minchar, char maxchar) {
|
|
char c;
|
|
int len = 0;
|
|
static char lastc = 'x';
|
|
|
|
while (len < maxlen) {
|
|
c = md_getc();
|
|
if (c == '\n' || c == '\0') {
|
|
lastc = c;
|
|
if (lastc == '\r') {
|
|
continue;
|
|
} else {
|
|
return len;
|
|
}
|
|
}
|
|
if (c == '\r') {
|
|
lastc = c;
|
|
return len;
|
|
}
|
|
if (c == '\b' || c == 127) {
|
|
if (len > 0) {
|
|
md_printf("\x1b[D \x1b[D");
|
|
len--;
|
|
ptr[len] = '\0';
|
|
}
|
|
lastc = c;
|
|
continue;
|
|
}
|
|
if (c >= minchar && c <= maxchar) {
|
|
ptr[len++] = c;
|
|
ptr[len] = '\0';
|
|
md_putchar(c);
|
|
}
|
|
lastc = c;
|
|
}
|
|
|
|
return len;
|
|
} |