~ubuntu-branches/ubuntu/karmic/emacs-snapshot/karmic

« back to all changes in this revision

Viewing changes to src/keymap.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-04-05 09:14:30 UTC
  • mto: This revision was merged to the branch mainline in revision 34.
  • Revision ID: james.westby@ubuntu.com-20090405091430-nw07lynn2arotjbe
Tags: upstream-20090320
ImportĀ upstreamĀ versionĀ 20090320

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* Manipulation of keymaps
2
2
   Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995,
3
3
                 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4
 
                 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
4
                 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5
5
 
6
6
This file is part of GNU Emacs.
7
7
 
327
327
}
328
328
 
329
329
DEFUN ("keymap-parent", Fkeymap_parent, Skeymap_parent, 1, 1, 0,
330
 
       doc: /* Return the parent keymap of KEYMAP.  */)
 
330
       doc: /* Return the parent keymap of KEYMAP.
 
331
If KEYMAP has no parent, return nil.  */)
331
332
     (keymap)
332
333
     Lisp_Object keymap;
333
334
{
650
651
    {
651
652
      map_keymap_function_t fun = XSAVE_VALUE (XCAR (args))->pointer;
652
653
      args = XCDR (args);
 
654
      /* If the key is a range, make a copy since map_char_table modifies
 
655
         it in place.  */
 
656
      if (CONSP (key))
 
657
        key = Fcons (XCAR (key), XCDR (key));
653
658
      map_keymap_item (fun, XCDR (args), key, val,
654
659
                       XSAVE_VALUE (XCAR (args))->pointer);
655
660
    }
3695
3700
  int first = 1;
3696
3701
  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3697
3702
  /* Range of elements to be handled.  */
3698
 
  int from, to;
 
3703
  int from, to, stop;
3699
3704
  Lisp_Object character;
3700
3705
  int starting_i;
3701
3706
 
3725
3730
    suppress = intern ("suppress-keymap");
3726
3731
 
3727
3732
  from = 0;
3728
 
  to = CHAR_TABLE_P (vector) ? MAX_CHAR + 1 : XVECTOR (vector)->size;
 
3733
  if (CHAR_TABLE_P (vector))
 
3734
    stop = MAX_5_BYTE_CHAR + 1, to = MAX_CHAR + 1;
 
3735
  else
 
3736
    stop = to = XVECTOR (vector)->size;
3729
3737
 
3730
 
  for (i = from; i < to; i++)
 
3738
  for (i = from; ; i++)
3731
3739
    {
3732
3740
      int this_shadowed = 0;
3733
3741
      int range_beg, range_end;
3735
3743
 
3736
3744
      QUIT;
3737
3745
 
 
3746
      if (i == stop)
 
3747
        {
 
3748
          if (i == to)
 
3749
            break;
 
3750
          stop = to;
 
3751
        }
 
3752
 
3738
3753
      starting_i = i;
3739
3754
 
3740
3755
      if (CHAR_TABLE_P (vector))
3741
 
        val = char_table_ref_and_range (vector, i, &range_beg, &i);
 
3756
        {
 
3757
          range_beg = i;
 
3758
          i = stop - 1;
 
3759
          val = char_table_ref_and_range (vector, range_beg, &range_beg, &i);
 
3760
        }
3742
3761
      else
3743
3762
        val = AREF (vector, i);
3744
3763
      definition = get_keyelt (val, 0);
3799
3818
      insert1 (Fkey_description (kludge, prefix));
3800
3819
 
3801
3820
      /* Find all consecutive characters or rows that have the same
3802
 
         definition.  But, for elements of a top level char table, if
3803
 
         they are for charsets, we had better describe one by one even
3804
 
         if they have the same definition.  */
 
3821
         definition.  But, VECTOR is a char-table, we had better put a
 
3822
         boundary between normal characters (-#x3FFF7F) and 8-bit
 
3823
         characters (#x3FFF80-).  */
3805
3824
      if (CHAR_TABLE_P (vector))
3806
 
        while (i + 1 < to
3807
 
               && (val = char_table_ref_and_range (vector, i + 1,
 
3825
        {
 
3826
          while (i + 1 < stop
 
3827
                 && (range_beg = i + 1, range_end = stop - 1,
 
3828
                   val = char_table_ref_and_range (vector, range_beg,
3808
3829
                                                   &range_beg, &range_end),
3809
3830
                   tem2 = get_keyelt (val, 0),
3810
3831
                   !NILP (tem2))
3811
 
               && !NILP (Fequal (tem2, definition)))
3812
 
          i = range_end;
 
3832
                 && !NILP (Fequal (tem2, definition)))
 
3833
            i = range_end;
 
3834
        }
3813
3835
      else
3814
 
        while (i + 1 < to
 
3836
        while (i + 1 < stop
3815
3837
               && (tem2 = get_keyelt (AREF (vector, i + 1), 0),
3816
3838
                   !NILP (tem2))
3817
3839
               && !NILP (Fequal (tem2, definition)))