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
110
111
112
113
114
115
116
117
|
package jed;
import java.util.Scanner;
public class jed {
private static Scanner kbIn = new Scanner(System.in);
private static filebuffer file;
public static void main(String args[]) {
String fileName = null;
boolean hasName = true;
try { // checks if the user provided a file name
fileName = args[0];
} catch (IndexOutOfBoundsException e) {
hasName = false;
}
file = new filebuffer(fileName, hasName);
while (true) {
String line = kbIn.nextLine();
int err = parser(line);
if (err == 1)
break;
}
kbIn.close();
}
/* parser: the command parser for jed, takes user input and interprets the command */
private static int parser(String cmd) {
int err = 0;
if (isNum(cmd)) {
file.changeCurrentLine(Integer.parseInt(cmd) - 1);
System.out.printf("%d %s\n", file.getCurrentLine() + 1, file.getLine(file.getCurrentLine()));
} else {
char c = cmd.charAt(0);
switch (c) {
case 'w':
if (cmd.length() > 1) {
String s[] = new String[2];
s = cmd.split(" ");
file.changeName(s[1]);
}
err = file.writeFile();
break;
case 'q': // q quits
return 1;
case 'a': // a appends
file.append(kbIn, false);
break;
case 'A': // A appends after the current line
file.append(kbIn, true);
break;
case 'p': // p prints lines
file.printFile(false);
break;
case 'n': //n prints lines with numbers
file.printFile(true);
break;
case 'c': // c change current line
file.changeLine(kbIn);
break;
case 'd':
file.deleteLine(); // d delete current line
break;
case 'g': // g/expression/ finds user input
file.find(cmd.substring(2, cmd.length() - 1));
break;
case '%': // %s/expression/newExpression/ replaces an expression with new user input through the whole file
String s[] = new String[3];
s = cmd.split("/");
file.replace(0, file.getFileSize(), s[1], s[2]);
break;
case '<': // <integer, integer> prefix works with d and s/ex/nex/
String t[] = new String[2];
t = cmd.split(">");
file.range(t[0], t[1]);
break;
case 's': // s/expression/newExpression/ replaces an expression with new user input in the current line
String m[] = new String[3];
m = cmd.split("/");
file.replace(file.getCurrentLine(), file.getCurrentLine() + 1, m[1], m[2]);
break;
case 'o': // o fileName opens a file
file.changeName(cmd.substring(2,cmd.length()));
file.readFile();
break;
case 'h': // help command
help();
break;
default:
System.out.println("?");
break;
}
}
if (err == 1) // error in writing the file
System.out.println("Error writing the file");
return 0;
}
private static void help() {
System.out.println("Jed commands:\nq: quits.\nw: writes the file.\nw: filename: writes with inputted name.\no: filename: opens the file.\na: appends user input to the end of the file.\nA: appends user input after the current line.\np: prints the file.\nn: prints the file with line numbers.\nc: deletes and changes the current line.\nd: deletes the current line.\nAny integer: changes to that line number.\ng/expression/: finds and prints the expression.\n%s/expression/newExpression/: replaces an expression with new user input through the whole file.\n<integer, integer>: prefix works with d and s/ex/nex/ for a range of line.\ns/expression/newExpression/: replaces an expression with new user input in the current line.\nh: prints the commands and their description.");
}
/* isNum: checks if a string is a number, only to be used for changing lines */
private static boolean isNum(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
} catch (NullPointerException e) {
return false;
}
return true;
}
}
|