From 8412a27b5331437807e5de76787932e909f337aa Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Wed, 18 Aug 2021 16:07:38 -0400 Subject: Initial Commit --- jed.java | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 jed.java (limited to 'jed.java') diff --git a/jed.java b/jed.java new file mode 100644 index 0000000..8f6d249 --- /dev/null +++ b/jed.java @@ -0,0 +1,215 @@ +import java.util.Scanner; +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.io.IOException; + +class jed { + + private static ArrayList file = new ArrayList(); // Arraylist that stores every line of a file in strings + private static Scanner kbIn = new Scanner(System.in); + private static int currentLine = 0; + private static boolean hasName = true; + + public static void main(String args[]) { + String fileName = null; + try { // checks if the user provided a file name + fileName = args[0]; + readFile(args[0]); + } catch (IndexOutOfBoundsException e) { + hasName = false; + } + + while (true) { + String line = kbIn.nextLine(); + int err = parser(line, fileName); + 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, String fileName) { + int err = 0; + if (cmd.equals("w")) // w writes the file + err = writeFile(fileName); + else if (cmd.equals("q")) // q quits + return 1; + else if (cmd.equals("a")) // a appends + append(); + else if (cmd.equals("p")) // p prints lines + printFile(false); + else if (cmd.equals("n")) //n prints lines with numbers + printFile(true); + else if (isNum(cmd)) { // some positive integer to change lines + currentLine = Integer.parseInt(cmd) - 1; + System.out.printf("%d %s\n", currentLine + 1, file.get(currentLine)); + } else if (cmd.equals("c")) // c change current line + changeLine(); + else if (cmd.equals("d")) // d delete current line + deleteLine(); + else if (cmd.substring(0,2).equals("w ")) { // w FILENAME writes a file with user inputed name + String s[] = new String[2]; + s = cmd.split(" "); + hasName = true; + err = writeFile(s[1]); + } else if (cmd.substring(0,1).equals("g")) { // g/expression/ finds user input + find(cmd.substring(2, cmd.length() - 1)); + } else if (cmd.substring(0,2).equals("%s")) { // %s/expression/newExpression/ replaces an expression with new user input through the whole file + String temp[] = new String[3]; + temp = cmd.split("/"); + replace(0, file.size(), temp[1], temp[2]); + } else if (cmd.substring(0,1).equals("<")) { // command works with d and s/ex/nex/ + String temp[] = new String[2]; + temp = cmd.split(">"); + range(temp[0], temp[1]); + } else if (cmd.substring(0,1).equals("s")) { // s/expression/newExpression/ replaces an expression with new user input in the current line + String temp[] = new String[3]; + temp = cmd.split("/"); + replace(currentLine, currentLine + 1, temp[1], temp[2]); + } else if (cmd.substring(0,1).equals("o")) { // o fileName opens a file + readFile(cmd.substring(2,cmd.length())); + } else // unknown command + System.out.println("?"); + if (err == 1) // error in writing the file + System.out.println("Error writing the file"); + return 0; + } + + /* range: gets the inputed range and runs the command with the range */ + private static void range(String range, String cmd) { + String num[] = new String[2]; + num = range.replace("<", "").split(","); + String temp[] = new String[3]; + temp = cmd.split("/"); + int start = Integer.parseInt(num[0]) - 1, stop = Integer.parseInt(num[1]); + if (start <= 0 || start-1 >file.size() || stop <= 0 || stop-1 > file.size() || stop <= start) + System.out.println("?"); + if (temp[0].equals("s")) + replace(start, stop, temp[1], temp[2]); + else if (temp[0].equals("d")) + deleteLine(start, stop); + } + + /* deleteLine: deletes line in the range of start to stop */ + private static void deleteLine(int start, int stop) { + for (int i = start; i < stop; i++) { + file.remove(start); + } + } + + /* replace: replaces an expression with new user input */ + private static void replace(int start, int stop, String ex, String newEx) { + for (int i = start; i < stop; i++) { + String line = file.get(i); + file.add(i, line.replace(ex, newEx)); + file.remove(i + 1); + } + } + + /* find: finds user input in the file and prints it with line numbers */ + private static void find(String expression) { + for (int i = 0; i < file.size(); i++) { + String line = file.get(i); + for (int j = 0, k = expression.length(); k < line.length(); j++, k++) { + if (line.substring(j, k).equals(expression)) { + System.out.printf("%d %s\n", i + 1, line); + break; + } + } + } + } + + /* changeLine: changes the current line */ + private static void changeLine() { + file.remove(currentLine); + String input; + int line = currentLine; + while (!(input = kbIn.nextLine()).equals(".")) + file.add(line++, input); + } + + /* deleteLine: deletes the current line */ + private static void deleteLine() { + file.remove(currentLine); + } + + /* 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; + } + + /* append: appends user input to the end of a file */ + private static void append() { + String input; + while (!(input = kbIn.nextLine()).equals(".")) + file.add(input); + } + + /* printFile: prints strings from file arraylist, if num is true it includes line numbers */ + private static void printFile(boolean num) { + for (int i = 0; i < file.size(); i++) { + if (num) + System.out.printf("%d %s\n", i+1, file.get(i)); + else + System.out.println(file.get(i)); + } + } + + /* createFile: creates a file, only to be called by writeFile */ + private static int createFile(String fileName) { + try { + File f = new File(fileName); + if (f.createNewFile()) + return 1; + return 0; + } catch (IOException e) { + return -1; + } + } + + /* writeFile: reads strings from file arraylist and prints them into a file */ + private static int writeFile(String fileName) { + if (!hasName) { + System.out.println("?"); + return 1; + } + int err = createFile(fileName); + if (err == -1) + return 1; + try { + FileWriter fw = new FileWriter(fileName); + PrintWriter pw = new PrintWriter(fw); + for (int i = 0; i < file.size(); i++) + pw.println(file.get(i)); + pw.close(); + } catch (IOException e) { + return 1; + } + return 0; + } + + /* readFile: opens a file and stores each line in a string arraylist called file */ + private static int readFile(String fileName) { + try { + File fileObj = new File(fileName); + Scanner fileReader = new Scanner(fileObj); + while(fileReader.hasNextLine()) + file.add(fileReader.nextLine()); + fileReader.close(); + } catch (FileNotFoundException e) { + createFile(fileName); + } + return 0; + } +} -- cgit v1.2.3