unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: On the behavior of `c-beginning-of-defun'
@ 2007-01-21  1:19 Herbert Euler
  2007-01-21  1:22 ` Herbert Euler
  2007-01-21 19:33 ` Alan Mackenzie
  0 siblings, 2 replies; 10+ messages in thread
From: Herbert Euler @ 2007-01-21  1:19 UTC (permalink / raw)
  Cc: bug-cc-mode, rms, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1745 bytes --]

>Please try out the amended version and let me know if anything's not
>right.

I did not test all cases but only the case that function
`c-beginning-of-defun' fails.  I think it is almost Ok.  However,
please try the following case, it might be a bug.

Suppose `-!-' indicates the position of point.  If point is, for
example, in the body of function `main1':

    /* 1. K&R C.  */

    /* This will not get correct result until the bug in CC mode is fixed.
       See
       http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01341.html  
*/
    int
    main1 (argc, argv)
         int argc;
         char *argv[];
    {
      -!-/* ...  */
    }

Then `c-beginning-of-defun' moves point to before ``int'':

    /* 1. K&R C.  */

    /* This will not get correct result until the bug in CC mode is fixed.
       See
       http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01341.html  
*/
    -!-int
    main1 (argc, argv)
         int argc;
         char *argv[];
    {
      /* ...  */
    }

Which is a desired behavior.  But if point is just after ``[]'':

    /* 1. K&R C.  */

    /* This will not get correct result until the bug in CC mode is fixed.
       See
       http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01341.html  
*/
    int
    main1 (argc, argv)
         int argc;
         char *argv[]-!-;
    {
      /* ...  */
    }

`c-beginning-of-defun' moves point to the start of the file, rather
than the desired position.

This is the only problem I can see until now.  Thank you very much.

Regards,
Guanpeng Xu

_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar - get it now! 
http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/

[-- Attachment #2: x.c --]
[-- Type: application/octet-stream, Size: 4754 bytes --]


/* 1. K&R C.  */

/* This will not get correct result until the bug in CC mode is fixed.
   See
   http://lists.gnu.org/archive/html/emacs-devel/2006-12/msg01341.html  */
int
main1 (argc, argv)
     int argc;
     char *argv[];
{
  /* ...  */
}

int
f1 (arg)
     Lisp_Object arg;
{
}

int
f2 (arg)
     Lisp_Object arg;
     /* The `arg' is a Lisp_Object.  */
{
}

DEFUN ("catch", Fcatch1, Scatch, 1, UNEVALLED, 0,
       doc: /* Eval BODY allowing nonlocal exits using `throw'.
TAG is evalled to get the tag to use; it must not be nil.

Then the BODY is executed.
Within BODY, a call to `throw' with the same TAG exits BODY and this `catch'.
If no throw happens, `catch' returns the value of the last BODY form.
If a throw happens, it specifies the value to return from `catch'.
usage: (catch TAG BODY...)  */)
     (args)
     Lisp_Object args;
{
  register Lisp_Object tag;
  struct gcpro gcpro1;

  GCPRO1 (args);
  tag = Feval (Fcar (args));
  UNGCPRO;
  return internal_catch (tag, Fprogn, Fcdr (args));
}

/* Now, some badly formatted code.  */

   int
 main2 (argc, argv)
      int argc;
      char *argv[];
   {
                 /* ...  */
 }

                        int
                                          f3
         (arg)
                  Lisp_Object

           arg


;
     {
}

int                            f4
                (arg)
               Lisp_Object arg;
     /* The `arg' is a Lisp_Object.  */
  {
          }

                      DEFUN ("catch", Fcatch2, Scatch, 1, UNEVALLED, 0,
         doc: /* Eval BODY allowing nonlocal exits using `throw'.
       TAG is evalled to get the tag to use; it must not be nil.

Then the BODY is executed.
Within BODY, a call to `throw' with the same TAG exits BODY and this `catch'.
If no throw happens, `catch' returns the value of the last BODY form.
If a throw happens, it specifies the value to return from `catch'.
usage: (catch TAG BODY...)  */)
     (args)
     Lisp_Object args;
{
  register Lisp_Object tag;
  struct gcpro gcpro1;

  GCPRO1 (args);
                               tag = Feval (Fcar (args));
  UNGCPRO;
           return internal_catch (tag, Fprogn, Fcdr (args));
     }

/* 2. ANSI/ISO C.  */

int
main3 (int argc, char *argv[])
{
}

int
f5 (Lisp_Object arg)
{
}

int
f6 (Lisp_Object arg)
/* The `arg' is a Lisp_Object.  */
{
}

DEFUN ("catch", Fcatch3, Scatch, 1, UNEVALLED, 0,
       doc: /* Eval BODY allowing nonlocal exits using `throw'.
TAG is evalled to get the tag to use; it must not be nil.

Then the BODY is executed.
Within BODY, a call to `throw' with the same TAG exits BODY and this `catch'.
If no throw happens, `catch' returns the value of the last BODY form.
If a throw happens, it specifies the value to return from `catch'.
usage: (catch TAG BODY...)  */)
     (Lisp_Object args)
{
  register Lisp_Object tag;
  struct gcpro gcpro1;

  GCPRO1 (args);
  tag = Feval (Fcar (args));
  UNGCPRO;
  return internal_catch (tag, Fprogn, Fcdr (args));
}

/* Now, some badly formatted code.  */

        int

             main4

 (int
argc,
char *
argv[])
   {
       }

                  int
f7
 (
Lisp_Object
                            arg)
         {
                       }

                        int

        f8

(Lisp_Object
arg)
/* The `arg' is a Lisp_Object.  */
{
}

                        DEFUN ("catch", Fcatch4, Scatch, 1, UNEVALLED, 0,
       doc: /* Eval BODY allowing nonlocal exits using `throw'.
TAG is evalled to get the tag to use; it must not be nil.

Then the BODY is executed.
Within BODY, a call to `throw' with the same TAG exits BODY and this `catch'.
If no throw happens, `catch' returns the value of the last BODY form.
If a throw happens, it specifies the value to return from `catch'.
usage: (catch TAG BODY...)  */)
     (Lisp_Object args)
{
  register Lisp_Object tag;
  struct gcpro gcpro1;

  GCPRO1 (args);
  tag = Feval (Fcar (args));
  UNGCPRO;
  return internal_catch (tag, Fprogn, Fcdr (args));
}

/* 3. C++ functions.  */

int
a_b::c_d::e_f1 ()
{
}

int
a_b
::
c_d::e_f2 ()
{
}

int
  a_b
    ::
      c_d
        ::
          e_f3
            ()
{
}

/* 4. struct, enum, class, union; private, protected, public.  */

/* The cases of `struct' can represent all `struct', `enum', `class',
   and `union'.  */

struct struct1
{
};

struct
struct2
{
};

   struct struct3
{
};

   struct
struct4
{
};

class a_b1 : public c_d
{
};

class a_b2
: public c_d
{
};

class a_b3:
public c_d
{
};

class a_b4
:
public c_d
{
};

    class
a_b5 : public c_d
{
};

 class a_b6
    : public
                   c_d
{
};

 class
 a_b7           :
      public c_d
{
};

   class
a_b8
 :
          public
c_d
{
};

class a_b::c_d1 : public e_f, public g_h 
{
};

class a_b
::
c_d2 
: public
 e_f
,
 public
 g_h 
{
};

[-- Attachment #3: Type: text/plain, Size: 347 bytes --]

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

^ permalink raw reply	[flat|nested] 10+ messages in thread
[parent not found: <200612301209.55371.xugp@alibaba-inc.com>]

end of thread, other threads:[~2007-01-22  2:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-21  1:19 On the behavior of `c-beginning-of-defun' Herbert Euler
2007-01-21  1:22 ` Herbert Euler
2007-01-21 19:33 ` Alan Mackenzie
2007-01-22  2:06   ` Herbert Euler
     [not found] <200612301209.55371.xugp@alibaba-inc.com>
2006-12-30 20:15 ` Alan Mackenzie
2006-12-31  9:40   ` Herbert Euler
2006-12-31 22:13     ` Richard Stallman
2007-01-01 22:30     ` Alan Mackenzie
2007-01-02  1:19       ` Herbert Euler
2007-01-20 19:37 ` Alan Mackenzie

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).