summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk/kompilator/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/Main.java')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/Main.java124
1 files changed, 19 insertions, 105 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/Main.java b/src/main/java/no/eliashaugsbakk/kompilator/Main.java
index be5746c..aad3753 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/Main.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/Main.java
@@ -1,131 +1,45 @@
package no.eliashaugsbakk.kompilator;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.List;
+import no.eliashaugsbakk.kompilator.IO.File;
+import no.eliashaugsbakk.kompilator.IO.FileReaderWriter;
+import no.eliashaugsbakk.kompilator.IO.FileReaderWriterException;
+import no.eliashaugsbakk.kompilator.asmGeneration.AssemblyBuilder;
+import no.eliashaugsbakk.kompilator.assembleAndLink.AssemblerAndLinker;
public class Main {
public static final String programFileExtension = "spå";
- private record InputProgram(String programName, String programContent) {
- }
-
static void main(String[] args) {
if (args.length != 1) {
IO.println("err: Only accepts one argument: The filename of the input program");
System.exit(1);
}
- InputProgram inputProgram = readInputProgram(args[0]);
-
- List<String> IR = List.of();
-
- String assembly = new AssemblyBuilder().createAssembly(IR);
-
- assemblingAndLInking(inputProgram.programName(), assembly);
-
- System.exit(0);
- }
- private static void assemblingAndLInking(String programName, String assembly) {
- String assemblyFileName = programName + ".s";
- String assembledFileName = programName + ".o";
+ String inputFileName = args[0];
- try {
- FileWriter fw = new FileWriter(assemblyFileName);
- fw.write(assembly);
- fw.close();
- } catch (IOException e) {
- IO.println("err: Could not write file: " + e.getMessage());
- }
-
- try {
- // Assembling using: as -o program.o program.s
- ProcessBuilder asPB = new ProcessBuilder("as", "-o", assembledFileName, assemblyFileName);
- runProcess(asPB);
- } catch (IOException e) {
- IO.println("err: Failed to invoke GCC\n\n" + e);
- } catch (InterruptedException e) {
- IO.println("err: Failed to wait for gcc output\n\n" + e);
- }
-
- try {
- // Linking using GNU linker: ld -o program program.o
- ProcessBuilder ldPB = new ProcessBuilder("ld", "-o", programName, assembledFileName);
- runProcess(ldPB);
- } catch (IOException e) {
- IO.println("err: Failed to invoke GCC\n\n" + e);
- } catch (InterruptedException e) {
- IO.println("err: Failed to wait for gcc output\n\n" + e);
+ if (!inputFileName.endsWith("." + programFileExtension)) {
+ IO.println("err: Input file must use the file extension: " + programFileExtension);
+ System.exit(1);
}
- // Clean up
+ File inputProgram = null;
+ FileReaderWriter fileReaderWriter = new FileReaderWriter();
try {
- Files.delete(Path.of(assemblyFileName));
- } catch (IOException e) {
- IO.println("err: Could not delete assembly file: " + e.getMessage());
- }
- try {
- Files.delete(Path.of(assembledFileName));
- } catch (IOException e) {
- IO.println("err: Could not delete assembled file: " + e.getMessage());
- }
- }
-
- private static void runProcess(ProcessBuilder processBuilder)
- throws IOException, InterruptedException {
- Process process = processBuilder.start();
- process.waitFor();
- if (process.exitValue() != 0) {
- BufferedReader bufferedReader =
- new BufferedReader(new InputStreamReader(process.getErrorStream()));
-
- String line;
- while ((line = bufferedReader.readLine()) != null) {
- System.out.println(line);
- }
- bufferedReader.close();
- }
- }
-
- private static InputProgram readInputProgram(String inputFilePath) {
- if (!inputFilePath.endsWith("." + programFileExtension)) {
- IO.println("err: Input file must use the file extension: " + programFileExtension);
+ inputProgram = fileReaderWriter.readFile(inputFileName);
+ } catch (FileReaderWriterException e) {
+ IO.println("Could not read input file: " + inputFileName + "\n\n" + e.getMessage());
System.exit(1);
}
- String programName =
- inputFilePath.substring(inputFilePath.lastIndexOf("/") + 1, inputFilePath.lastIndexOf("."));
-
- String programContent = null;
-
- try (BufferedReader br = new BufferedReader(new FileReader(inputFilePath))) {
- StringBuilder sb = new StringBuilder();
- String line = br.readLine();
+ List<String> IR = List.of();
- while (line != null) {
- sb.append(line);
- sb.append(System.lineSeparator());
- line = br.readLine();
- }
- programContent = sb.toString();
- } catch (FileNotFoundException e) {
- IO.println("err: File not found");
- } catch (IOException e) {
- IO.println(e.getMessage());
- }
+ String assembly = new AssemblyBuilder().createAssembly(IR);
- if (programContent == null) {
- IO.println("err: Could not read input file");
- System.exit(1);
- }
+ AssemblerAndLinker assemblerAndLinker = new AssemblerAndLinker();
+ assemblerAndLinker.assembleAndLink(inputProgram.fileName(), assembly);
- return new InputProgram(programName, programContent);
+ System.exit(0);
}
}