From 8412a27b5331437807e5de76787932e909f337aa Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Wed, 18 Aug 2021 16:07:38 -0400 Subject: Initial Commit --- MANIFEST.MF | 1 + ed.hup | 8 +++ jed | 3 + jed.class | Bin 0 -> 5028 bytes jed.jar | Bin 0 -> 3321 bytes jed.java | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 7 ++ test.txt | 9 +++ 8 files changed, 243 insertions(+) create mode 100644 MANIFEST.MF create mode 100644 ed.hup create mode 100755 jed create mode 100644 jed.class create mode 100644 jed.jar create mode 100644 jed.java create mode 100644 makefile create mode 100644 test.txt diff --git a/MANIFEST.MF b/MANIFEST.MF new file mode 100644 index 0000000..43cb809 --- /dev/null +++ b/MANIFEST.MF @@ -0,0 +1 @@ +Main-Class: jed diff --git a/ed.hup b/ed.hup new file mode 100644 index 0000000..842c1cd --- /dev/null +++ b/ed.hup @@ -0,0 +1,8 @@ +hello world this is a test +aaawell;sajdf;alsd +adding more test +test +test +no test +more test +motestre diff --git a/jed b/jed new file mode 100755 index 0000000..8fb1d51 --- /dev/null +++ b/jed @@ -0,0 +1,3 @@ +#!/bin/sh + +java -jar jed.jar $@ diff --git a/jed.class b/jed.class new file mode 100644 index 0000000..10132fc Binary files /dev/null and b/jed.class differ diff --git a/jed.jar b/jed.jar new file mode 100644 index 0000000..6addd07 Binary files /dev/null and b/jed.jar differ 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; + } +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..afdc0d3 --- /dev/null +++ b/makefile @@ -0,0 +1,7 @@ +all: jed.java + javac jed.java + jar cvmf MANIFEST.MF jed.jar jed.class +run: all + ./jed +clean: + rm jed.jar jed.class diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..6ac09a5 --- /dev/null +++ b/test.txt @@ -0,0 +1,9 @@ +hello world this is a test +aaawell;sajdf;alsd +adding more test +test +test +no test +more test +motestre +test testpenistest test test petestpe -- cgit v1.2.3