@@ -73,10 +73,71 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = {
73
73
74
74
ZEND_EXTERN_MODULE_GLOBALS (phpdbg );
75
75
76
+ int phpdbg_confirm (char * message TSRMLS_DC )
77
+ {
78
+ char cmd [PHPDBG_MAX_CMD ];
79
+
80
+ zend_bool confirmed = 0 ,
81
+ result = 0 ;
82
+
83
+ phpdbg_writeln (message );
84
+
85
+ do {
86
+ phpdbg_error ("Confirm (y or n) ?" );
87
+
88
+ if ((fgets (cmd , PHPDBG_MAX_CMD , stdin ) != NULL )) {
89
+ switch (cmd [0 ]) {
90
+ case 'y' :
91
+ case 'Y' : {
92
+ result = 1 ;
93
+ confirmed = 1 ;
94
+ } break ;
95
+
96
+ case 'n' :
97
+ case 'N' : {
98
+ confirmed = 1 ;
99
+ } break ;
100
+ }
101
+ }
102
+ } while (!confirmed );
103
+
104
+ return result ;
105
+ }
106
+
107
+ void phpdbg_sigint_handler (int signum )
108
+ {
109
+ TSRMLS_FETCH ();
110
+
111
+ phpdbg_writeln (EMPTY );
112
+
113
+ signal (signum , SIG_IGN );
114
+
115
+ if (EG (in_execution )) {
116
+ if (phpdbg_confirm (
117
+ "Do you really want to quit while executing ?" TSRMLS_CC )) {
118
+ PHPDBG_G (flags ) |= PHPDBG_IS_QUITTING ;
119
+
120
+ zend_bailout ();
121
+ } else {
122
+ signal (
123
+ SIGINT , phpdbg_sigint_handler );
124
+ phpdbg_interactive (TSRMLS_C );
125
+ }
126
+ } else {
127
+ phpdbg_notice ("Interrupted ..." );
128
+
129
+ PHPDBG_G (flags ) = PHPDBG_IS_QUITTING ;
130
+
131
+ zend_bailout ();
132
+ }
133
+ }
134
+
76
135
void phpdbg_init (char * init_file , size_t init_file_len , zend_bool use_default TSRMLS_DC ) /* {{{ */
77
136
{
78
137
zend_bool init_default = 0 ;
79
138
139
+ signal (SIGINT , phpdbg_sigint_handler );
140
+
80
141
if (!init_file && use_default ) {
81
142
struct stat sb ;
82
143
@@ -90,9 +151,13 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TS
90
151
if (init_file ) {
91
152
FILE * fp = fopen (init_file , "r" );
92
153
if (fp ) {
154
+ int line = 1 ;
155
+
93
156
char cmd [PHPDBG_MAX_CMD ];
94
157
size_t cmd_len = 0L ;
95
- int line = 1 ;
158
+ char * code = NULL ;
159
+ size_t code_len = 0L ;
160
+ zend_bool in_code = 0 ;
96
161
97
162
while (fgets (cmd , PHPDBG_MAX_CMD , fp ) != NULL ) {
98
163
cmd_len = strlen (cmd )- 1 ;
@@ -103,15 +168,56 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TS
103
168
cmd [cmd_len ] = '\0' ;
104
169
105
170
if (* cmd && cmd_len > 0L && cmd [0 ] != '#' ) {
106
- switch (phpdbg_do_cmd (phpdbg_prompt_commands , cmd , cmd_len TSRMLS_CC )) {
107
- case FAILURE :
108
- phpdbg_error (
109
- "Unrecognized command in %s:%d: %s!" , init_file , line , cmd );
110
- break ;
171
+ if (cmd_len == 2 ) {
172
+ if (memcmp (cmd , "<:" , sizeof ("<:" )- 1 ) == SUCCESS ) {
173
+ in_code = 1 ;
174
+ goto next_line ;
175
+ } else {
176
+ if (memcmp (cmd , ":>" , sizeof (":>" )- 1 ) == SUCCESS ) {
177
+ in_code = 0 ;
178
+ code [code_len ] = '\0' ;
179
+ {
180
+ zend_eval_stringl (
181
+ code , code_len , NULL , "phpdbginit code" TSRMLS_CC );
182
+ }
183
+ free (code );
184
+ code = NULL ;
185
+ goto next_line ;
186
+ }
187
+ }
188
+ }
189
+
190
+ if (in_code ) {
191
+ if (code == NULL ) {
192
+ code = malloc (cmd_len );
193
+ } else code = realloc (code , code_len + cmd_len );
194
+
195
+ if (code ) {
196
+ memcpy (
197
+ & code [code_len ], cmd , cmd_len );
198
+ code_len += cmd_len ;
199
+ }
200
+ goto next_line ;
201
+ }
202
+
203
+ switch (cmd [0 ]) {
204
+
205
+ default : switch (phpdbg_do_cmd (phpdbg_prompt_commands , cmd , cmd_len TSRMLS_CC )) {
206
+ case FAILURE :
207
+ phpdbg_error (
208
+ "Unrecognized command in %s:%d: %s!" , init_file , line , cmd );
209
+ break ;
210
+ }
111
211
}
112
212
}
213
+ next_line :
113
214
line ++ ;
114
215
}
216
+
217
+ if (code ) {
218
+ free (code );
219
+ }
220
+
115
221
fclose (fp );
116
222
} else {
117
223
phpdbg_error (
0 commit comments