Initial revision
[silc.git] / util / robodoc / Source / folds.c
diff --git a/util/robodoc/Source/folds.c b/util/robodoc/Source/folds.c
new file mode 100644 (file)
index 0000000..4138b70
--- /dev/null
@@ -0,0 +1,141 @@
+#include <stddef.h>
+#include <string.h>
+#include "robodoc.h"
+#include "folds.h"
+
+
+/****v* ROBODoc/fold_start_markers 
+ * NAME
+ *   fold_start_markers
+ * FUNCTION
+ *   Strings for fold start.
+ * SOURCE
+ */
+fold_mark_t     fold_start_markers[] =
+{
+  {"/*{{{", "*/"},     /* C, C++ */
+  {"--{{{", "\n"},     /* Occam, line ends with newline */
+  {"#{{{", "\n"},      /* Various scripts, line ends with newline */
+  {NULL, NULL}
+};
+
+/****/
+
+
+/****v* ROBODoc/fold_end_markers 
+ * NAME
+ *   fold_start_end
+ * FUNCTION
+ *   Strings for fold end.
+ * SOURCE
+ */
+fold_mark_t fold_end_markers[] =
+{
+  {"/*}}}", "*/"},
+  {"--}}}", "\n"},
+  {"#}}}", "\n"},
+  {NULL, NULL}
+};
+
+/****/
+
+int extra_flags = 0;
+
+/****v* ROBODoc/fold 
+* NAME
+*   fold
+* FUNCTION
+*   Fold counter - true global. 
+* SOURCE
+*/
+
+int fold = 0;
+
+/****/
+
+
+
+/****f* ROBODoc/RB_Check_Fold_End [3.0h]
+* NAME
+*  RB_Check_Fold_End
+* AUTHOR
+*  PetteriK
+* FUNCTION
+*  See if a fold end is found.
+* RETURN VALUE
+*   1 if end mark is found
+* SOURCE
+*/
+
+char
+RB_Check_Fold_End (char *cur_char)
+{
+  fold_mark_t *t = fold_end_markers;
+  char found = 0;
+
+  while (found == 0 && t->start != NULL)
+    {
+      if (strncmp (t->start, cur_char, strlen (t->start)) == 0)
+       {
+         found = 1;
+         break;
+       }
+      t++;                     /* try the next fold mark string */
+    }
+  return found;
+}
+
+/*******/
+
+/****f* ROBODoc/RB_Check_Fold_Start 
+ * NAME
+ *   RB_Check_Fold_Start
+ * AUTHOR
+ *   PetteriK
+ * FUNCTION
+ *   Check if a fold start is found.
+ * RETURN VALUE
+ *   Pointer to the item body, fold mark and name skipped.
+ * SIDE EFFECTS
+ *   *found = 1 if fold mark is found. Fold name is copied to *foldname.
+ *******
+ */
+
+char *
+RB_Check_Fold_Start (char *cur_char, char *foldname, char *found)
+{
+  int n = 0;
+  fold_mark_t *t = fold_start_markers;
+
+  *found = 0;
+  while (*found == 0 && t->start != NULL)
+    {
+      if (strncmp (t->start, cur_char, strlen (t->start)) == 0)
+       {
+         *found = 1;
+         break;
+       }
+      t++;                     /* try the next fold mark string */
+    }
+  if (*found == 0)
+    {
+      return cur_char;         /* not found, get out of here */
+    }
+  cur_char += strlen (t->start);       /* skip fold mark */
+  /* get the fold name */
+  while (strncmp (t->end, cur_char, strlen (t->end)) != 0)
+    {
+      foldname[n++] = *cur_char++;
+    }
+  /* if fold mark does not end with newline, skip chars... */
+  if (t->end[0] != '\n')
+    {
+      cur_char += strlen (t->end);
+    }
+  foldname[n] = '\0';
+  while (*cur_char != '\n')
+    {
+      cur_char++;              /* not so sure about this */
+    }
+  return cur_char;
+}