-
Notifications
You must be signed in to change notification settings - Fork 0
/
Prettifier.cpp
109 lines (101 loc) · 3.6 KB
/
Prettifier.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "Prettifier.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <cctype>
using namespace std;
//helper function for trimming whitespace
void ltrimWhitespace(string& input) {
const char* white = " \t\n\r\f\v";
input.erase(0, input.find_first_not_of(white));
}
//Line constructor, takes in string and vector of maximums.
//updates vector of maximums while adding words
//if leading whitespace, push a space.
//constructor must deal with comments correctly--easy
//if at end of line, not as easy other areas
Page::Line::Line(string in, vector<int>& maxes) {
if(in.size() == 0) {
return;
}
if(isspace(in.at(0))) {
words.push_back(" ");
}
istringstream input(in);
string temporary;
while(input >> temporary) {
//deals with comment lines differently--if at beginning of line, leave them be.
//If not, adjust them to the end
if(temporary.find("//") != string::npos) {
//ostringstream os;
//adjusts comment lines to the end if they aren't at the beginning
//could be buggy
if(words.size() > 0) {
while(words.size() < 5) {
words.push_back(" ");
}
}
//add just extracted word back into stream so it can be included in getline
int lengthUnget = temporary.size();
for(int i = 0; i < lengthUnget; ++i) {
input.unget();
}
getline(input, temporary);
words.push_back(temporary);
//input >> os.rdbuf(); //might be able to use getline!!
//words.push_back(os.str());
return;
}
//if nothing special, just add in the word and update length
words.push_back(temporary);
if(temporary.size() > static_cast<size_t>(maxes.at(words.size() - 1))) {
maxes.at(words.size() - 1) = temporary.size();
}
//if there have already been 5 words (label, opcode, and three arguments)
//then the rest of the line should not be counted toward the max and
//should be added as one string
if(words.size() > 4) {
if(getline(input, temporary)) {
ltrimWhitespace(temporary);
words.push_back(temporary);
}
return;
}
}
}
int Page::Line::size() const{
return words.size();
}
string Page::Line::at(int pos) {
return words.at(pos);
}
string Page::Line::operator[](int pos) {
return words[pos];
}
//Page constructor. It should take in a filename and start parsing lines
Page::Page(ifstream& infile, ofstream& outfile): infileName(infile), outfileName(outfile) {
string input;
while(getline(infileName, input)) {
pageLines.push_back(Line(input, maximums));
}
}
//REQUIRES: all file parsing must already be complete
//MODIFIES: ofstream out
//EFFECTS: writes the pretty version out to the file
void Page::writeToFile() {
string toAdd;
//loop through all Lines and then each word
for(size_t i = 0; i < pageLines.size(); ++i) {
Line& currentLine = pageLines.at(i);
int lineLength = currentLine.size();
for(int j = 0; j < lineLength; ++j) {
toAdd = currentLine.at(j);
//add spaces until correct length
while(toAdd.size() < static_cast<size_t>(maximums.at(j) + 4)) {
toAdd += " ";
}
outfileName << toAdd;
}
outfileName << endl;
}
}