Skip to content

Instantly share code, notes, and snippets.

@xypnox
Created February 11, 2017 02:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xypnox/2d79023ed433dd2ceca105fe62fa03e8 to your computer and use it in GitHub Desktop.
Save xypnox/2d79023ed433dd2ceca105fe62fa03e8 to your computer and use it in GitHub Desktop.
It works!!!!
#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include <fstream.h>
// Classes
class Todo{
public:
char content[200];
char status;
int _index;
};
class List {
public:
Todo list[20];
char title[100];
char tags[10][20];
int _listIndex; // Variable to count the filling of list
int _tagIndex; // Variable to count the filling of tags
int _hasTags;
List(); // Asks for #title(required) and #tags(can be skipped).
List(char Title[100]); // Initialize the #list with #title
void enter(); // Enter the info given by user
void addTag(char Tag[20]); // Add the tag to Tags
void setTitle(char Title[100]); // Set the Title given
void view(); // View the list's #title #tags and #content
void indexView(); // View the contents with the index
void tagView(); // View only Title and tags
void todoView(int); // View the todo of index passed
void tagIndexView(); // View the Title and Tags with the index
void append(); // append a new ToDo in the #list
void removeTodo(int); // delete the list at index passed
void removeTag(int); // delete the tag at index passed
void changeStatus(int index, char status); // Changes Status of the Item of #index to #status
~List() {}
};
List::List(){
_listIndex = 0;
_tagIndex = 0;
_hasTags = 0;
}
List::List(char Title[100]) {
_listIndex = 0;
_tagIndex = 0;
_hasTags = 0;
strcpy(title, Title);
}
void List::enter(){
cout << "Enter title for your list" << endl << " +> " ;
cin.getline(title, sizeof(title));
char choice[10];
cout << "Do you want some tags? (yes/no)" << endl << " ?> " ;
cin.getline(choice, sizeof(choice));
if (!(strcmp(choice, "yes")*strcmp(choice, "y"))) {
char tagTemp[20];
cout << "Enter the tag one at a time" << endl << "\'d\' when done " << endl;
cout << " +> " ;
while (1) {
cin.getline(tagTemp, sizeof(tagTemp));
if (strcmp(tagTemp, "d") != 0) {
addTag(tagTemp);
cout << " +> " ;
}
else {
break;
}
}
_hasTags = 1;
}
// cout << "Has tags = " << _hasTags << endl;
}
void List::addTag(char Tag[20]) {
strcpy(tags[_tagIndex++], Tag);
}
void List::setTitle(char Title[100]) {
strcpy(title, Title);
}
void List::view() {
cout << title << endl;
cout << "============" << endl;
if (_hasTags) {
cout << "Tags : ";
for (int i = 0; i < _tagIndex; i++) {
cout << tags[i] << " ";
}
cout << endl << endl;
}
for (int i = 0; i < _listIndex; i++) {
cout << " [" << list[i].status << "] ";
cout << list[i].content << endl;
}
}
void List::indexView() {
cout << title << endl;
cout << "============" << endl;
if (_hasTags) {
cout << "Tags : ";
for (int i = 0; i < _tagIndex; i++) {
cout << tags[i] << " ";
}
cout << endl << endl;
}
for (int i = 0; i < _listIndex; i++) {
cout << " " << i << ". [" << list[i].status << "] ";
cout << list[i].content << endl;
}
}
void List::tagView() {
cout << title << endl;
if (_hasTags) {
cout << "Tags : ";
for (int i = 0; i < _tagIndex; i++) {
cout << tags[i] << " ";
}
cout << endl;
}
}
void List::todoView(int index) {
cout << index << ". [" << list[index].status << "] ";
cout << list[index].content << endl;
}
void List::tagIndexView() {
cout << title << endl;
cout << "============" << endl;
if (_hasTags) {
cout << "Tags : ";
for (int i = 0; i < _tagIndex; i++) {
cout << tags[i] << " ";
}
cout << endl << endl;
}
else {
cout << "No tags here." << endl;
}
}
void List::append(){
char Content[200];
cout << "Enter the content of ToDo" << endl << " +> ";
cin.getline(Content, sizeof(Content));
strcpy(list[_listIndex].content, Content);
list[_listIndex].status = ' ';
list[_listIndex]._index = _listIndex;
_listIndex++;
}
void List::removeTodo(int index) {
for (int i = index; i < _listIndex; i++) {
list[i] = list[i + 1];
}
_listIndex--;
}
void List::removeTag(int index) {
for (int i = index; i < _tagIndex; i++) {
strcpy(tags[i], tags[i + 1]);
}
_tagIndex--;
if (_tagIndex == 0) {
_hasTags = 0;
}
}
void List::changeStatus(int index, char status){
list[index].status = status;
}
void search(char term[], List arrayL[6]){
int len = strlen(term);
int found = 0;
// Search in titles
for (int i = 0; i < 6 ; i++) {
int z = 0;
found = 0;
for (unsigned int k = 0; k < strlen(arrayL[i].title); k++) {
if (tolower(term[z++]) == tolower(arrayL[i].title[k])) {
found = 1;
// cout << "Found title" << endl;
}
else {
found = 0;
z = 0;
}
if (z == len) {
if (found) {
break;
}
z = 0;
}
}
if (found) {
cout << "Found in title, Index => " << i << endl << arrayL[i].title << endl;
}
}
// Search in Tags
for (int io = 0; io < 6 ; io++) {
int z = 0;
found = 0;
for (int k = 0; k < arrayL[io]._tagIndex; k++) {
z = 0;
for (unsigned int c = 0; c < strlen(arrayL[io].tags[k]); c++) {
if (tolower(term[z++]) == tolower(arrayL[io].tags[k][c])) {
found = 1;
}
else {
found = 0;
z = 0;
}
if (z == len) {
if (found) {
break;
}
z = 0;
}
}
if (found) {
cout << "Found in tag, Index => " << io << endl;
arrayL[io].tagView();
break;
}
}
}
// Search in Todos
for (int iz = 0; iz < 6 ; iz++) {
int z = 0;
found = 0;
for (int k = 0; k < arrayL[iz]._listIndex; k++) {
z = 0;
for (unsigned int c = 0; c < strlen(arrayL[iz].list[k].content); c++) {
if (tolower(term[z++]) == tolower(arrayL[iz].list[k].content[c])) {
found = 1;
}
else {
found = 0;
z = 0;
}
if (z == len) {
if (found) {
break;
}
z = 0;
}
}
if (found) {
cout << "Found in ToDo, List Index => " << iz << endl;
arrayL[i].view();
break;
}
}
}
}
void Export(List Array[6], int _arrayLindex){
char fname[40];
cout << "Enter the Export file name " << endl << " +> " ;
cin.getline(fname, sizeof(fname));
strcat(fname, ".tdexp");
ofstream file;
file.open(fname);
for (int itt = 0; itt < _arrayLindex; itt++) {
file << Array[itt].title << endl;
file << "===============" << endl;
file << "Tags : ";
for (int j = 0; j < Array[itt]._tagIndex; j++) {
file << Array[itt].tags[j] << " ";
}
file << endl;
for (int k = 0; k < Array[itt]._listIndex; k++) {
file << " [" << Array[itt].list[k].status << "] ";
file << Array[itt].list[k].content << endl;
}
file << endl;
}
cout << "File exported to : " << fname << " successfully :)" << endl;
file.close();
}
List arrayL[6];
List currentL;
int _arrayLindex = 0;
int _currentLindex;
int isOpenL = 0; // For checking wether a list is open or not
char filename[20] = "data.tdx";
// Fxns Used
void initiate(); // Initiate the data before user inteface
int parse(char []); // run the command entered by the users
void stats(); // display stats of opened list
void openL(int); // open the list specified by index
void displayL(); // display all the lists
int confirm(); // ask for confirmation (y/n)
void empty(); // remove data from the program & data-file
void finish(); // save the data to the data-file
void initiate() {
// Fxn to read data from external file int the array of Lists
fstream file(filename, ios::in|ios::binary);
List tempOb; // temperary object
while (file.read((char*)&tempOb, sizeof(tempOb))) {
arrayL[_arrayLindex++] = tempOb;
}
file.close();
}
int parse(char command[80]){
// Fxn to Parse(execute) the command passed
/// Here a crazy fun expression is used in if () {} to compare strings
/// Since we wanted any of them to be zero, hence, they were multiplied
/// to give zero. Mathematically it is quite accurate and syntactically
/// beautiful.
int success = 0; // to mark wether a command completed successfully
if (!(strcmp(command, "new") * strcmp(command, "n"))) {
// Create a new List
arrayL[_arrayLindex++].enter();
success = 1;
}
else if (!(strcmp(command, "stats") * strcmp(command, "stat"))) {
// Display the stats
stats();
success = 1;
}
else if (!(strcmp(command, "open") * strcmp(command, "o"))) {
// Open existing lists
if (_arrayLindex) {
if (isOpenL) {
arrayL[_currentLindex] = currentL;
finish();
}
int choice;
cout << "Enter The No. of List to be opened" << endl;
displayL();
cout << " #> " ;
cin >> choice;
cin.ignore();
while ( !(0 <= choice && choice < _arrayLindex) ) {
cout << "Invalid choice choose again" << endl;
cout << " #> " ;
cin >> choice;
cin.ignore();
}
openL(choice);
isOpenL = 1;
}
else {
cout << "No List found, create a new one with \'n\' or \'new\'" << endl;
}
success = 1;
}
else if (!(strcmp(command, "append") * strcmp(command, "a"))) {
// Append a new Todo to the currently opened list
if (isOpenL) {
currentL.append();
}
else {
cout << "No List is opened, Open a list first" << endl;
}
success = 1;
}
else if (!(strcmp(command, "mark") * strcmp(command, "m"))) {
// Mark/(change status) a Todo with a given charater
if (isOpenL) {
int choice;
currentL.indexView();
cout << "Choose the Todo to mark : " << endl << " #> ";
cin >> choice;
while (choice >= currentL._listIndex || choice < 0) {
cout << "Invalid Choice Try again" << endl << " #> ";
cin >> choice;
}
char status;
cout << "Enter The new Status" << endl << " +> " ;
cin >> status;
cin.ignore();
currentL.changeStatus(choice, status);
}
else {
cout << "No List is opened, Open a list first" << endl;
}
success = 1;
}
else if (!(strcmp(command, "addtag") * strcmp(command, "addt"))) {
// Append a new Todo to the currently opened list
if (isOpenL) {
char newTag[40];
cout << "Enter the New Tag " << endl << " +> ";
cin.getline(newTag, sizeof(newTag));
currentL.addTag(newTag);
}
else {
cout << "No List is opened, Open a list first" << endl;
}
success = 1;
}
else if (!(strcmp(command, "view") * strcmp(command, "v"))) {
// view todo's of the current list
if (isOpenL) {
currentL.view();
}
else {
cout << "No List is opened, Open a list first" << endl;
}
success = 1;
}
else if (!(strcmp(command, "iview") * strcmp(command, "iv"))) {
// view todo's of the current list with index
if (isOpenL) {
currentL.indexView();
}
else {
cout << "No List is opened, Open a list first" << endl;
}
success = 1;
}
else if (!(strcmp(command, "search") * strcmp(command, "srch"))) {
// Search the Database
char searchTerm[40];
cout << "Enter the search term " << endl << " +> ";
cin.getline(searchTerm, sizeof(searchTerm));
if (isOpenL) {
arrayL[_currentLindex] = currentL;
}
search(searchTerm, arrayL);
success = 1;
}
else if (!(strcmp(command, "save") * strcmp(command, "s"))) {
// Save the data to the file
if (isOpenL) {
arrayL[_currentLindex] = currentL;
}
finish();
success = 1;
}
else if (!(strcmp(command, "export") * strcmp(command, "exp"))) {
// Export the data to a text file
if (isOpenL) {
arrayL[_currentLindex] = currentL;
}
Export(arrayL, _arrayLindex);
success = 1;
}
else if (!(strcmp(command, "delete") * strcmp(command, "del"))) {
// Delete Things
char choice[10];
cout << "What do you want to delete? (list/todo/tag)" << endl << " ?> ";
cin.getline(choice, sizeof(choice));
if (!(strcmp(choice, "list") * strcmp(choice, "List"))) {
int index;
cout << "Enter the Index of List to Delete " << endl;
displayL();
cout << " #> ";
cin >> index;
cin.ignore();
cout << "Are you sure, This cannot be undone, This will delete the List ->" << endl;
arrayL[index].view();
if ( confirm() ) {
for (int i = index; i < _arrayLindex - 1; i++) {
arrayL[i] = arrayL[i+1];
}
_arrayLindex--;
}
}
else if (!(strcmp(choice, "todo") * strcmp(choice, "Todo") * strcmp(choice, "ToDo"))) {
if (isOpenL) {
int index;
cout << "Enter the Index of Todo to Delete " << endl;
currentL.indexView();
cout << " #> ";
cin >> index;
cin.ignore();
cout << "Are you sure, This cannot be undone, This will delete the ToDo ->" << endl;
currentL.todoView(index);
if ( confirm() ) {
currentL.removeTodo(index);
}
arrayL[_currentLindex] = currentL; // To Help Improving Finalization
}
else {
cout << "No List is opened, Open a list first" << endl;
}
}
else if (!(strcmp(choice, "tag") * strcmp(choice, "tags") * strcmp(choice, "Tag"))) {
if (isOpenL) {
int index;
cout << "Enter the Index of Tag to Delete " << endl;
currentL.tagIndexView();
cout << " #> " ;
cin >> index;
cin.ignore();
cout << "Are you sure, This cannot be undone, This will delete the Tag ->" << endl;
cout << currentL.tags[index] << endl;
if ( confirm() ) {
currentL.removeTag(index);
}
arrayL[_currentLindex] = currentL; // To Help Improving Finalization
}
else {
cout << "No List is opened, Open a list first" << endl;
}
}
finish();
success = 1;
}
else if (!(strcmp(command, "qdelete") * strcmp(command, "qdel"))) {
// Delete Todo of current list using index
/// qdelete -> Quick Delete
if (isOpenL) {
int index;
cout << "Enter the Index of List to Delete " << endl;
currentL.indexView();
cout << " #> " ;
cin >> index;
cin.ignore();
cout << "Are you sure, This cannot be undone, This will delete ->" << endl;
currentL.todoView(index);
if ( confirm() ) {
currentL.removeTodo(index);
}
arrayL[_currentLindex] = currentL;
}
else {
cout << "No List is opened, Open a list first" << endl;
}
finish();
success = 1;
}
else if (!(strcmp(command, "clear") * strcmp(command, "clr"))) {
// Refresh the data file
// XXX WARN XXX -> Strictly, Not to be used By users, Deletes all Data
if ( confirm() ) {
ofstream file(filename, ios::trunc|ios::binary|ios::out);
file.write("", sizeof(arrayL));
file.close();
empty();
initiate();
}
success = 1;
}
else if (!(strcmp(command, "quit") * strcmp(command, "q"))) {
// exit the program after saving it to the file
if ( confirm() ) {
if (isOpenL) {
arrayL[_currentLindex] = currentL;
}
finish();
success = -1;
}
else {
success = 1;
}
}
else if (!(strcmp(command, "help") * strcmp(command, "-h"))) {
// View help
char line[80];
ifstream helpfile("help.txt");
while (!helpfile.eof()) {
helpfile.getline(line, sizeof(line));
cout << line << endl;
}
helpfile.close();
success = 1;
}
return success;
}
void stats(){
// Display wether a list is open or not
if (isOpenL) {
cout << "This List is open : " << currentL.title << endl;
cout << "Total No. of todos : " << currentL._listIndex << endl;
}
else {
cout << "No list is open" << endl;
}
cout << "Total lists = " << _arrayLindex << endl;
}
void openL(int index) {
currentL = arrayL[index];
_currentLindex = index;
cout << "Opened : " << currentL.title << endl;
currentL.view();
}
void displayL() {
for (int i = 0; i < _arrayLindex; i++) {
cout << i << ". " << arrayL[i].title << endl;
}
}
int confirm() {
// can be used as if( confirm() ) /// Improves yes/no prompts
char confm[10];
cout << "Enter \'yes\' to continue" << endl << " ?> " ;
cin.getline(confm, sizeof(confm));
if (!(strcmp(confm, "yes") * strcmp(confm, "y"))) {
return 1;
}
else{
return 0;
}
}
void empty() {
List tarrayL[6];
memcpy(arrayL, tarrayL, sizeof(arrayL));
_arrayLindex = 0;
isOpenL = 0;
}
void finish() {
// Write the changes back to file
ofstream file (filename, ios::out);
for (int i = 0; i < _arrayLindex; i++) {
file.write((char*)&arrayL[i], sizeof(arrayL[i]));
}
file.close();
}
int main() {
initiate();
cout << "=== --- --> TodX <-- --- ===" << endl;
cout << "Welcome to TodX the ultimate Todo list" << endl;
cout << "v1.03a = Borland DOS build, docs at -> http://todx.rtfd.io" << endl;
char command[80];
while (1) {
cout << "\n *> ";
cin.getline(command, sizeof(command));
if (!cin) {
cout << "Have a Great Day :)" << endl;
break;
}
int result = parse(command);
if(result > 0){
continue;
}
else if (result == 0) {
cout << "Command not found, try `help` for help" << endl;
}
else if (result == -1) {
cout << "Data Saved, Have a Great Day :)" << endl;
break;
}
else {
cout << "Something went terribly wrong, we apologize :(" << endl;
}
}
finish();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment