]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gmp/cxx/isfuns.cc
Imported gcc-4.4.3
[msp430-gcc.git] / gmp / cxx / isfuns.cc
diff --git a/gmp/cxx/isfuns.cc b/gmp/cxx/isfuns.cc
new file mode 100644 (file)
index 0000000..e3ea5ae
--- /dev/null
@@ -0,0 +1,105 @@
+/* Auxiliary functions for C++-style input of GMP types.
+
+Copyright 2001 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
+
+#include <cctype>
+#include <iostream>
+#include <string>
+#include "gmp.h"
+#include "gmp-impl.h"
+
+using namespace std;
+
+
+int
+__gmp_istream_set_base (istream &i, char &c, bool &zero, bool &showbase)
+{
+  int base;
+
+  zero = showbase = false;
+  switch (i.flags() & ios::basefield)
+    {
+    case ios::dec:
+      base = 10;
+      break;
+    case ios::hex:
+      base = 16;
+      break;
+    case ios::oct:
+      base = 8;
+      break;
+    default:
+      showbase = true; // look for initial "0" or "0x" or "0X"
+      if (c == '0')
+       {
+         if (! i.get(c))
+           c = 0; // reset or we might loop indefinitely
+
+         if (c == 'x' || c == 'X')
+           {
+             base = 16;
+             i.get(c);
+           }
+         else
+           {
+             base = 8;
+             zero = true; // if no other digit is read, the "0" counts
+           }
+       }
+      else
+       base = 10;
+      break;
+    }
+
+  return base;
+}
+
+void
+__gmp_istream_set_digits (string &s, istream &i, char &c, bool &ok, int base)
+{
+  switch (base)
+    {
+    case 10:
+      while (isdigit(c))
+       {
+         ok = true; // at least a valid digit was read
+         s += c;
+         if (! i.get(c))
+           break;
+       }
+      break;
+    case 8:
+      while (isdigit(c) && c != '8' && c != '9')
+       {
+         ok = true; // at least a valid digit was read
+         s += c;
+         if (! i.get(c))
+           break;
+       }
+      break;
+    case 16:
+      while (isxdigit(c))
+       {
+         ok = true; // at least a valid digit was read
+         s += c;
+         if (! i.get(c))
+           break;
+       }
+      break;
+    }
+}