/*
* File: ansi.h
* Purpose: To have fun messing with people's terminals, and making
* lots of colorful and interesting programs.
*
* This provides a nice little interface to the ANSI escape
* sequence set.
*/
#ifndef ANSI_H
#define ANSI_H
#include <iostream>
#include <string>
#include <sstream>
inline std::ostream& clearLine(std::ostream &os) {
return os << "\033[K";
}
inline std::ostream& saveCursor(std::ostream &os) {
return os << "\033[s";
}
inline std::ostream& restoreCursor(std::ostream &os) {
return os << "\033[u";
}
/*
* This class is used by commands requiring arguments
*/
class ArgSequence {
public:
ArgSequence(std::string seq) {
this->seq = seq;
}
std::ostream& operator()(std::ostream &os) const {
return os << seq;
}
private:
std::string seq;
};
//overload the << operator so ostream can use the sequence!
inline std::ostream& operator<<(std::ostream& os, const ArgSequence& aSeq) {
return aSeq(os);
}
/*
* Commands requiring arguments
*/
inline ArgSequence cursorUp(int value) {
//compute the arg sequence
std::ostringstream os;
os << "\033[" << value << "A";
//return the result
return ArgSequence(os.str());
}
inline ArgSequence cursorDown(int value) {
//compute the arg sequence
std::ostringstream os;
os << "\033[" << value << "B";
//return the result
return ArgSequence(os.str());
}
inline ArgSequence cursorForward(int value) {
//compute the arg sequence
std::ostringstream os;
os << "\033[" << value << "C";
//return the result
return ArgSequence(os.str());
}
inline ArgSequence cursorBackward(int value) {
//compute the arg sequence
std::ostringstream os;
os << "\033[" << value << "D";
//return the result
return ArgSequence(os.str());
}
inline ArgSequence cursorPosition(int x, int y) {
//compute the arg sequence
std::ostringstream os;
os << "\033[" << y << ";" << x << "H";
//return the result
return ArgSequence(os.str());
}
inline std::ostream& cursorOff(std::ostream &os) {
return os << "\033[?25l";
}
inline std::ostream& cursorOn(std::ostream &os) {
return os << "\033[?25h";
}