diff anagram/support/agcstack.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/support/agcstack.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,73 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1997-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * agcstk.cpp - character stack
+ */
+
+#include "agcstack.h"
+#include "assert.h"
+
+//#define INCLUDE_LOGGING
+#include "log.h"
+
+
+AgString AgCharStack::popString(unsigned n) {
+  LOGSECTION("AgCharStack::popString(unsigned)");
+  assert(n <= size());
+  LOGV(size());
+  LOGV(n);
+  AgString result(n);
+  char *p = result.pointer();
+  while (n--) {
+    p[n] = pop();
+  }
+  return result;
+}
+
+AgString AgCharStack::popString() {
+  LOGSECTION("AgCharStack::popString");
+  unsigned n = size();
+  LOGV(size());
+  LOGV(n);
+  AgString result(n);
+  char *p = result.pointer();
+  while (n--) {
+    p[n] = pop();
+  }
+  return result;
+}
+
+AgCharStack &AgCharStack::push(const char *s) {
+  while (*s) {
+    push(*s++);
+  }
+  return *this;
+}
+
+AgCharStack &AgCharStack::push(const char *s, unsigned n) {
+  for (unsigned i = 0; i < n; i++) {
+    push(s[i]);
+  }
+  return *this;
+}
+
+
+AgCharStack &AgCharStack::operator << (AgString s) {
+  int n = s.size();
+  char *p = s.pointer();
+  while (n--) {
+    (*this) << *p++;
+  }
+  return *this;
+}
+
+AgCharStack &AgCharStack::operator << (const char *s) {
+  if (s) {
+    while (*s) {
+      push(*s++);
+    }
+  }
+  return *this;
+}