/* fold.c */
extern void copyFoldingState __ARGS((win_T *wp_from, win_T *wp_to));
extern int hasAnyFolding __ARGS((win_T *win));
extern int hasFolding __ARGS((linenr_T lnum, linenr_T *firstp, linenr_T *lastp));
extern int hasFoldingWin __ARGS((win_T *win, linenr_T lnum, linenr_T *firstp, linenr_T *lastp, int cache, foldinfo_T *infop));
extern int foldLevel __ARGS((linenr_T lnum));
extern int lineFolded __ARGS((win_T *win, linenr_T lnum));
extern long foldedCount __ARGS((win_T *win, linenr_T lnum, foldinfo_T *infop));
extern int foldmethodIsManual __ARGS((win_T *wp));
extern int foldmethodIsIndent __ARGS((win_T *wp));
extern int foldmethodIsExpr __ARGS((win_T *wp));
extern int foldmethodIsMarker __ARGS((win_T *wp));
extern int foldmethodIsSyntax __ARGS((win_T *wp));
extern int foldmethodIsDiff __ARGS((win_T *wp));
extern void closeFold __ARGS((linenr_T lnum, long count));
extern void closeFoldRecurse __ARGS((linenr_T lnum));
extern void opFoldRange __ARGS((linenr_T first, linenr_T last, int opening, int recurse, int had_visual));
extern void openFold __ARGS((linenr_T lnum, long count));
extern void openFoldRecurse __ARGS((linenr_T lnum));
extern void foldOpenCursor __ARGS((void));
extern void newFoldLevel __ARGS((void));
extern void foldCheckClose __ARGS((void));
extern int foldManualAllowed __ARGS((int create));
extern void foldCreate __ARGS((linenr_T start, linenr_T end));
extern void deleteFold __ARGS((linenr_T start, linenr_T end, int recursive, int had_visual));
extern void clearFolding __ARGS((win_T *win));
extern void foldUpdate __ARGS((win_T *wp, linenr_T top, linenr_T bot));
extern void foldUpdateAll __ARGS((win_T *win));
extern int foldMoveTo __ARGS((int updown, int dir, long count));
extern void foldInitWin __ARGS((win_T *newwin));
extern int find_wl_entry __ARGS((win_T *win, linenr_T lnum));
extern void foldAdjustVisual __ARGS((void));
extern void foldAdjustCursor __ARGS((void));
extern void cloneFoldGrowArray __ARGS((garray_T *from, garray_T *to));
extern void deleteFoldRecurse __ARGS((garray_T *gap));
extern void foldMarkAdjust __ARGS((win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after));
extern int getDeepestNesting __ARGS((void));
extern char_u *get_foldtext __ARGS((win_T *wp, linenr_T lnum, linenr_T lnume, foldinfo_T *foldinfo, char_u *buf));
extern void foldtext_cleanup __ARGS((char_u *str));
extern int put_folds __ARGS((FILE *fd, win_T *wp));
/* vim: set ft=c : */
