summaryrefslogtreecommitdiffstats
path: root/hwpfilter/source/mzstring.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'hwpfilter/source/mzstring.cxx')
-rw-r--r--hwpfilter/source/mzstring.cxx268
1 files changed, 268 insertions, 0 deletions
diff --git a/hwpfilter/source/mzstring.cxx b/hwpfilter/source/mzstring.cxx
new file mode 100644
index 000000000..462ed91ad
--- /dev/null
+++ b/hwpfilter/source/mzstring.cxx
@@ -0,0 +1,268 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+/* PURPOSE
+ * supposed to be used instead of std::string
+ */
+
+#include "mzstring.h"
+
+#ifdef _WIN32
+# if !defined WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef _WIN32
+# define wsprintfA sprintf
+#endif
+
+const int AllocSize = 8;
+
+static int get_alloc_size(int len)
+{
+ return (len + AllocSize - 1) / AllocSize * AllocSize;
+}
+
+
+MzString::MzString()
+{
+ Length = 0;
+ Allocated = 0;
+ Data = nullptr;
+}
+
+
+MzString::~MzString()
+{
+ if (Data)
+ free(Data);
+}
+
+
+MzString &MzString::operator=(const MzString &s)
+{
+ if(this == &s)
+ return *this;
+
+ int n = s.length();
+ if (allocate(n))
+ {
+ if (n > 0) memcpy(Data, s.Data, n);
+ Length = n;
+ }
+ return *this;
+}
+
+
+MzString &MzString::operator = (const char *s)
+{
+ if (s == nullptr)
+ s = "";
+ int n = strlen(s);
+ if (allocate(n))
+ {
+ if (n > 0) memcpy(Data, s, n);
+ Length = n;
+ }
+ return *this;
+}
+
+
+void MzString::append(const char *s, int slen)
+{
+ if(!s || slen <= 0)
+ return;
+
+ int new_len = Length + slen;
+ if (allocate(new_len))
+ {
+ memcpy(Data + Length, s, slen);
+ Length = new_len;
+ }
+}
+
+
+void MzString::append(MzString const &s)
+{
+ if (s.Data)
+ append(s.Data, s.length());
+}
+
+
+void MzString::append(const char *s)
+{
+ if (!s) return;
+ append(s, strlen(s));
+}
+
+
+int MzString::compare(const char *s)
+{
+ if (!Data) return -1;
+ if (s==nullptr) return 1;
+
+ Data[Length] = 0;
+ return strcmp(Data, s);
+}
+
+
+int MzString::find(char ch)
+{
+ return find(ch,0);
+}
+
+
+int MzString::find(char ch, int pos)
+{
+ for (int i = pos; i < Length; i++)
+ {
+ if (Data[i] == ch)
+ return i;
+ }
+ return -1;
+}
+
+
+int MzString::rfind(char ch)
+{
+ return rfind(ch, Length - 1);
+}
+
+
+int MzString::rfind(char ch, int pos)
+{
+ if (pos >= Length)
+ return -1;
+
+ while (pos >= 0)
+ {
+ if (Data[pos] == ch)
+ return pos;
+ pos--;
+ }
+ return -1;
+}
+
+
+// << operator
+MzString &MzString::operator << (const char *str)
+{
+ append(str);
+ return *this;
+}
+
+
+MzString &MzString::operator << (char ch)
+{
+ append(&ch, 1);
+ return *this;
+}
+
+
+MzString &MzString::operator << (int i)
+{
+ char str[80];
+
+ wsprintfA(str, "%d", i);
+ append(str);
+ return *this;
+}
+
+
+MzString &MzString::operator << (tools::Long l)
+{
+ char str[80];
+
+ wsprintfA(str, "%ld", l);
+ append(str);
+ return *this;
+}
+
+
+MzString &MzString::operator << (MzString const &s)
+{
+ append(s);
+ return *this;
+}
+
+
+char MzString::operator [] (int n)
+{
+ if (Data && 0 <= n && n < Length)
+ return Data[n];
+
+ return 0;
+}
+
+
+void MzString::replace(int pos, char ch)
+{
+ if (Data && 0 <= pos && pos < Length)
+ Data[pos] = ch;
+}
+
+
+// Private Methods.
+
+
+bool MzString::allocate(int len)
+{
+ len++; // In case we want to add a null.
+
+ if (len < 0)
+ return false;
+
+ if (Data)
+ {
+ if (len < Allocated)
+ return true;
+ else
+ {
+ int n = get_alloc_size(len);
+ char *p = static_cast<char *>(realloc(Data, n));
+ if (p)
+ {
+ Data = p;
+ Allocated = n;
+ return true;
+ }
+ }
+ }
+ else
+ {
+// In case we want to add a null.
+ int n = get_alloc_size(len);
+ Data = static_cast<char *>(malloc(n));
+ if (Data)
+ {
+ Allocated = n;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */