summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorPaul Fox <pgf@brightstareng.com>2006-03-07 20:26:11 +0000
committerPaul Fox <pgf@brightstareng.com>2006-03-07 20:26:11 +0000
commit0f2dd9f4eb9007bf44aa3f0cf30a35c36fbbd5b2 (patch)
treed4141ab0db5186ed9808b5e635868cea38b811db /shell
parentdfba741457cc81eb2ed3a9d4c074fbad74aa3249 (diff)
downloadbusybox-w32-0f2dd9f4eb9007bf44aa3f0cf30a35c36fbbd5b2.tar.gz
busybox-w32-0f2dd9f4eb9007bf44aa3f0cf30a35c36fbbd5b2.tar.bz2
busybox-w32-0f2dd9f4eb9007bf44aa3f0cf30a35c36fbbd5b2.zip
vi-mode changes: eliminate warnings from out-of-range-for-type
case labels that are emitted by gcc4. rearrange macros to eliminate these extra case labels entirely (since the optimizer may no longer do it for us). eliminate static BUFSIZ character deletion buffer -- malloc it, and make it much much smaller.
Diffstat (limited to 'shell')
-rw-r--r--shell/cmdedit.c130
1 files changed, 65 insertions, 65 deletions
diff --git a/shell/cmdedit.c b/shell/cmdedit.c
index 31f4c7b20..d0e642250 100644
--- a/shell/cmdedit.c
+++ b/shell/cmdedit.c
@@ -442,9 +442,10 @@ static void redraw(int y, int back_cursor)
442} 442}
443 443
444#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI 444#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI
445static char delbuf[BUFSIZ]; /* a place to store deleted characters */ 445#define DELBUFSIZ 128
446static char *delp = delbuf; 446static char *delbuf; /* a (malloced) place to store deleted characters */
447static int newdelflag; /* whether delbuf should be reused yet */ 447static char *delp;
448static char newdelflag; /* whether delbuf should be reused yet */
448#endif 449#endif
449 450
450/* Delete the char in front of the cursor, optionally saving it 451/* Delete the char in front of the cursor, optionally saving it
@@ -459,10 +460,13 @@ static void input_delete(int save)
459#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI 460#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI
460 if (save) { 461 if (save) {
461 if (newdelflag) { 462 if (newdelflag) {
463 if (!delbuf)
464 delbuf = malloc(DELBUFSIZ);
465 /* safe if malloc fails */
462 delp = delbuf; 466 delp = delbuf;
463 newdelflag = 0; 467 newdelflag = 0;
464 } 468 }
465 if (delp - delbuf < BUFSIZ) 469 if (delbuf && (delp - delbuf < DELBUFSIZ))
466 *delp++ = command_ps[j]; 470 *delp++ = command_ps[j];
467 } 471 }
468#endif 472#endif
@@ -1370,23 +1374,18 @@ vi_back_motion(char *command)
1370#endif 1374#endif
1371 1375
1372/* 1376/*
1373 * the normal emacs mode and vi's insert mode are the same. 1377 * the emacs and vi modes share much of the code in the big
1374 * commands entered when in vi command mode ("escape mode") get 1378 * command loop. commands entered when in vi's command mode (aka
1375 * an extra bit added to distinguish them. this lets them share 1379 * "escape mode") get an extra bit added to distinguish them --
1376 * much of the code in the big switch and while loop. i 1380 * this keeps them from being self-inserted. this clutters the
1377 * experimented with an ugly macro to make the case labels for 1381 * big switch a bit, but keeps all the code in one place.
1378 * these cases go away entirely when vi mode isn't configured, in
1379 * hopes of letting the jump tables get smaller:
1380 * #define vcase(caselabel) caselabel
1381 * and then
1382 * case CNTRL('A'):
1383 * case vcase(VICMD('0'):)
1384 * but it didn't seem to make any difference in code size,
1385 * and the macro-ized code was too ugly.
1386 */ 1382 */
1387 1383
1388#define VI_cmdbit 0x100 1384#define vbit 0x100
1389#define VICMD(somecmd) ((somecmd)|VI_cmdbit) 1385
1386/* leave out the "vi-mode"-only case labels if vi editing isn't
1387 * configured. */
1388#define vi_case(caselabel) USE_FEATURE_COMMAND_EDITING(caselabel)
1390 1389
1391/* convert uppercase ascii to equivalent control char, for readability */ 1390/* convert uppercase ascii to equivalent control char, for readability */
1392#define CNTRL(uc_char) ((uc_char) - 0x40) 1391#define CNTRL(uc_char) ((uc_char) - 0x40)
@@ -1398,8 +1397,9 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
1398 int break_out = 0; 1397 int break_out = 0;
1399 int lastWasTab = FALSE; 1398 int lastWasTab = FALSE;
1400 unsigned char c; 1399 unsigned char c;
1400 unsigned int ic;
1401#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI 1401#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI
1402 unsigned int ic, prevc; 1402 unsigned int prevc;
1403 int vi_cmdmode = 0; 1403 int vi_cmdmode = 0;
1404#endif 1404#endif
1405 /* prepare before init handlers */ 1405 /* prepare before init handlers */
@@ -1438,38 +1438,37 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ])
1438 /* if we can't read input then exit */ 1438 /* if we can't read input then exit */
1439 goto prepare_to_die; 1439 goto prepare_to_die;
1440 1440
1441 ic = c;
1442
1441#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI 1443#ifdef CONFIG_FEATURE_COMMAND_EDITING_VI
1442 newdelflag = 1; 1444 newdelflag = 1;
1443 ic = c;
1444 if (vi_cmdmode) 1445 if (vi_cmdmode)
1445 ic |= VI_cmdbit; 1446 ic |= vbit;
1446 switch (ic)
1447#else
1448 switch (c)
1449#endif 1447#endif
1448 switch (ic)
1450 { 1449 {
1451 case '\n': 1450 case '\n':
1452 case '\r': 1451 case '\r':
1453 case VICMD('\n'): 1452 vi_case( case '\n'|vbit: )
1454 case VICMD('\r'): 1453 vi_case( case '\r'|vbit: )
1455 /* Enter */ 1454 /* Enter */
1456 goto_new_line(); 1455 goto_new_line();
1457 break_out = 1; 1456 break_out = 1;
1458 break; 1457 break;
1459 case CNTRL('A'): 1458 case CNTRL('A'):
1460 case VICMD('0'): 1459 vi_case( case '0'|vbit: )
1461 /* Control-a -- Beginning of line */ 1460 /* Control-a -- Beginning of line */
1462 input_backward(cursor); 1461 input_backward(cursor);
1463 break; 1462 break;
1464 case CNTRL('B'): 1463 case CNTRL('B'):
1465 case VICMD('h'): 1464 vi_case( case 'h'|vbit: )
1466 case VICMD('\b'): 1465 vi_case( case '\b'|vbit: )
1467 case VICMD(DEL): 1466 vi_case( case DEL|vbit: )
1468 /* Control-b -- Move back one character */ 1467 /* Control-b -- Move back one character */
1469 input_backward(1); 1468 input_backward(1);
1470 break; 1469 break;
1471 case CNTRL('C'): 1470 case CNTRL('C'):
1472 case VICMD(CNTRL('C')): 1471 vi_case( case CNTRL('C')|vbit: )
1473 /* Control-c -- stop gathering input */ 1472 /* Control-c -- stop gathering input */
1474 goto_new_line(); 1473 goto_new_line();
1475#ifndef CONFIG_ASH 1474#ifndef CONFIG_ASH
@@ -1503,13 +1502,13 @@ prepare_to_die:
1503 } 1502 }
1504 break; 1503 break;
1505 case CNTRL('E'): 1504 case CNTRL('E'):
1506 case VICMD('$'): 1505 vi_case( case '$'|vbit: )
1507 /* Control-e -- End of line */ 1506 /* Control-e -- End of line */
1508 input_end(); 1507 input_end();
1509 break; 1508 break;
1510 case CNTRL('F'): 1509 case CNTRL('F'):
1511 case VICMD('l'): 1510 vi_case( case 'l'|vbit: )
1512 case VICMD(' '): 1511 vi_case( case ' '|vbit: )
1513 /* Control-f -- Move forward one character */ 1512 /* Control-f -- Move forward one character */
1514 input_forward(); 1513 input_forward();
1515 break; 1514 break;
@@ -1530,22 +1529,22 @@ prepare_to_die:
1530 printf("\033[J"); 1529 printf("\033[J");
1531 break; 1530 break;
1532 case CNTRL('L'): 1531 case CNTRL('L'):
1533 case VICMD(CNTRL('L')): 1532 vi_case( case CNTRL('L')|vbit: )
1534 /* Control-l -- clear screen */ 1533 /* Control-l -- clear screen */
1535 printf("\033[H"); 1534 printf("\033[H");
1536 redraw(0, len-cursor); 1535 redraw(0, len-cursor);
1537 break; 1536 break;
1538#if MAX_HISTORY >= 1 1537#if MAX_HISTORY >= 1
1539 case CNTRL('N'): 1538 case CNTRL('N'):
1540 case VICMD(CNTRL('N')): 1539 vi_case( case CNTRL('N')|vbit: )
1541 case VICMD('j'): 1540 vi_case( case 'j'|vbit: )
1542 /* Control-n -- Get next command in history */ 1541 /* Control-n -- Get next command in history */
1543 if (get_next_history()) 1542 if (get_next_history())
1544 goto rewrite_line; 1543 goto rewrite_line;
1545 break; 1544 break;
1546 case CNTRL('P'): 1545 case CNTRL('P'):
1547 case VICMD(CNTRL('P')): 1546 vi_case( case CNTRL('P')|vbit: )
1548 case VICMD('k'): 1547 vi_case( case 'k'|vbit: )
1549 /* Control-p -- Get previous command from history */ 1548 /* Control-p -- Get previous command from history */
1550 if (cur_history > 0) { 1549 if (cur_history > 0) {
1551 get_previous_history(); 1550 get_previous_history();
@@ -1556,7 +1555,7 @@ prepare_to_die:
1556 break; 1555 break;
1557#endif 1556#endif
1558 case CNTRL('U'): 1557 case CNTRL('U'):
1559 case VICMD(CNTRL('U')): 1558 vi_case( case CNTRL('U')|vbit: )
1560 /* Control-U -- Clear line before cursor */ 1559 /* Control-U -- Clear line before cursor */
1561 if (cursor) { 1560 if (cursor) {
1562 strcpy(command, command + cursor); 1561 strcpy(command, command + cursor);
@@ -1564,7 +1563,7 @@ prepare_to_die:
1564 } 1563 }
1565 break; 1564 break;
1566 case CNTRL('W'): 1565 case CNTRL('W'):
1567 case VICMD(CNTRL('W')): 1566 vi_case( case CNTRL('W')|vbit: )
1568 /* Control-W -- Remove the last word */ 1567 /* Control-W -- Remove the last word */
1569 while (cursor > 0 && isspace(command[cursor-1])) 1568 while (cursor > 0 && isspace(command[cursor-1]))
1570 input_backspace(); 1569 input_backspace();
@@ -1572,58 +1571,58 @@ prepare_to_die:
1572 input_backspace(); 1571 input_backspace();
1573 break; 1572 break;
1574#if CONFIG_FEATURE_COMMAND_EDITING_VI 1573#if CONFIG_FEATURE_COMMAND_EDITING_VI
1575 case VICMD('i'): 1574 case 'i'|vbit:
1576 vi_cmdmode = 0; 1575 vi_cmdmode = 0;
1577 break; 1576 break;
1578 case VICMD('I'): 1577 case 'I'|vbit:
1579 input_backward(cursor); 1578 input_backward(cursor);
1580 vi_cmdmode = 0; 1579 vi_cmdmode = 0;
1581 break; 1580 break;
1582 case VICMD('a'): 1581 case 'a'|vbit:
1583 input_forward(); 1582 input_forward();
1584 vi_cmdmode = 0; 1583 vi_cmdmode = 0;
1585 break; 1584 break;
1586 case VICMD('A'): 1585 case 'A'|vbit:
1587 input_end(); 1586 input_end();
1588 vi_cmdmode = 0; 1587 vi_cmdmode = 0;
1589 break; 1588 break;
1590 case VICMD('x'): 1589 case 'x'|vbit:
1591 input_delete(1); 1590 input_delete(1);
1592 break; 1591 break;
1593 case VICMD('X'): 1592 case 'X'|vbit:
1594 if (cursor > 0) { 1593 if (cursor > 0) {
1595 input_backward(1); 1594 input_backward(1);
1596 input_delete(1); 1595 input_delete(1);
1597 } 1596 }
1598 break; 1597 break;
1599 case VICMD('W'): 1598 case 'W'|vbit:
1600 vi_Word_motion(command, 1); 1599 vi_Word_motion(command, 1);
1601 break; 1600 break;
1602 case VICMD('w'): 1601 case 'w'|vbit:
1603 vi_word_motion(command, 1); 1602 vi_word_motion(command, 1);
1604 break; 1603 break;
1605 case VICMD('E'): 1604 case 'E'|vbit:
1606 vi_End_motion(command); 1605 vi_End_motion(command);
1607 break; 1606 break;
1608 case VICMD('e'): 1607 case 'e'|vbit:
1609 vi_end_motion(command); 1608 vi_end_motion(command);
1610 break; 1609 break;
1611 case VICMD('B'): 1610 case 'B'|vbit:
1612 vi_Back_motion(command); 1611 vi_Back_motion(command);
1613 break; 1612 break;
1614 case VICMD('b'): 1613 case 'b'|vbit:
1615 vi_back_motion(command); 1614 vi_back_motion(command);
1616 break; 1615 break;
1617 case VICMD('C'): 1616 case 'C'|vbit:
1618 vi_cmdmode = 0; 1617 vi_cmdmode = 0;
1619 /* fall through */ 1618 /* fall through */
1620 case VICMD('D'): 1619 case 'D'|vbit:
1621 goto clear_to_eol; 1620 goto clear_to_eol;
1622 1621
1623 case VICMD('c'): 1622 case 'c'|vbit:
1624 vi_cmdmode = 0; 1623 vi_cmdmode = 0;
1625 /* fall through */ 1624 /* fall through */
1626 case VICMD('d'): 1625 case 'd'|vbit:
1627 { 1626 {
1628 int nc, sc; 1627 int nc, sc;
1629 sc = cursor; 1628 sc = cursor;
@@ -1682,13 +1681,13 @@ prepare_to_die:
1682 } 1681 }
1683 } 1682 }
1684 break; 1683 break;
1685 case VICMD('p'): 1684 case 'p'|vbit:
1686 input_forward(); 1685 input_forward();
1687 /* fallthrough */ 1686 /* fallthrough */
1688 case VICMD('P'): 1687 case 'P'|vbit:
1689 put(); 1688 put();
1690 break; 1689 break;
1691 case VICMD('r'): 1690 case 'r'|vbit:
1692 if (safe_read(0, &c, 1) < 1) 1691 if (safe_read(0, &c, 1) < 1)
1693 goto prepare_to_die; 1692 goto prepare_to_die;
1694 if (c == 0) 1693 if (c == 0)
@@ -1700,7 +1699,9 @@ prepare_to_die:
1700 } 1699 }
1701 break; 1700 break;
1702#endif /* CONFIG_FEATURE_COMMAND_EDITING_VI */ 1701#endif /* CONFIG_FEATURE_COMMAND_EDITING_VI */
1703 case ESC:{ 1702
1703 case ESC:
1704
1704#if CONFIG_FEATURE_COMMAND_EDITING_VI 1705#if CONFIG_FEATURE_COMMAND_EDITING_VI
1705 if (vi_mode) { 1706 if (vi_mode) {
1706 /* ESC: insert mode --> command mode */ 1707 /* ESC: insert mode --> command mode */
@@ -1714,8 +1715,8 @@ prepare_to_die:
1714 goto prepare_to_die; 1715 goto prepare_to_die;
1715 /* different vt100 emulations */ 1716 /* different vt100 emulations */
1716 if (c == '[' || c == 'O') { 1717 if (c == '[' || c == 'O') {
1717 case VICMD('['): 1718 vi_case( case '['|vbit: )
1718 case VICMD('O'): 1719 vi_case( case 'O'|vbit: )
1719 if (safe_read(0, &c, 1) < 1) 1720 if (safe_read(0, &c, 1) < 1)
1720 goto prepare_to_die; 1721 goto prepare_to_die;
1721 } 1722 }
@@ -1787,7 +1788,6 @@ rewrite_line:
1787 beep(); 1788 beep();
1788 } 1789 }
1789 break; 1790 break;
1790 }
1791 1791
1792 default: /* If it's regular input, do the normal thing */ 1792 default: /* If it's regular input, do the normal thing */
1793#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT 1793#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT