+Often there are cases when a simple offset setting on a syntactic symbol
+isn't enough to get the desired indentation. Therefore, it's also
+possible to use a @dfn{indentation function} (a.k.a. line-up function)
+for a syntactic symbol.
+
+@ccmode{} comes with many predefined indentation functions for common
+situations. If none of these does what you want, you can write your
+own, see @ref{Custom Indentation Functions}. If you do, it's probably a
+good idea to start working from one of these predefined functions, they
+can be found in the file @file{cc-align.el}.
+
+For every function below there is a ``works with'' list that indicates
+which syntactic symbols the function is intended to be used with.
+
+@macro workswith
+@emph{Works with:}
+@end macro
+@ifinfo
+@unmacro workswith
+@macro workswith
+Works with:
+@end macro
+@end ifinfo
+
+@table @code
+
+@findex c-lineup-arglist
+@findex lineup-arglist (c-)
+@item c-lineup-arglist
+Line up the current argument line under the first argument.
+
+@workswith @code{arglist-cont-nonempty}.
+
+@findex c-lineup-arglist-intro-after-paren
+@findex lineup-arglist-intro-after-paren (c-)
+@item c-lineup-arglist-intro-after-paren
+Line up a line just after the open paren of the surrounding paren or
+brace block.
+
+@workswith @code{defun-block-intro}, @code{brace-list-intro},
+@code{statement-block-intro}, @code{statement-case-intro},
+@code{arglist-intro}.
+
+@findex c-lineup-arglist-close-under-paren
+@findex lineup-arglist-close-under-paren (c-)
+@item c-lineup-arglist-close-under-paren
+Set e.g. your @code{arglist-close} syntactic symbol to this line-up
+function so that parentheses that close argument lists will line up
+under the parenthesis that opened the argument list.
+
+@workswith @code{defun-close}, @code{class-close}, @code{inline-close},
+@code{block-close}, @code{brace-list-close}, @code{arglist-close},
+@code{extern-lang-close}, @code{namespace-close} (for most of these, a
+zero offset will normally produce the same result, though).
+
+@findex c-lineup-close-paren
+@findex lineup-close-paren (c-)
+@item c-lineup-close-paren
+Line up the closing paren under its corresponding open paren if the
+open paren is followed by code. If the open paren ends its line, no
+indentation is added. E.g:
+@example
+@group
+
+main (int,
+ char **
+ ) // c-lineup-close-paren
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+main (
+ int, char **
+) // c-lineup-close-paren
+
+@end group
+@end example
+
+@workswith @code{defun-close}, @code{class-close}, @code{inline-close},
+@code{block-close}, @code{brace-list-close}, @code{arglist-close},
+@code{extern-lang-close}, @code{namespace-close}.
+
+@findex c-lineup-streamop
+@findex lineup-streamop (c-)
+@item c-lineup-streamop
+Line up C++ stream operators (i.e. @samp{<<} and @samp{>>}).
+
+@workswith @code{stream-op}.
+
+@findex c-lineup-multi-inher
+@findex lineup-multi-inher (c-)
+@item c-lineup-multi-inher
+Line up the classes in C++ multiple inheritance clauses under each
+other.
+
+@workswith @code{inher-cont}.
+
+@findex c-lineup-java-inher
+@findex lineup-java-inher (c-)
+@item c-lineup-java-inher
+Line up Java implements and extends declarations. If class names
+follows on the same line as the @samp{implements}/@samp{extends}
+keyword, they are lined up under each other. Otherwise, they are
+indented by adding @code{c-basic-offset} to the column of the keyword.
+E.g:
+@example
+@group
+
+class Foo
+ extends
+ Bar // c-lineup-java-inher
+
+ <--> c-basic-offset
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+class Foo
+ extends Cyphr,
+ Bar // c-lineup-java-inher
+
+@end group
+@end example
+
+@workswith @code{inher-cont}.
+
+@findex c-lineup-java-throws
+@findex lineup-java-throws (c-)
+@item c-lineup-java-throws
+Line up Java throws declarations. If exception names follows on the
+same line as the throws keyword, they are lined up under each other.
+Otherwise, they are indented by adding @code{c-basic-offset} to the
+column of the @samp{throws} keyword. The @samp{throws} keyword itself
+is also indented by @code{c-basic-offset} from the function declaration
+start if it doesn't hang. E.g:
+@example
+@group
+
+int foo()
+ throws // c-lineup-java-throws
+ Bar // c-lineup-java-throws
+
+<--><--> c-basic-offset
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+int foo() throws Cyphr,
+ Bar, // c-lineup-java-throws
+ Vlod // c-lineup-java-throws
+
+@end group
+@end example
+
+@workswith @code{func-decl-cont}.
+
+@findex c-indent-one-line-block
+@findex indent-one-line-block (c-)
+@item c-indent-one-line-block
+Indent a one line block @code{c-basic-offset} extra. E.g:
+@example
+@group
+
+if (n > 0)
+ @{m+=n; n=0;@} // c-indent-one-line-block
+
+<--> c-basic-offset
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+if (n > 0)
+@{ // c-indent-one-line-block
+ m+=n; n=0;
+@}
+
+@end group
+@end example
+
+The block may be surrounded by any kind of parenthesis characters.
+@code{nil} is returned if the line doesn't start with a one line block,
+which makes the function usable in list expressions.
+
+@workswith Almost all syntactic symbols, but most useful on the
+@code{-open} symbols.
+
+@findex c-indent-multi-line-block
+@findex indent-multi-line-block (c-)
+@item c-indent-multi-line-block
+Indent a multi line block @code{c-basic-offset} extra. E.g:
+@example
+@group
+
+int *foo[] = @{
+ NULL,
+ @{17@}, // c-indent-multi-line-block
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+int *foo[] = @{
+ NULL,
+ @{ // c-indent-multi-line-block
+ 17
+ @},
+
+ <--> c-basic-offset
+
+@end group
+@end example
+
+The block may be surrounded by any kind of parenthesis characters.
+@code{nil} is returned if the line doesn't start with a multi line
+block, which makes the function usable in list expressions.
+
+@workswith Almost all syntactic symbols, but most useful on the
+@code{-open} symbols.
+
+@findex c-lineup-C-comments
+@findex lineup-C-comments (c-)
+@item c-lineup-C-comments
+Line up C block comment continuation lines. Various heuristics are used
+to handle most of the common comment styles. Some examples:
+@example
+
+@group
+/* /** /*
+ * text * text text
+ */ */ */
+@end group
+
+@group
+/* text /* /**
+ text ** text ** text
+*/ */ */
+@end group
+
+@group
+/**************************************************
+ * text
+ *************************************************/
+@end group
+
+@vindex comment-start-skip
+@group
+/**************************************************
+ Free form text comments:
+ In comments with a long delimiter line at the
+ start, the indentation is kept unchanged for lines
+ that start with an empty comment line prefix. The
+ delimiter line is whatever matches the
+ @code{comment-start-skip} regexp.
+**************************************************/
+@end group
+
+@end example
+
+The style variable @code{c-comment-prefix-regexp} is used to recognize
+the comment line prefix, e.g. the @samp{*} that usually starts every
+line inside a comment.
+
+@workswith The @code{c} syntactic symbol.
+
+@findex c-lineup-comment
+@findex lineup-comment (c-)
+@item c-lineup-comment
+Line up a comment-only line according to the style variable
+@code{c-comment-only-line-offset}. If the comment is lined up with a
+comment starter on the previous line, that alignment is preserved.
+
+@vindex c-comment-only-line-offset
+@vindex comment-only-line-offset (c-)
+@code{c-comment-only-line-offset} specifies the extra offset for the
+line. It can contain an integer or a cons cell of the form
+@example
+
+ (@r{<non-anchored-offset>} . @r{<anchored-offset>})
+
+@end example
+
+@noindent
+where @var{non-anchored-offset} is the amount of offset given to
+non-column-zero anchored lines, and @var{anchored-offset} is the amount
+of offset to give column-zero anchored lines. Just an integer as value
+is equivalent to @code{(@r{<value>} . -1000)}.
+
+@workswith @code{comment-intro}.
+
+@findex c-lineup-runin-statements
+@findex lineup-runin-statements (c-)
+@item c-lineup-runin-statements
+Line up statements for coding standards which place the first statement
+in a block on the same line as the block opening brace@footnote{Run-in
+style doesn't really work too well. You might need to write your own
+custom indentation functions to better support this style.}. E.g:
+@example
+@group
+
+int main()
+@{ puts (\"Hello world!\");
+ return 0; // c-lineup-runin-statements
+@}
+
+@end group
+@end example
+
+If there is no statement after the opening brace to align with,
+@code{nil} is returned. This makes the function usable in list
+expressions.
+
+@workswith The @code{statement} syntactic symbol.
+
+@findex c-lineup-math
+@findex lineup-math (c-)
+@item c-lineup-math
+Line up the current line after the equal sign on the first line in the
+statement. If there isn't any, indent with @code{c-basic-offset}. If
+the current line contains an equal sign too, try to align it with the
+first one.
+
+@workswith @code{statement-cont}.
+
+@findex c-lineup-template-args
+@findex lineup-template-args (c-)
+@item c-lineup-template-args
+Line up the arguments of a template argument list under each other, but
+only in the case where the first argument is on the same line as the
+opening @samp{<}.
+
+To allow this function to be used in a list expression, @code{nil} is
+returned if there's no template argument on the first line.
+
+@workswith @code{template-args-cont}.
+
+@findex c-lineup-ObjC-method-call
+@findex lineup-ObjC-method-call (c-)
+@item c-lineup-ObjC-method-call
+For Objective-C code, line up selector args as @code{elisp-mode} does
+with function args: go to the position right after the message receiver,
+and if you are at the end of the line, indent the current line
+c-basic-offset columns from the opening bracket; otherwise you are
+looking at the first character of the first method call argument, so
+lineup the current line with it.
+
+@workswith @code{objc-method-call-cont}.
+
+@findex c-lineup-ObjC-method-args
+@findex lineup-ObjC-method-args (c-)
+@item c-lineup-ObjC-method-args
+For Objective-C code, line up the colons that separate args. The colon
+on the current line is aligned with the one on the first line.
+
+@workswith @code{objc-method-args-cont}.
+
+@findex c-lineup-ObjC-method-args-2
+@findex lineup-ObjC-method-args-2 (c-)
+@item c-lineup-ObjC-method-args-2
+Similar to @code{c-lineup-ObjC-method-args} but lines up the colon on
+the current line with the colon on the previous line.
+
+@workswith @code{objc-method-args-cont}.
+
+@findex c-lineup-inexpr-block
+@findex lineup-inexpr-block (c-)
+@item c-lineup-inexpr-block
+This can be used with the in-expression block symbols to indent the
+whole block to the column where the construct is started. E.g. for Java
+anonymous classes, this lines up the class under the @samp{new} keyword,
+and in Pike it lines up the lambda function body under the @samp{lambda}
+keyword. Returns @code{nil} if the block isn't part of such a
+construct.
+
+@workswith @code{inlambda}, @code{inexpr-statement},
+@code{inexpr-class}.
+
+@findex c-lineup-whitesmith-in-block
+@findex lineup-whitesmith-in-block (c-)
+@item c-lineup-whitesmith-in-block
+Line up lines inside a block in Whitesmith style. It's done in a way
+that works both when the opening brace hangs and when it doesn't. E.g:
+@example
+@group
+
+something
+ @{
+ foo; // c-lineup-whitesmith-in-block
+ @}
+
+@end group
+@end example
+@noindent
+and
+@example
+@group
+
+something @{
+ foo; // c-lineup-whitesmith-in-block
+ @}
+
+<--> c-basic-offset
+
+@end group
+@end example
+
+In the first case the indentation is kept unchanged, in the second
+@code{c-basic-offset} is added.
+
+@workswith @code{defun-close}, @code{defun-block-intro},
+@code{block-close}, @code{brace-list-close}, @code{brace-list-intro},
+@code{statement-block-intro}, @code{inclass}, @code{inextern-lang},
+@code{innamespace}.
+
+@findex c-lineup-dont-change
+@findex lineup-dont-change (c-)
+@item c-lineup-dont-change
+This lineup function returns the indentation of the current line. Think
+of it as an identity function for lineups; it is used for
+@code{cpp-macro-cont} lines.
+
+@workswith Any syntactic symbol.
+
+@end table
+
+
+@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+@node Performance Issues, Frequently Asked Questions, Indentation Functions, Top
+@comment node-name, next, previous, up
+@chapter Performance Issues
+@cindex performance issues