CSC112 Spring 2016 Examples
/*1* File: termmanip.h2* Purpose: To have fun messing with people's terminals, and making3* lots of colorful and interesting programs.4*5* This provides a nice little interface to the ANSI escape6* sequence set.7*/8#ifndef TERMMANIP_H9#define TERMMANIP_H10#include <iostream>11#include <string>12#include <sstream>1314/*15* Graphic Mode Modifiers16*/17inline std::ostream& normal(std::ostream &os) {18return os << "\033[0m";19}202122inline std::ostream& bold(std::ostream &os) {23return os << "\033[1m";24}252627inline std::ostream& underline(std::ostream &os) {28return os << "\033[4m";29}303132inline std::ostream& blink(std::ostream &os) {33return os << "\033[5m";34}353637inline std::ostream& reverseVideo(std::ostream &os) {38return os << "\033[7m";39}40414243/*44* Foreground Color Graphic Mode Modifiers45*/46inline std::ostream& black(std::ostream &os) {47return os << "\033[30m";48}495051inline std::ostream& red(std::ostream &os) {52return os << "\033[31m";53}545556inline std::ostream& green(std::ostream &os) {57return os << "\033[32m";58}596061inline std::ostream& yellow(std::ostream &os) {62return os << "\033[33m";63}646566inline std::ostream& blue(std::ostream &os) {67return os << "\033[34m";68}697071inline std::ostream& magenta(std::ostream &os) {72return os << "\033[35m";73}747576inline std::ostream& cyan(std::ostream &os) {77return os << "\033[36m";78}798081inline std::ostream& white(std::ostream &os) {82return os << "\033[37m";83}8485/*86* Foreground Color Graphic Mode Modifiers87*/88inline std::ostream& blackBackground(std::ostream &os) {89return os << "\033[40m";90}919293inline std::ostream& redBackground(std::ostream &os) {94return os << "\033[41m";95}969798inline std::ostream& greenBackground(std::ostream &os) {99return os << "\033[42m";100}101102103inline std::ostream& yellowBackground(std::ostream &os) {104return os << "\033[43m";105}106107108inline std::ostream& blueBackground(std::ostream &os) {109return os << "\033[44m";110}111112113inline std::ostream& magentaBackground(std::ostream &os) {114return os << "\033[45m";115}116117118inline std::ostream& cyanBackground(std::ostream &os) {119return os << "\033[46m";120}121122123inline std::ostream& whiteBackground(std::ostream &os) {124return os << "\033[47m";125}126127128/*129* Simple terminal commands130*/131inline std::ostream& clearScreen(std::ostream &os) {132return os << "\033[2J";133}134135136inline std::ostream& clearLine(std::ostream &os) {137return os << "\033[K";138}139140141inline std::ostream& saveCursor(std::ostream &os) {142return os << "\033[s";143}144145146inline std::ostream& restoreCursor(std::ostream &os) {147return os << "\033[u";148}149150151/*152* This class is used by commands requiring arguments153*/154class ArgSequence {155public:156ArgSequence(std::string seq) {157this->seq = seq;158}159160std::ostream& operator()(std::ostream &os) const {161return os << seq;162}163164private:165std::string seq;166};167168169//overload the << operator so ostream can use the sequence!170inline std::ostream& operator<<(std::ostream& os, const ArgSequence& aSeq) {171return aSeq(os);172}173174175/*176* Commands requiring arguments177*/178inline ArgSequence cursorUp(int value) {179//compute the arg sequence180std::ostringstream os;181os << "\033[" << value << "A";182183//return the result184return ArgSequence(os.str());185}186187188inline ArgSequence cursorDown(int value) {189//compute the arg sequence190std::ostringstream os;191os << "\033[" << value << "B";192193//return the result194return ArgSequence(os.str());195}196197198inline ArgSequence cursorForward(int value) {199//compute the arg sequence200std::ostringstream os;201os << "\033[" << value << "C";202203//return the result204return ArgSequence(os.str());205}206207208inline ArgSequence cursorBackward(int value) {209//compute the arg sequence210std::ostringstream os;211os << "\033[" << value << "D";212213//return the result214return ArgSequence(os.str());215}216217218inline ArgSequence cursorPosition(int x, int y) {219//compute the arg sequence220std::ostringstream os;221os << "\033[" << y << ";" << x << "H";222223//return the result224return ArgSequence(os.str());225}226227228inline std::ostream& cursorOff(std::ostream &os) {229return os << "\033[?25l";230}231232233inline std::ostream& cursorOn(std::ostream &os) {234return os << "\033[?25h";235}236237#endif238239240