ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/command.C
(Generate patch)

Comparing rxvt-unicode/src/command.C (file contents):
Revision 1.590 by sf-exg, Tue May 11 18:46:50 2021 UTC vs.
Revision 1.600 by sf-exg, Sun Feb 19 08:48:42 2023 UTC

25 * - extensive modifications 25 * - extensive modifications
26 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> 26 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
27 * Copyright (c) 2001 Marius Gedminas 27 * Copyright (c) 2001 Marius Gedminas
28 * - Ctrl/Mod4+Tab works like Meta+Tab (options) 28 * - Ctrl/Mod4+Tab works like Meta+Tab (options)
29 * Copyright (c) 2003 Rob McMullen <robm@flipturn.org> 29 * Copyright (c) 2003 Rob McMullen <robm@flipturn.org>
30 * Copyright (c) 2003-2014 Marc Lehmann <schmorp@schmorp.de> 30 * Copyright (c) 2003-2021 Marc Lehmann <schmorp@schmorp.de>
31 * Copyright (c) 2007,2015 Emanuele Giaquinta <e.giaquinta@glauco.it> 31 * Copyright (c) 2007,2015 Emanuele Giaquinta <e.giaquinta@glauco.it>
32 * 32 *
33 * This program is free software; you can redistribute it and/or modify 33 * This program is free software; you can redistribute it and/or modify
34 * it under the terms of the GNU General Public License as published by 34 * it under the terms of the GNU General Public License as published by
35 * the Free Software Foundation; either version 3 of the License, or 35 * the Free Software Foundation; either version 3 of the License, or
168 int len; 168 int len;
169 169
170# if ENABLE_COMBINING 170# if ENABLE_COMBINING
171 if (IS_COMPOSE (ch)) 171 if (IS_COMPOSE (ch))
172 { 172 {
173 len = rxvt_composite.expand (ch, 0); 173 len = rxvt_composite.expand (ch);
174 alloc = chr = new wchar_t[len]; 174 alloc = chr = new wchar_t[len];
175 rxvt_composite.expand (ch, chr); 175 rxvt_composite.expand (ch, chr);
176 } 176 }
177 else 177 else
178# endif 178# endif
1016/* checks whether a refresh is requested and starts the refresh timer */ 1016/* checks whether a refresh is requested and starts the refresh timer */
1017void 1017void
1018rxvt_term::refresh_check () 1018rxvt_term::refresh_check ()
1019{ 1019{
1020 if (want_refresh && !flush_ev.is_active ()) 1020 if (want_refresh && !flush_ev.is_active ())
1021 flush_ev.start (1. / 60.); // refresh at max. 60 Hz normally 1021 flush_ev.start ();
1022 1022
1023 display->flush (); 1023 display->flush ();
1024} 1024}
1025 1025
1026void 1026void
2352 } 2352 }
2353} 2353}
2354 2354
2355// read the next character 2355// read the next character
2356wchar_t ecb_hot 2356wchar_t ecb_hot
2357rxvt_term::next_char () NOTHROW 2357rxvt_term::next_char () noexcept
2358{ 2358{
2359 while (cmdbuf_ptr < cmdbuf_endp) 2359 while (cmdbuf_ptr < cmdbuf_endp)
2360 { 2360 {
2361 // assume 7-bit to be ascii ALWAYS (always true in POSIX) 2361 // assume 7-bit to be ascii ALWAYS (always true in POSIX)
2362 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f)) 2362 if (ecb_likely ((unsigned char)*cmdbuf_ptr <= 0x7f))
2388 return NOCHAR; 2388 return NOCHAR;
2389} 2389}
2390 2390
2391// read the next octet 2391// read the next octet
2392uint32_t ecb_hot 2392uint32_t ecb_hot
2393rxvt_term::next_octet () NOTHROW 2393rxvt_term::next_octet () noexcept
2394{ 2394{
2395 return cmdbuf_ptr < cmdbuf_endp 2395 return cmdbuf_ptr < cmdbuf_endp
2396 ? (unsigned char)*cmdbuf_ptr++ 2396 ? (unsigned char)*cmdbuf_ptr++
2397 : NOCHAR; 2397 : NOCHAR;
2398} 2398}
2399 2399
2400static class out_of_input out_of_input; 2400static class out_of_input out_of_input;
2401 2401
2402wchar_t ecb_hot 2402wchar_t ecb_hot
2403rxvt_term::cmd_getc () THROW ((class out_of_input)) 2403rxvt_term::cmd_getc ()
2404{ 2404{
2405 wchar_t c = next_char (); 2405 wchar_t c = next_char ();
2406 2406
2407 if (c == NOCHAR) 2407 if (c == NOCHAR)
2408 throw out_of_input; 2408 throw out_of_input;
2409 2409
2410 return c; 2410 return c;
2411} 2411}
2412 2412
2413uint32_t ecb_hot 2413uint32_t ecb_hot
2414rxvt_term::cmd_get8 () THROW ((class out_of_input)) 2414rxvt_term::cmd_get8 ()
2415{ 2415{
2416 uint32_t c = next_octet (); 2416 uint32_t c = next_octet ();
2417 2417
2418 if (c == NOCHAR) 2418 if (c == NOCHAR)
2419 throw out_of_input; 2419 throw out_of_input;
3019 case 7: /* unofficial extension */ 3019 case 7: /* unofficial extension */
3020 if (option (Opt_insecure)) 3020 if (option (Opt_insecure))
3021 tt_printf ("%-.250s\012", rs[Rs_display_name]); 3021 tt_printf ("%-.250s\012", rs[Rs_display_name]);
3022 break; 3022 break;
3023 case 8: /* unofficial extension */ 3023 case 8: /* unofficial extension */
3024 {
3025 string_term st;
3026 st.v[0] = CHAR_ST;
3027 st.v[1] = '\0';
3024 process_xterm_seq (XTerm_title, RESNAME "-" VERSION, CHAR_ST); 3028 process_xterm_seq (XTerm_title, (char *)RESNAME "-" VERSION, st); // char * cast verified
3025 break; 3029 break;
3030 }
3026 } 3031 }
3027 break; 3032 break;
3028 3033
3029 case CSI_TBC: /* 8.3.155: (0) TABULATION CLEAR */ 3034 case CSI_TBC: /* 8.3.155: (0) TABULATION CLEAR */
3030 switch (arg[0]) 3035 switch (arg[0])
3215/* 3220/*
3216 * get input up until STRING TERMINATOR (or BEL) 3221 * get input up until STRING TERMINATOR (or BEL)
3217 * ends_how is terminator used. returned input must be free()'d 3222 * ends_how is terminator used. returned input must be free()'d
3218 */ 3223 */
3219char * 3224char *
3220rxvt_term::get_to_st (unicode_t &ends_how) 3225rxvt_term::get_to_st (string_term &st)
3221{ 3226{
3222 unicode_t ch; 3227 unicode_t ch;
3223 bool seen_esc = false; 3228 bool seen_esc = false;
3224 unsigned int n = 0; 3229 unsigned int n = 0;
3225 wchar_t string[CBUFSIZ]; 3230 wchar_t string[CBUFSIZ];
3254 string[n++] = ch; 3259 string[n++] = ch;
3255 } 3260 }
3256 3261
3257 string[n++] = '\0'; 3262 string[n++] = '\0';
3258 3263
3259 ends_how = (ch == 0x5c ? C0_ESC : ch); 3264 n = 0;
3265 if (ch == 0x5c)
3266 st.v[n++] = C0_ESC;
3267 st.v[n++] = ch;
3268 st.v[n] = '\0';
3260 3269
3261 return rxvt_wcstombs (string); 3270 return rxvt_wcstombs (string);
3262} 3271}
3263 3272
3264/*----------------------------------------------------------------------*/ 3273/*----------------------------------------------------------------------*/
3270{ 3279{
3271 /* 3280 /*
3272 * Not handled yet 3281 * Not handled yet
3273 */ 3282 */
3274 3283
3275 unicode_t eh; 3284 string_term st;
3276 char *s = get_to_st (eh); 3285 char *s = get_to_st (st);
3277 if (s) 3286 if (s)
3278 free (s); 3287 free (s);
3279 3288
3280 return; 3289 return;
3281} 3290}
3293 for (arg = 0; isdigit (ch); ch = cmd_getc ()) 3302 for (arg = 0; isdigit (ch); ch = cmd_getc ())
3294 arg = arg * 10 + (ch - '0'); 3303 arg = arg * 10 + (ch - '0');
3295 3304
3296 if (ch == ';') 3305 if (ch == ';')
3297 { 3306 {
3298 unicode_t eh; 3307 string_term st;
3299 char *s = get_to_st (eh); 3308 char *s = get_to_st (st);
3300 3309
3301 if (s) 3310 if (s)
3302 { 3311 {
3303 process_xterm_seq (arg, s, eh); 3312 process_xterm_seq (arg, s, st);
3304 free (s); 3313 free (s);
3305 } 3314 }
3306 } 3315 }
3307} 3316}
3308 3317
3334 3343
3335 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b; 3344 uint32_t color = (a << 24) | (r << 16) | (g << 8) | b;
3336 3345
3337 /* we allow one of the 6 closest neighbouring colours */ 3346 /* we allow one of the 6 closest neighbouring colours */
3338 /* to replace the current color, if they not used recently */ 3347 /* to replace the current color, if they not used recently */
3348 #if 0
3339 static const signed char dxyz[][3] = { 3349 static const unsigned char dxyz[][3] = {
3340 0, 0, 0, 3350 0, 0, 0,
3341 0, 0, 4, 3351 0, 0, 4,
3342 0, 4, 0,
3343 4, 0, 0,
3344 0, 4, 4, 3352 0, 4, 4,
3345 4, 4, 0, 3353 4, 4, 0,
3346 4, 0, 4, 3354 4, 0, 4,
3355 0, 4, 0,
3356 4, 0, 0,
3347 }; 3357 };
3358 #else
3359 // silly compressed verlapping triplets version of above
3360 static const unsigned char dxyz[] = {
3361 0, 0, 0, 4, 4, 0, 4, 0, 0,
3362 };
3363 #endif
3348 3364
3349 static const unsigned char color_level[8][32] = { 3365 static const unsigned char color_level[8][32] = {
3350 // neighbour index 3366 // neighbour index
3351 {0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}, 3367 {0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3},
3352 {0, 1, 0, 1, 1, 2, 1, 1, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4}, 3368 {0, 1, 0, 1, 1, 2, 1, 1, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4},
3359 {0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6}, 3375 {0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6},
3360 }; 3376 };
3361 3377
3362 unsigned int idx; 3378 unsigned int idx;
3363 3379
3364 for (int n = 0; n < ecb_array_length (dxyz); ++n) 3380 for (int n = 0; n < ecb_array_length (dxyz) - 2; ++n)
3365 { 3381 {
3366 unsigned int idx_r = color_level[ Red_levels - dxyz[n][0]][r / 8]; 3382 unsigned int idx_r = color_level[ Red_levels - dxyz[n + 0]][r / 8];
3367 unsigned int idx_g = color_level[Green_levels - dxyz[n][1]][g / 8]; 3383 unsigned int idx_g = color_level[Green_levels - dxyz[n + 1]][g / 8];
3368 unsigned int idx_b = color_level[ Blue_levels - dxyz[n][2]][b / 8]; 3384 unsigned int idx_b = color_level[ Blue_levels - dxyz[n + 2]][b / 8];
3369 unsigned int index = colorcube_index (idx_r, idx_g, idx_b); 3385 unsigned int index = colorcube_index (idx_r, idx_g, idx_b);
3370 3386
3371 if (n == 0) 3387 if (n == 0)
3372 idx = index; 3388 idx = index;
3373 3389
3383 idx = index; 3399 idx = index;
3384 goto update; 3400 goto update;
3385 } 3401 }
3386 3402
3387 // like (rgb24_seqno[idx] > rgb24_seqno[index]) 3403 // like (rgb24_seqno[idx] > rgb24_seqno[index])
3388 // but also handles wrap around values good enough 3404 // but also handles wrap around values well enough
3389 if ((uint16_t)(rgb24_seqno[idx] - rgb24_seqno[index]) < 0x7fff) 3405 if ((uint16_t)(rgb24_seqno[idx] - rgb24_seqno[index]) < 0x8000)
3390 idx = index; 3406 idx = index;
3391 } 3407 }
3392 3408
3393update: 3409update:
3394 rgb24_color[idx] = color; 3410 rgb24_color[idx] = color;
3401 3417
3402 return idx; 3418 return idx;
3403} 3419}
3404 3420
3405void 3421void
3406rxvt_term::process_color_seq (int report, int color, const char *str, char resp) 3422rxvt_term::process_color_seq (int report, int color, const char *str, string_term &st)
3407{ 3423{
3408 if (str[0] == '?' && !str[1]) 3424 if (str[0] == '?' && !str[1])
3409 { 3425 {
3410 if (!IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
3411 return;
3412
3413 rgba c; 3426 rgba c;
3414 pix_colors_focused[color].get (c); 3427 pix_colors_focused[color].get (c);
3415 color -= minCOLOR; 3428 char rgba_str[32];
3416 3429
3417#if XFT 3430#if XFT
3418 if (c.a != rgba::MAX_CC) 3431 if (c.a != rgba::MAX_CC)
3419 tt_printf ("\033]%d;%d;rgba:%04x/%04x/%04x/%04x%c", report, color, c.r, c.g, c.b, c.a, resp); 3432 snprintf (rgba_str, sizeof (rgba_str), "rgba:%04x/%04x/%04x/%04x", c.r, c.g, c.b, c.a);
3420 else 3433 else
3421#endif 3434#endif
3422 tt_printf ("\033]%d;%d;rgb:%04x/%04x/%04x%c", report, color, c.r, c.g, c.b, resp); 3435 snprintf (rgba_str, sizeof (rgba_str), "rgb:%04x/%04x/%04x", c.r, c.g, c.b);
3436
3437 if (IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
3438 tt_printf ("\033]%d;%d;%s%s", report, color - minCOLOR, rgba_str, st.v);
3439 else
3440 tt_printf ("\033]%d;%s%s", report, rgba_str, st.v);
3423 } 3441 }
3424 else 3442 else
3425 set_window_color (color, str); 3443 set_window_color (color, str);
3426} 3444}
3427 3445
3428/* 3446/*
3429 * XTerm escape sequences: ESC ] Ps;Pt (ST|BEL) 3447 * XTerm escape sequences: ESC ] Ps;Pt (ST|BEL)
3430 */ 3448 */
3431void 3449void
3432rxvt_term::process_xterm_seq (int op, char *str, char resp) 3450rxvt_term::process_xterm_seq (int op, char *str, string_term &st)
3433{ 3451{
3434 int color; 3452 int color;
3435 char *buf, *name; 3453 char *buf, *name;
3436 bool query = str[0] == '?' && !str[1]; 3454 bool query = str[0] == '?' && !str[1];
3437 int saveop = op; 3455 int saveop = op;
3472 &nitems, &bytes_after, &value) == Success 3490 &nitems, &bytes_after, &value) == Success
3473 && actual_type != None 3491 && actual_type != None
3474 && actual_format == 8) 3492 && actual_format == 8)
3475 str = (const char *)(value); 3493 str = (const char *)(value);
3476 3494
3477 tt_printf ("\033]%d;%s%c", op, option (Opt_insecure) ? str : "", resp); 3495 tt_printf ("\033]%d;%s%s", op, option (Opt_insecure) ? str : "", st.v);
3478 3496
3479 XFree (value); 3497 XFree (value);
3480 } 3498 }
3481 else 3499 else
3482 { 3500 {
3506 break; 3524 break;
3507 3525
3508 if ((buf = strchr (name, ';')) != NULL) 3526 if ((buf = strchr (name, ';')) != NULL)
3509 *buf++ = '\0'; 3527 *buf++ = '\0';
3510 3528
3511 process_color_seq (op, color, name, resp); 3529 process_color_seq (op, color, name, st);
3512 } 3530 }
3513 break; 3531 break;
3514 case Rxvt_restoreFG: 3532 case Rxvt_restoreFG:
3515 case XTerm_Color00: 3533 case XTerm_Color00:
3516 process_color_seq (op, Color_fg, str, resp); 3534 process_color_seq (op, Color_fg, str, st);
3517 break; 3535 break;
3518 case Rxvt_restoreBG: 3536 case Rxvt_restoreBG:
3519 case XTerm_Color01: 3537 case XTerm_Color01:
3520 process_color_seq (op, Color_bg, str, resp); 3538 process_color_seq (op, Color_bg, str, st);
3521 break; 3539 break;
3522#ifndef NO_CURSORCOLOR 3540#ifndef NO_CURSORCOLOR
3523 case XTerm_Color_cursor: 3541 case XTerm_Color_cursor:
3524 process_color_seq (op, Color_cursor, str, resp); 3542 process_color_seq (op, Color_cursor, str, st);
3525 break; 3543 break;
3526#endif 3544#endif
3527 case XTerm_Color_pointer_fg: 3545 case XTerm_Color_pointer_fg:
3528 process_color_seq (op, Color_pointer_fg, str, resp); 3546 process_color_seq (op, Color_pointer_fg, str, st);
3529 break; 3547 break;
3530 case XTerm_Color_pointer_bg: 3548 case XTerm_Color_pointer_bg:
3531 process_color_seq (op, Color_pointer_bg, str, resp); 3549 process_color_seq (op, Color_pointer_bg, str, st);
3532 break; 3550 break;
3533#ifdef OPTION_HC 3551#ifdef OPTION_HC
3534 case XTerm_Color_HC: 3552 case XTerm_Color_HC:
3535 process_color_seq (op, Color_HC, str, resp); 3553 process_color_seq (op, Color_HC, str, st);
3536 break; 3554 break;
3537 case XTerm_Color_HTC: 3555 case XTerm_Color_HTC:
3538 process_color_seq (op, Color_HTC, str, resp); 3556 process_color_seq (op, Color_HTC, str, st);
3539 break; 3557 break;
3540#endif 3558#endif
3541#ifndef NO_BOLD_UNDERLINE_REVERSE 3559#ifndef NO_BOLD_UNDERLINE_REVERSE
3542 case URxvt_Color_BD: 3560 case URxvt_Color_BD:
3543 process_color_seq (op, Color_BD, str, resp); 3561 process_color_seq (op, Color_BD, str, st);
3544 break; 3562 break;
3545 case URxvt_Color_UL: 3563 case URxvt_Color_UL:
3546 process_color_seq (op, Color_UL, str, resp); 3564 process_color_seq (op, Color_UL, str, st);
3547 break; 3565 break;
3548 case URxvt_Color_IT: 3566 case URxvt_Color_IT:
3549 process_color_seq (op, Color_IT, str, resp); 3567 process_color_seq (op, Color_IT, str, st);
3550 break; 3568 break;
3551#endif 3569#endif
3552 case URxvt_Color_border: 3570 case URxvt_Color_border:
3553 process_color_seq (op, Color_border, str, resp); 3571 process_color_seq (op, Color_border, str, st);
3554 break; 3572 break;
3555 3573
3556 case XTerm_logfile: 3574 case XTerm_logfile:
3557 // TODO, when secure mode? 3575 // TODO, when secure mode?
3558 break; 3576 break;
3576 case URxvt_boldFont: 3594 case URxvt_boldFont:
3577 case URxvt_italicFont: 3595 case URxvt_italicFont:
3578 case URxvt_boldItalicFont: 3596 case URxvt_boldItalicFont:
3579#endif 3597#endif
3580 if (query) 3598 if (query)
3581 tt_printf ("\33]%d;%-.250s%c", saveop, 3599 tt_printf ("\33]%d;%-.250s%s", saveop,
3582 option (Opt_insecure) && fontset[op - URxvt_font]->fontdesc 3600 option (Opt_insecure) && fontset[op - URxvt_font]->fontdesc
3583 ? fontset[op - URxvt_font]->fontdesc : "", 3601 ? fontset[op - URxvt_font]->fontdesc : "",
3584 resp); 3602 st.v);
3585 else 3603 else
3586 { 3604 {
3587 const char *&res = rs[Rs_font + (op - URxvt_font)]; 3605 const char *&res = rs[Rs_font + (op - URxvt_font)];
3588 3606
3589 res = strdup (str); 3607 res = strdup (str);
3592 } 3610 }
3593 break; 3611 break;
3594 3612
3595 case URxvt_version: 3613 case URxvt_version:
3596 if (query) 3614 if (query)
3597 tt_printf ("\33]%d;rxvt-unicode;%-.20s;%c;%c%c", 3615 tt_printf ("\33]%d;rxvt-unicode;%-.20s;%c;%c%s",
3598 op, 3616 op,
3599 rs[Rs_name], VERSION[0], VERSION[2], 3617 rs[Rs_name], VERSION[0], VERSION[2],
3600 resp); 3618 st.v);
3601 break; 3619 break;
3602 3620
3603#if !ENABLE_MINIMAL 3621#if !ENABLE_MINIMAL
3622 case URxvt_cellinfo:
3623 if (query)
3624 tt_printf ("\33]%d;%d;%d;%d%s", saveop,
3625 fwidth, fheight, fbase,
3626 st.v);
3627 break;
3628
3604 case URxvt_locale: 3629 case URxvt_locale:
3605 if (query) 3630 if (query)
3606 tt_printf ("\33]%d;%-.250s%c", op, option (Opt_insecure) ? locale : "", resp); 3631 tt_printf ("\33]%d;%-.250s%s", op, option (Opt_insecure) ? locale : "", st.v);
3607 else 3632 else
3608 { 3633 {
3609 set_locale (str); 3634 set_locale (str);
3610 pty->set_utf8_mode (enc_utf8); 3635 pty->set_utf8_mode (enc_utf8);
3611 init_xlocale (); 3636 init_xlocale ();
3626 break; 3651 break;
3627#endif 3652#endif
3628 3653
3629#if ENABLE_PERL 3654#if ENABLE_PERL
3630 case URxvt_perl: 3655 case URxvt_perl:
3631 HOOK_INVOKE ((this, HOOK_OSC_SEQ_PERL, DT_STR, str, DT_STR_LEN, &resp, 1, DT_END)); 3656 HOOK_INVOKE ((this, HOOK_OSC_SEQ_PERL, DT_STR, str, DT_STR, st.v, DT_END));
3632 break; 3657 break;
3633#endif 3658#endif
3634 } 3659 }
3635} 3660}
3636/*----------------------------------------------------------------------*/ 3661/*----------------------------------------------------------------------*/
3731 // 1037 send DEL for keypad delete NYI 3756 // 1037 send DEL for keypad delete NYI
3732 { 1047, PrivMode_Screen }, 3757 { 1047, PrivMode_Screen },
3733 // 1048 save and restore cursor, implemented in code 3758 // 1048 save and restore cursor, implemented in code
3734 { 1049, PrivMode_Screen }, /* xterm extension, clear screen on ti rather than te */ 3759 { 1049, PrivMode_Screen }, /* xterm extension, clear screen on ti rather than te */
3735 // 1051, 1052, 1060, 1061 keyboard emulation NYI 3760 // 1051, 1052, 1060, 1061 keyboard emulation NYI
3761#if ENABLE_FRILLS
3736 { 2004, PrivMode_BracketPaste }, 3762 { 2004, PrivMode_BracketPaste },
3763#endif
3737 }; 3764 };
3738 3765
3739 if (nargs == 0) 3766 if (nargs == 0)
3740 return; 3767 return;
3741 3768

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines