summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-13 21:22:32 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-13 21:22:32 -0400
commit949f13f09d2fe8df841ab05dff271f46f9a55bf9 (patch)
treec9bf65495bc14ddbf816038bdd99981d7bb8f670 /io.c
migrate to gitlab
Diffstat (limited to 'io.c')
-rw-r--r--io.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/io.c b/io.c
new file mode 100644
index 0000000..8573a92
--- /dev/null
+++ b/io.c
@@ -0,0 +1,163 @@
+/*
+ * UNG's Not GNU
+ *
+ * Copyright (c) 2011-2017, Jakob Kaivo <jkk@ung.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include "ed.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <search.h>
+
+void ed_edit(intmax_t start, intmax_t end, const char *arg)
+{
+ if (ed_state.dirty && ed_state.lastcmd != 'e') {
+ ed_error("The current file has not been saved");
+ return;
+ }
+
+ ed_Edit(start, end, arg);
+}
+
+void ed_Edit(intmax_t start, intmax_t end, const char *arg)
+{
+ struct ed_line *cursor = ed_state.head;
+ while (cursor) {
+ cursor = cursor->next;
+ remque(cursor->prev);
+ }
+ ed_state.nlines = 0;
+ ed_state.dirty = false;
+
+ if (strlen(arg) > 0) {
+ if (ed_state.filename) {
+ free(ed_state.filename);
+ }
+ ed_state.filename = strdup(arg);
+ }
+
+ ed_state.current = NULL;
+ ed_state.tail = NULL;
+ ed_state.head = NULL;
+
+ ed_read(start, end, arg);
+
+ ed_state.current = ed_state.tail;
+ ed_state.line = ed_state.nlines;
+}
+
+void ed_print(intmax_t start, intmax_t end, const char *arg)
+{
+ fputs(ed_state.current->text, stdout);
+}
+
+void ed_quit(intmax_t start, intmax_t end, const char *arg)
+{
+ if (ed_state.dirty && ed_state.lastcmd != 'q') {
+ ed_error("The current file has not been saved");
+ return;
+ }
+ ed_Quit(start, end, arg);
+}
+
+void ed_Quit(intmax_t start, intmax_t end, const char *arg)
+{
+ exit(0);
+}
+
+void ed_read(intmax_t start, intmax_t end, const char *arg)
+{
+ intmax_t total = 0;
+ FILE *f = NULL;
+
+ char *file = ed_state.filename;
+ if (strlen(arg) > 0) {
+ file = (char*)arg;
+ }
+
+ if (file[0] == '!') {
+ f = popen(file + 1, "r");
+ } else {
+ f = fopen(file, "r");
+ }
+
+ if (f == NULL) {
+ ed_error("Couldn't open %s: %s", ed_state.filename, strerror(errno));
+ return;
+ }
+
+ while (!feof(f)) {
+ struct ed_line *line = calloc(1, sizeof(*line));
+ if (line == NULL) {
+ ed_error("Out of memory");
+ return;
+ }
+
+ size_t n = 0;
+ total += getline(&(line->text), &n, f);
+
+ ed_state.nlines++;
+ insque(line, ed_state.current);
+ ed_state.current = line;
+
+ if (line->prev == NULL) {
+ ed_state.head = line;
+ }
+ }
+
+ if (file[0] == '!') {
+ pclose(f);
+ } else {
+ fclose(f);
+ }
+
+ if (!ed_state.suppress) {
+ printf("%"PRIdMAX"\n", total);
+ }
+}
+
+void ed_write(intmax_t start, intmax_t end, const char *arg)
+{
+ intmax_t total = 0;
+ FILE *f = NULL;
+
+ char *file = ed_state.filename;
+ if (strlen(arg) > 0) {
+ file = (char*)arg;
+ }
+
+ if (file[0] == '!') {
+ f = popen(file + 1, "w");
+ } else {
+ f = fopen(file, "w");
+ }
+
+ if (f == NULL) {
+ ed_error("Couldn't open %s: %s", ed_state.filename, strerror(errno));
+ return;
+ }
+
+ for (struct ed_line *cursor = ed_state.head; cursor; cursor = cursor->next) {
+ fputs(cursor->text, f);
+ total += strlen(cursor->text);
+ }
+
+ if (!ed_state.suppress) {
+ printf("%"PRIdMAX"\n", total);
+ }
+}