History

the only constant is change.

Ge Wang committed 9 years ago

Commit 009ac191 parent b1e2669181 files · +0 −3911Browse files

Showing the changes to src/core/util_console.cpp (1 of 181 files). Show all

Unified · Split

src/core/util_console.cpp+210−0
@@ -0,0 +1,210 @@
1/*----------------------------------------------------------------------------
2 ChucK Concurrent, On-the-fly Audio Programming Language
3 Compiler and Virtual Machine
4
5 Copyright (c) 2004 Ge Wang and Perry R. Cook. All rights reserved.
6 http://chuck.stanford.edu/
7 http://chuck.cs.princeton.edu/
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22 U.S.A.
23-----------------------------------------------------------------------------*/
24
25//-----------------------------------------------------------------------------
26// file: util_console.cpp
27// desc: utility for console I/O
28//
29// author: Spencer Salazar (spencer@ccrma.stanford.edu)
30// date: Autumn 2005
31//-----------------------------------------------------------------------------
32#include "util_console.h"
33#include "chuck_errmsg.h"
34#include <stdio.h>
35#ifdef __USE_READLINE__
36 #include <readline/readline.h>
37#else
38 #include <stdlib.h>
39 #define CONSOLE_INPUT_BUFFER_SIZE 255
40#endif
41
42char * io_readline( const char * prompt )
43{
44#ifdef __USE_READLINE__
45
46 // call the real readline
47 return readline( prompt );
48
49#else
50
51 // insert our hack
52 char * buf=(char *)malloc( CONSOLE_INPUT_BUFFER_SIZE * sizeof(char) );
53 char * result;
54
55 fputs( prompt, stdout );
56
57 result = fgets( buf, CONSOLE_INPUT_BUFFER_SIZE, stdin );
58
59 if( result == NULL )
60 {
61 free( buf );
62 return NULL;
63 }
64
65 for( int i=0; i < CONSOLE_INPUT_BUFFER_SIZE; i++ )
66 if(buf[i] == '\n' )
67 {
68 buf[i] = 0;
69 break;
70 }
71
72 return buf;
73
74#endif
75}
76
77void io_addhistory( const char * addme )
78{
79#ifdef __USE_READLINE__
80
81 add_history( addme );
82
83#else
84
85 //do nothing
86
87#endif
88}
89
90
91// code thanks to Luke Lin (wdlin@CCCA.NCTU.edu.tw)
92// kb hit
93#ifndef __PLATFORM_WIN32__
94 #include <string.h>
95#ifdef __PLATFORM_MACOSX__
96 #include <termios.h>
97 static struct termios g_save;
98#else
99 #include <termio.h>
100 static struct termio g_save;
101#endif
102
103 #include <unistd.h>
104 #include <sys/ioctl.h>
105#else
106 #include <conio.h>
107#endif
108
109
110// global
111static t_CKINT g_c;
112static t_CKBOOL g_init;
113
114
115// on entering mode
116t_CKBOOL kb_initscr()
117{
118 if( g_init ) return FALSE;
119
120#ifndef __PLATFORM_WIN32__
121
122#ifdef __PLATFORM_MACOSX__
123 struct termios term;
124 if( ioctl( 0, TIOCGETA, &term ) == -1 )
125#else
126 struct termio term;
127 if( ioctl( 0, TCGETA, &term ) == -1 )
128#endif
129 {
130 EM_log( CK_LOG_SEVERE, "(kbhit disabled): standard input not a tty!");
131 return FALSE;
132 }
133
134 // log
135 EM_log( CK_LOG_INFO, "starting kb hit immediate mode..." );
136
137 g_save = term;
138
139 term.c_lflag &= ~ICANON;
140 term.c_lflag &= ~ECHO;
141
142 term.c_cc[VMIN] = 0;
143 term.c_cc[VTIME]=0;
144
145#ifdef __PLATFORM_MACOSX__
146 ioctl( 0, TIOCSETA, &term );
147#else
148 ioctl( 0, TCSETA, &term );
149#endif
150
151#endif
152
153 g_init = TRUE;
154 return TRUE;
155}
156
157
158// on exit
159void kb_endwin()
160{
161 if( !g_init ) return;
162
163#ifndef __PLATFORM_WIN32__
164#ifdef __PLATFORM_MACOSX__
165 ioctl( 0, TIOCSETA, &g_save );
166#else
167 ioctl( 0, TCSETA, &g_save );
168#endif
169#endif
170
171 g_init = FALSE;
172}
173
174
175// hit
176t_CKINT kb_hit()
177{
178#ifndef __PLATFORM_WIN32__
179 int ifkeyin;
180 char c;
181 ifkeyin = read( 0, &c, 1 );
182 g_c = (t_CKINT)c;
183
184 // log
185 EM_log( CK_LOG_FINE, "kb hit! %i : %c", ifkeyin, c );
186
187 return (ifkeyin);
188#else
189 return (t_CKINT)kbhit();
190#endif
191}
192
193
194// get
195t_CKINT kb_getch()
196{
197#ifndef __PLATFORM_WIN32__
198 return g_c;
199#else
200 return (t_CKINT)::getch();
201#endif
202}
203
204
205// ready
206t_CKBOOL kb_ready()
207{
208 return g_init;
209}
210

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t