diff options
| author | Elias Haugsbakk <[email protected]> | 2026-09-18 19:10:54 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-09-19 01:59:23 +0200 |
| commit | 6dd4036bd828dac87b9f63d0a58693b30c46faed (patch) | |
| tree | c194ad43c1d9b1a332e28659863b88f463a07a9c /src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java | |
| parent | 24f5104f56cfc67cf1e89da3e5913b2954acc36d (diff) | |
split into separate packages/classes
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java')
| -rw-r--r-- | src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java b/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java new file mode 100644 index 0000000..5ab0b57 --- /dev/null +++ b/src/main/java/no/eliashaugsbakk/kompilator/assembleAndLink/AssemblerAndLinker.java @@ -0,0 +1,75 @@ +package no.eliashaugsbakk.kompilator.assembleAndLink; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import no.eliashaugsbakk.kompilator.IO.File; +import no.eliashaugsbakk.kompilator.IO.FileReaderWriter; +import no.eliashaugsbakk.kompilator.IO.FileReaderWriterException; + +public class AssemblerAndLinker { + private final FileReaderWriter fileReaderWriter; + + public AssemblerAndLinker() { + fileReaderWriter = new FileReaderWriter(); + } + + public void assembleAndLink(String programName, String assembly) { + String assemblyFileName = programName + ".s"; + String assembledFileName = programName + ".o"; + + try { + fileReaderWriter.writeFile(new File(assemblyFileName, assembly)); + } catch (FileReaderWriterException 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); + } + + // Clean up + try { + fileReaderWriter.deleteFile(assemblyFileName); + } catch (FileReaderWriterException e) { + IO.println("err: Could not delete assembly file: " + e.getMessage()); + } + try { + fileReaderWriter.deleteFile(assembledFileName); + } catch (FileReaderWriterException 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(); + } + } +} |
