diff -ruNa /root/rcs-5.7/src/rcsbase.h ./rcs-5.7/src/rcsbase.h
--- /root/rcs-5.7/src/rcsbase.h	1995-06-16 02:19:24.000000000 -0400
+++ ./rcs-5.7/src/rcsbase.h	2015-12-28 00:06:08.290116532 -0500
@@ -188,7 +188,6 @@
 
 #include "conf.h"
 
-
 #define EXIT_TROUBLE DIFF_TROUBLE
 
 #ifdef _POSIX_PATH_MAX
@@ -234,6 +233,7 @@
 #define true     1
 #define false    0
 
+#define STACK_INC_SIZE  8589934592  /* 8192 * 1024 * 1024 */
 
 /*
  * RILE - readonly file
@@ -359,10 +359,10 @@
 	char const	  * state;    /* state of revision (Exp by default) */
 	char const	  * name;     /* name (if any) by which retrieved   */
 	struct cbuf	    log;      /* log message requested at checkin   */
-        struct branchhead * branches; /* list of first revisions on branches*/
+    struct branchhead * branches; /* list of first revisions on branches*/
 	struct cbuf	    ig;	      /* ignored phrases in admin part	    */
 	struct cbuf	    igtext;   /* ignored phrases in deltatext part  */
-        struct hshentry   * next;     /* next revision on same branch       */
+    struct hshentry   * next;     /* next revision on same branch       */
 	struct hshentry   * nexthsh;  /* next revision with same hash value */
 	long		    insertlns;/* lines inserted (computed by rlog)  */
 	long		    deletelns;/* lines deleted  (computed by rlog)  */
@@ -371,8 +371,8 @@
 
 /* list of hash entries */
 struct hshentries {
-	struct hshentries *rest;
-	struct hshentry *first;
+	struct hshentries * rest;
+	struct hshentry   * first;
 };
 
 /* list element for branch lists */
@@ -383,14 +383,14 @@
 
 /* accesslist element */
 struct access {
-	char const	  * login;
-        struct access     * nextaccess;
+	char const	      * login;
+    struct access     * nextaccess;
 };
 
 /* list element for locks  */
 struct rcslock {
-	char const	  * login;
-        struct hshentry   * delta;
+	char const	      * login;
+    struct hshentry   * delta;
 	struct rcslock    * nextlock;
 };
 
@@ -401,6 +401,13 @@
         struct assoc      * nextassoc;
 };
 
+/* point stack */
+struct stack
+{
+  void    **base;
+  void    **top;
+  size_t  stacksize;
+};
 
 #define mainArgs (argc,argv) int argc; char **argv;
 
@@ -422,7 +429,7 @@
 #define IDH             "Id"
 #define LOCKER          "Locker"
 #define LOG             "Log"
-#define NAME		"Name"
+#define NAME		    "Name"
 #define RCSFILE         "RCSfile"
 #define REVISION        "Revision"
 #define SOURCE          "Source"
diff -ruNa /root/rcs-5.7/src/rcsgen.c ./rcs-5.7/src/rcsgen.c
--- /root/rcs-5.7/src/rcsgen.c	1995-06-16 02:19:24.000000000 -0400
+++ ./rcs-5.7/src/rcsgen.c	2015-12-28 00:06:06.512116495 -0500
@@ -136,9 +136,6 @@
  * corrected type of variables assigned to by getc (char --> int)
  */
 
-
-
-
 #include "rcsbase.h"
 
 libId(genId, "$Id: rcsgen.c,v 5.16 1995/06/16 06:19:24 eggert Exp $")
@@ -526,7 +523,7 @@
 	static void
 putdelta(node, fout)
 	register struct hshentry const *node;
-	register FILE * fout;
+	register FILE *fout;
 /* Output the delta NODE to FOUT.  */
 {
 	struct branchhead const *nextbranch;
@@ -549,6 +546,98 @@
 	awrite(node->ig.string, node->ig.size, fout);
 }
 
+	static void
+init(pstack)
+	register struct stack *pstack;
+/* Init stack.  */
+{
+    pstack->stacksize = (size_t)(STACK_INC_SIZE);
+    if ((pstack->base = malloc(pstack->stacksize)) == NULL)
+    {
+      error("Stack init error!");
+      exit(-1);
+    }
+    pstack->top  = pstack->base;
+}
+
+	static void
+destroy(pstack)
+	register struct stack *pstack;
+/* Destroy stack.  */
+{
+    if (pstack->base)
+      free(pstack->base);
+    pstack->base      = NULL;
+    pstack->top       = NULL;
+    pstack->stacksize = 0;
+}
+
+	static int
+push(pstack, element)
+	register struct stack *pstack;
+	register void         **element;
+/* Push element to top of stack.  */
+{
+  void **temp = NULL;
+  
+  if (pstack->top - pstack->base >= pstack->stacksize) {
+    temp = realloc(pstack->base, 
+                   pstack->stacksize + (size_t)(STACK_INC_SIZE));
+    if (!temp) {
+      error("Stack in heap cannot extend!");
+      return false;
+    }
+
+    if (temp != pstack->base) {
+      pstack->top  = temp + (pstack->top - pstack->base);
+      pstack->base = temp;
+    }
+    
+    pstack->stacksize += (size_t)(STACK_INC_SIZE);
+  }
+
+  *(pstack->top) = *element;
+  pstack->top++;
+
+  return true; 
+}
+
+	static int
+pop(pstack, element)
+	register struct stack *pstack;
+	register void         **element;
+/* Pop top element from stack.  */
+{
+  if (pstack->top == pstack->base) {
+    error("Stack is empty!");
+    return false;
+  }
+  
+  pstack->top--;
+  *element = *(pstack->top);
+  
+  return true;  
+}
+
+	static void*
+top(pstack)
+	register struct stack *pstack;
+/* Get top element from stack.  */
+{
+   if (pstack->top > pstack->base) {
+     return *(pstack->top - 1);
+   }
+   else
+     return NULL;
+}
+
+	static int
+is_empty(pstack)
+	register struct stack *pstack;
+/* To judge whether the stack is empty.  */
+{
+    return (pstack->top == pstack->base);
+}
 
 	void
 puttree(root, fout)
@@ -556,20 +645,49 @@
 	register FILE *fout;
 /* Output the delta tree with base ROOT in preorder to FOUT.  */
 {
-	struct branchhead const *nextbranch;
-
-	if (!root) return;
-
-	if (root->selector)
-		putdelta(root, fout);
-
-	puttree(root->next, fout);
+  struct hshentry         *node  = NULL;
+  struct branchhead const *nextbranch;
+  struct stack            pstack = { 0 };
+
+  if (!root)
+    return;
+
+  init(&pstack);
+    
+  if (!push(&pstack, &root)) {
+    exit(-1);
+  }
+  
+  while (!is_empty(&pstack)) {
+    if (!pop(&pstack, &node)) {
+      exit(-1);
+    }
+
+    if (node) {
+      if (node->selector)
+        putdelta(node, fout);
+
+      if (node->branches) {
+        for (nextbranch = node->branches; 
+             nextbranch; 
+             nextbranch = nextbranch->nextbranch)
+          if (!push(&pstack, &(nextbranch->hsh))) {
+            exit(-1);
+          }
+      }
+      
+      if (node->next) {
+        if (!push(&pstack, &(node->next))) {
+          exit(-1);
+        }
+      }
+    }
+    else {
+      error("Node is empty!");
+    }
+  }
 
-	nextbranch = root->branches;
-	while (nextbranch) {
-	     puttree(nextbranch->hsh, fout);
-	     nextbranch = nextbranch->nextbranch;
-	}
+  destroy(&pstack);
 }
 
 
