aboutsummaryrefslogblamecommitdiffstats
path: root/file.h
blob: 50f543d0760fdd4adfdfabca77307269d10b2812 (plain) (tree)

















































































































































































                                                                             
#ifndef INCLUDE_BLASSIC_FILE_H
#define INCLUDE_BLASSIC_FILE_H

// file.h
// Revision 7-feb-2005

#ifdef __BORLANDC__
#pragma warn -8022
#endif

#include "blassic.h"

#include "dim.h"

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

namespace blassic {

namespace file {

enum OpenMode {
	Input= 1, Output= 2, InOut= 3,
	Append= 6, Random= 8, Binary= 16,
	WithErr= 32
};

class BlFile {
public:
	struct field_element {
		size_t size;
		std::string name;
		Dimension dim;
		field_element (size_t n,
			const std::string & str, const Dimension & dim)
			:
			size (n), name (str), dim (dim)
		{ }
	};
	enum Align { AlignRight, AlignLeft };

	BlFile (OpenMode nmode);
	virtual ~BlFile ();

	virtual void closein ();
	virtual void closeout ();

	virtual void reset (int x1, int x2, int y1, int y2);

	virtual bool isfile () const = 0;
	virtual bool istextwindow () const;
	virtual bool eof ();
	virtual size_t loc ();
	virtual void flush ();
	virtual size_t getwidth () const;
	virtual void movecharforward ();
	virtual void movecharforward (size_t n);
	virtual void movecharback ();
	virtual void movecharback (size_t n);
	virtual void movecharup ();
	virtual void movecharup (size_t n);
	virtual void movechardown ();
	virtual void movechardown (size_t n);
	virtual void showcursor ();
	virtual void hidecursor ();
	virtual std::string getkey ();
	virtual std::string inkey ();
	virtual void getline (std::string & str, bool endline= true);
	char delimiter () { return cDelimiter; }
	void delimiter (char delim) { cDelimiter= delim; }
	char quote () { return cQuote; }
	void quote (char qu) { cQuote= qu; }
	char escape () { return cEscape; }
	void escape (char esc) { cEscape= esc; }
	friend BlFile & operator << (BlFile & bf, const std::string & str);
	friend BlFile & operator << (BlFile & bf, char c);
	friend BlFile & operator << (BlFile & bf, BlNumber n);
	friend BlFile & operator << (BlFile & bf, BlInteger n);
	friend BlFile & operator << (BlFile & bf, BlLineNumber l);
	friend BlFile & operator << (BlFile & bf, unsigned short n);
	void putspaces (size_t n);
	virtual void tab ();
	virtual void tab (size_t n);
	virtual void endline ();
	virtual void put (size_t pos);
	virtual void get (size_t pos);
	virtual void field_clear ();
	virtual void field (const std::vector <field_element> & elem);
	virtual void field_append (const std::vector <field_element> & elem);
	virtual bool assign (const std::string & name, const Dimension & dim,
		const std::string & value, Align align);
	virtual bool assign_mid (const std::string & name,
		const Dimension & dim,
		const std::string & value,
		size_t inipos, std::string::size_type len);
	virtual std::string read (size_t n);
	virtual void gotoxy (int x, int y);
	virtual void setcolor (int color);
	virtual int getcolor ();
	virtual void setbackground (int color);
	virtual int getbackground ();
	virtual void cls ();
	virtual std::string copychr (BlChar from, BlChar to);
	virtual int pos ();
	virtual int vpos ();
	virtual void tag ();
	virtual void tagoff ();
	virtual bool istagactive ();
	virtual void inverse (bool active);
	virtual bool getinverse ();
	virtual void bright (bool active);
	virtual bool getbright ();
	virtual void setwidth (size_t w);
	virtual void setmargin (size_t m);
	virtual BlInteger lof ();
	virtual bool poll ();
	virtual void scroll (int nlines);
private:
	virtual void outstring (const std::string & str);
	virtual void outchar (char c);

	BlFile (const BlFile &); // Forbidden
	void operator = (const BlFile &); // Forbidden.

	OpenMode mode;
	char cDelimiter, cQuote, cEscape;
protected:
	OpenMode getmode () const { return mode; }
};

//		Create BlFile functions.

BlFile * newBlFileConsole ();
BlFile * newBlFileWindow (BlChannel ch);
BlFile * newBlFileWindow (BlChannel ch, int x1, int x2, int y1, int y2);
BlFile * newBlFileOutString ();
BlFile * newBlFileOutput (std::ostream & os);
BlFile * newBlFileRegular (const std::string & name, OpenMode mode);
BlFile * newBlFileRandom (const std::string & name, size_t record_len);
BlFile * newBlFilePopen (const std::string & name, OpenMode mode);
BlFile * newBlFileSocket (const std::string & host, short port);
BlFile * newBlFilePrinter ();

class BlFileOut : public BlFile {
public:
	BlFileOut ();
	BlFileOut (OpenMode mode);
	void flush ();
protected:
	virtual std::ostream & ofs ()= 0;
private:
	void outstring (const std::string & str);
	void outchar (char c);
	//void outnumber (BlNumber n);
	//void outinteger (BlInteger n);
	//void outlinenumber (BlLineNumber l);
};

class BlFileOutString : public BlFileOut {
public:
	BlFileOutString ();
	bool isfile () const { return false; }
	std::string str ();
private:
	std::ostream & ofs ();
	std::ostringstream oss;
};

} // namespace blassic

} // namespace file

#endif

// Fin de file.h
Un proyecto texto-plano.xyz