static void scroll() { if (cursor_y >= 25) { memcpy((uint8_t*)video_memory, (uint8_t*)&video_memory[80], 2 * 80 * 24); memsetw(&video_memory[80 * 24], MAKE_CHAR(' ', c_back, c_back), 80); cursor_y = 24; } }
static void putc(char c) { if (in_escape) { in_escape = handle_escape(c); return; } int back = c_back; int fore = c_fore; switch (c) { case 0x08: /* Backspace */ --cursor_x; if (cursor_x > 80) { /* Wrapped? */ cursor_x = 0; if (cursor_y > 0) --cursor_y; } break; case '\t': cursor_x = (cursor_x+8) & ~7; break; case '\r': cursor_x = 0; break; case '\n': cursor_x = 0; ++cursor_y; break; case '\033': /* VT220 escape */ in_escape = 1; return; default: /* Is the character printable? */ if (c >= ' ') { video_memory[cursor_y*80 + cursor_x] = MAKE_CHAR(c, fore, back); ++cursor_x; } break; } if (cursor_x >= 80) { cursor_x -= 80; ++cursor_y; } scroll(); update_cursor(); }
static uim_lisp c_file_read_internal(struct c_file_read_args *args) { int i; uim_lisp ret_ = uim_scm_null(); const unsigned char *p = args->buf; ret_ = uim_scm_null(); for (i = 0; i < args->nr; i++) { ret_ = CONS(MAKE_CHAR(*p), ret_); p++; } return ret_; }
static uim_lisp c_ffi_call(uim_lisp result_, uim_lisp fun_, uim_lisp argv_) { ffi_cif cif; ffi_type **arg_types; void **arg_values; ffi_status status; ffi_type *result_type = NULL; void *result; int args; int i; void *p; uim_lisp ret_; object_type return_object_type; int input_void = 0; args = uim_scm_length(argv_); arg_types = uim_malloc(args * sizeof(void *)); arg_values = uim_malloc(args * sizeof(ffi_type *)); return_object_type = select_object_type(result_); switch (return_object_type) { case RET_UNKNOWN: break; case RET_VOID: result_type = &ffi_type_void; break; case RET_UCHAR: result_type = &ffi_type_uchar; break; case RET_SCHAR: result_type = &ffi_type_schar; break; case RET_USHORT: result_type = &ffi_type_ushort; break; case RET_SSHORT: result_type = &ffi_type_sshort; break; case RET_ULONG: result_type = &ffi_type_ulong; break; case RET_SLONG: result_type = &ffi_type_slong; break; case RET_UINT: result_type = &ffi_type_uint; break; case RET_SINT: result_type = &ffi_type_sint; break; case RET_FLOAT: result_type = &ffi_type_float; break; case RET_DOUBLE: result_type = &ffi_type_double; break; case RET_STR: result_type = &ffi_type_pointer; break; case RET_PTR: result_type = &ffi_type_pointer; break; case RET_SCM: result_type = &ffi_type_pointer; break; } result = uim_malloc(1024); /* huge? */ for (i = 0; i < args; i++) { uim_lisp arg_ = CAR(argv_); switch (select_object_type(CAR(arg_))) { case RET_UNKNOWN: break; case RET_VOID: input_void = 1; break; case RET_UCHAR: p = uim_malloc(sizeof(unsigned char)); *((unsigned char *)p) = C_CHAR(CDR(arg_)); arg_types[i] = &ffi_type_uchar; arg_values[i] = p; break; case RET_SCHAR: p = uim_malloc(sizeof(signed char)); *((signed char *)p) = C_CHAR(CDR(arg_)); arg_types[i] = &ffi_type_schar; arg_values[i] = p; break; case RET_USHORT: p = uim_malloc(sizeof(unsigned short)); *((unsigned short *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_ushort; arg_values[i] = p; break; case RET_SSHORT: p = uim_malloc(sizeof(unsigned short)); *((signed short *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_sshort; arg_values[i] = p; break; case RET_UINT: p = uim_malloc(sizeof(unsigned int)); *((unsigned int *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_uint; arg_values[i] = p; break; case RET_SINT: p = uim_malloc(sizeof(signed int)); *((signed int *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_sint; arg_values[i] = p; break; case RET_ULONG: p = uim_malloc(sizeof(unsigned long)); *((unsigned long *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_ulong; arg_values[i] = p; break; case RET_SLONG: p = uim_malloc(sizeof(signed long)); *((signed long *)p) = C_INT(CDR(arg_)); arg_types[i] = &ffi_type_slong; arg_values[i] = p; break; case RET_FLOAT: { char *endptr; p = uim_malloc(sizeof(float)); *((double *)p) = strtof(REFER_C_STR(CDR(arg_)), &endptr); arg_types[i] = &ffi_type_float; arg_values[i] = p; } break; case RET_DOUBLE: { char *endptr; p = uim_malloc(sizeof(double)); *((double *)p) = strtod(REFER_C_STR(CDR(arg_)), &endptr); arg_types[i] = &ffi_type_double; arg_values[i] = p; } break; case RET_STR: p = uim_malloc(sizeof(void *)); *((void **)p) = (void *)REFER_C_STR(CDR(arg_)); arg_types[i] = &ffi_type_pointer; arg_values[i] = p; break; case RET_PTR: p = uim_malloc(sizeof(void *)); if (NULLP(CDR(arg_))) *((void **)p) = NULL; else *((void **)p) = C_PTR(CDR(arg_)); arg_types[i] = &ffi_type_pointer; arg_values[i] = p; break; case RET_SCM: p = uim_malloc(sizeof(void *)); *((void **)p) = CDR(arg_); arg_types[i] = &ffi_type_pointer; arg_values[i] = p; } argv_ = CDR(argv_); } if (input_void) args = 0; status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, args, result_type, arg_types); switch (status) { case FFI_OK: break; case FFI_BAD_TYPEDEF: ffi_strerr_ = ffi_strerr_messages[FFI_STRERR_BAD_TYPEDEF]; break; case FFI_BAD_ABI: ffi_strerr_ = ffi_strerr_messages[FFI_STRERR_BAD_ABI]; break; default: ffi_strerr_ = ffi_strerr_messages[FFI_STRERR_UNKOWN]; } if (status == FFI_OK) ffi_call(&cif, (void (*)(void))C_PTR(fun_), result, arg_values); for (i = 0; i < args; i++) free(arg_values[i]); free(arg_types); free(arg_values); if (status != FFI_OK) { free(result); return uim_scm_f(); } ret_ = uim_scm_f(); switch (return_object_type) { case RET_UNKNOWN: case RET_VOID: break; case RET_UCHAR: ret_ = MAKE_CHAR(*(unsigned char *)result); break; case RET_SCHAR: ret_ = MAKE_CHAR(*(signed char *)result); break; case RET_USHORT: ret_ = MAKE_INT(*(unsigned short *)result); break; case RET_SSHORT: ret_ = MAKE_INT(*(signed short *)result); break; case RET_UINT: ret_ = MAKE_INT(*(unsigned int *)result); break; case RET_SINT: ret_ = MAKE_INT(*(signed int *)result); break; case RET_ULONG: ret_ = MAKE_INT(*(unsigned long *)result); break; case RET_SLONG: ret_ = MAKE_INT(*(signed long *)result); break; case RET_FLOAT: { char str[1024]; snprintf(str, sizeof(str), "%f", *((float *)result)); ret_ = MAKE_STR(str); } break; case RET_DOUBLE: { char str[1024]; snprintf(str, sizeof(str), "%f", *((double *)result)); ret_ = MAKE_STR(str); } break; case RET_STR: ret_ = MAKE_STR(*((char **)result)); break; case RET_PTR: ret_ = MAKE_PTR(*((void **)result)); break; case RET_SCM: ret_ = *(uim_lisp *)result; break; } free(result); ffi_strerr_ = NULL; return ret_; }
static void cls() { memsetw(video_memory, MAKE_CHAR(' ', c_fore, c_back), 80 * 25); cursor_x = cursor_y = 0; update_cursor(); }