// C++ code Copyright (C) David R. Evans G4AMJ/NQ0I

#ifndef DREstringH
#define DREstringH

// #include <std.h>
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>

#ifdef __GNUC__
#include "/usr/local/lib/g++-include/string.h"
#endif

#ifdef __BORLANDC__
#include "e:\bc4\include\string.h"
#endif

#ifdef macintosh
#include "string.h"
#endif

#include <defines.h>

class DREstring
{ struct str
  { char *s;
    int len, max_len, ref;
  };
  str* p;
  void disconnect();
  void initialise();

public:
  DREstring(void);
  DREstring(const int);
  DREstring(const long, int);
  DREstring(const char*);
  DREstring(DREstring&);
  DREstring(double, const char*);
  DREstring(double, double);
  DREstring(int, const char*);
  DREstring(char*, int);
  DREstring(const char);
  ~DREstring();

  inline char chr(int n) const { return *(p->s + n - 1); }
  inline operator int() { return length(); }

  char& operator[](int);
  void operator=(const char*);
  void operator=(DREstring& rhs);
  void operator+=(DREstring&);
  void operator+=(char&);    // DREstring += int or DREstring += char
  void operator+=(const char*);
  int operator==(DREstring&);
  inline operator const char*() const { return p->s; }
  inline int length(void) const { return p->len; }
  inline int max_length(void) const { return p->max_len; }
// the following not permitted in Borland C++
//  friend void operator=(char*, const DREstring&);
//  operator char*();
  friend void copy(char*, DREstring&);
  friend void duplicate(DREstring&, DREstring);
  void operator++(void);
  void clear(void)  { p->len = 0; }
  DREstring& toupper(void);

  DREstring operator+(const char*);
};

extern int find(DREstring&, const char*);
extern DREstring operator+(DREstring&, DREstring&);
extern DREstring left_fill(DREstring&, const int, const char* = " ");
extern DREstring right_fill(DREstring&, const int, const char* = " ");
extern DREstring filled_DREstring(char*, int);
extern DREstring centre(DREstring&, const int, const char* = " ");
extern DREstring overwrite(DREstring&, const int, const DREstring&);
extern DREstring subDREstring(DREstring&, const int = 1, const int = 10000);
extern ostream& operator<<(ostream& ost, const DREstring s);
extern istream& operator>>(istream& ist, DREstring& s);

inline DREstring decDREstring(const int n)
  { return DREstring(n, 10); }

/* inline DREstring DREstring10(const uint16 n)
  { return DREstring(n, 10); }

inline DREstring DREstring10(const uint32 n)
  { return DREstring(n, 10); }

inline DREstring DREstring10(const int16 n)
  { return DREstring(n, 10); }

inline DREstring DREstring10(const int32 n)
  { return DREstring(n, 10); } */

inline DREstring DREstring10(const int32 n)
  { return DREstring(n, 10); }
  
#endif
