1/*
2 * Copyright (C) 1984-2007 Mark Nudelman
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Less License, as specified in the README file.
6 *
7 * For more information about less, or for information on how to
8 * contact the author, see the README file.
--- 553 unchanged lines hidden (view full) ---
562 public LWCHAR
563get_wchar(p)
564 char *p;
565{
566 switch (utf_len(p[0]))
567 {
568 case 1:
569 default:
570 /* 0xxxxxxx */
571 return (LWCHAR)
572 (p[0] & 0xFF);
573 case 2:
574 /* 110xxxxx 10xxxxxx */
575 return (LWCHAR) (
576 ((p[0] & 0x1F) << 6) |
577 (p[1] & 0x3F));
578 case 3:
579 /* 1110xxxx 10xxxxxx 10xxxxxx */
580 return (LWCHAR) (
581 ((p[0] & 0x0F) << 12) |
582 ((p[1] & 0x3F) << 6) |
583 (p[2] & 0x3F));
584 case 4:
585 /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
586 return (LWCHAR) (
587 ((p[0] & 0x07) << 18) |
588 ((p[1] & 0x3F) << 12) |
589 ((p[2] & 0x3F) << 6) |
590 (p[3] & 0x3F));
591 case 5:
592 /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
593 return (LWCHAR) (
594 ((p[0] & 0x03) << 24) |
595 ((p[1] & 0x3F) << 18) |
596 ((p[2] & 0x3F) << 12) |
597 ((p[3] & 0x3F) << 6) |
598 (p[4] & 0x3F));
599 case 6:
600 /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
601 return (LWCHAR) (
602 ((p[0] & 0x01) << 30) |
603 ((p[1] & 0x3F) << 24) |
604 ((p[2] & 0x3F) << 18) |
605 ((p[3] & 0x3F) << 12) |
606 ((p[4] & 0x3F) << 6) |
607 (p[5] & 0x3F));
608 }
609}
610
611/*
612 * Store a character into a UTF-8 string.
613 */
614 public void
615put_wchar(pp, ch)
616 char **pp;
617 LWCHAR ch;
618{
619 if (!utf_mode || ch < 0x80)
620 {
621 /* 0xxxxxxx */
622 *(*pp)++ = (char) ch;
623 } else if (ch < 0x800)
624 {
625 /* 110xxxxx 10xxxxxx */
626 *(*pp)++ = (char) (0xC0 | ((ch >> 6) & 0x1F));
627 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
628 } else if (ch < 0x10000)
629 {
630 /* 1110xxxx 10xxxxxx 10xxxxxx */
631 *(*pp)++ = (char) (0xE0 | ((ch >> 12) & 0x0F));
632 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
633 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
634 } else if (ch < 0x200000)
635 {
636 /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
637 *(*pp)++ = (char) (0xF0 | ((ch >> 18) & 0x07));
638 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
639 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
640 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
641 } else if (ch < 0x4000000)
642 {
643 /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
644 *(*pp)++ = (char) (0xF0 | ((ch >> 24) & 0x03));
645 *(*pp)++ = (char) (0x80 | ((ch >> 18) & 0x3F));
646 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
647 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
648 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
649 } else
650 {
651 /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
652 *(*pp)++ = (char) (0xF0 | ((ch >> 30) & 0x01));
653 *(*pp)++ = (char) (0x80 | ((ch >> 24) & 0x3F));
654 *(*pp)++ = (char) (0x80 | ((ch >> 18) & 0x3F));
655 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
656 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
657 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
658 }
659}
660
661/*
662 * Step forward or backward one character in a string.
663 */
664 public LWCHAR
665step_char(pp, dir, limit)
666 char **pp;
667 signed int dir;
668 char *limit;
669{
--- 496 unchanged lines hidden ---
2 * Copyright (C) 1984-2007 Mark Nudelman
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Less License, as specified in the README file.
6 *
7 * For more information about less, or for information on how to
8 * contact the author, see the README file.
--- 553 unchanged lines hidden (view full) ---
562 public LWCHAR
563get_wchar(p)
564 char *p;
565{
566 switch (utf_len(p[0]))
567 {
568 case 1:
569 default:
570 /* 0xxxxxxx */
571 return (LWCHAR)
572 (p[0] & 0xFF);
573 case 2:
574 /* 110xxxxx 10xxxxxx */
575 return (LWCHAR) (
576 ((p[0] & 0x1F) << 6) |
577 (p[1] & 0x3F));
578 case 3:
579 /* 1110xxxx 10xxxxxx 10xxxxxx */
580 return (LWCHAR) (
581 ((p[0] & 0x0F) << 12) |
582 ((p[1] & 0x3F) << 6) |
583 (p[2] & 0x3F));
584 case 4:
585 /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
586 return (LWCHAR) (
587 ((p[0] & 0x07) << 18) |
588 ((p[1] & 0x3F) << 12) |
589 ((p[2] & 0x3F) << 6) |
590 (p[3] & 0x3F));
591 case 5:
592 /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
593 return (LWCHAR) (
594 ((p[0] & 0x03) << 24) |
595 ((p[1] & 0x3F) << 18) |
596 ((p[2] & 0x3F) << 12) |
597 ((p[3] & 0x3F) << 6) |
598 (p[4] & 0x3F));
599 case 6:
600 /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
601 return (LWCHAR) (
602 ((p[0] & 0x01) << 30) |
603 ((p[1] & 0x3F) << 24) |
604 ((p[2] & 0x3F) << 18) |
605 ((p[3] & 0x3F) << 12) |
606 ((p[4] & 0x3F) << 6) |
607 (p[5] & 0x3F));
608 }
609}
610
611/*
612 * Store a character into a UTF-8 string.
613 */
614 public void
615put_wchar(pp, ch)
616 char **pp;
617 LWCHAR ch;
618{
619 if (!utf_mode || ch < 0x80)
620 {
621 /* 0xxxxxxx */
622 *(*pp)++ = (char) ch;
623 } else if (ch < 0x800)
624 {
625 /* 110xxxxx 10xxxxxx */
626 *(*pp)++ = (char) (0xC0 | ((ch >> 6) & 0x1F));
627 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
628 } else if (ch < 0x10000)
629 {
630 /* 1110xxxx 10xxxxxx 10xxxxxx */
631 *(*pp)++ = (char) (0xE0 | ((ch >> 12) & 0x0F));
632 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
633 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
634 } else if (ch < 0x200000)
635 {
636 /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
637 *(*pp)++ = (char) (0xF0 | ((ch >> 18) & 0x07));
638 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
639 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
640 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
641 } else if (ch < 0x4000000)
642 {
643 /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
644 *(*pp)++ = (char) (0xF0 | ((ch >> 24) & 0x03));
645 *(*pp)++ = (char) (0x80 | ((ch >> 18) & 0x3F));
646 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
647 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
648 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
649 } else
650 {
651 /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
652 *(*pp)++ = (char) (0xF0 | ((ch >> 30) & 0x01));
653 *(*pp)++ = (char) (0x80 | ((ch >> 24) & 0x3F));
654 *(*pp)++ = (char) (0x80 | ((ch >> 18) & 0x3F));
655 *(*pp)++ = (char) (0x80 | ((ch >> 12) & 0x3F));
656 *(*pp)++ = (char) (0x80 | ((ch >> 6) & 0x3F));
657 *(*pp)++ = (char) (0x80 | (ch & 0x3F));
658 }
659}
660
661/*
662 * Step forward or backward one character in a string.
663 */
664 public LWCHAR
665step_char(pp, dir, limit)
666 char **pp;
667 signed int dir;
668 char *limit;
669{
--- 496 unchanged lines hidden ---