79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
#define _DEFAULT_SOURCE
|
|
#define _BSD_SOURCE
|
|
#define _GNU_SOURCE
|
|
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/types.h>
|
|
#include <termios.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
|
|
#include "fn.h"
|
|
#include "file.h"
|
|
#include "hl.h"
|
|
#include "terminal.h"
|
|
#include "row.h"
|
|
|
|
void editorOpen(char *filename) {
|
|
free(E.filename);
|
|
// TODO: Maybe replace strdup (string.h), becaus it is no strict posix c lib
|
|
E.filename = strdup(filename);
|
|
|
|
editorSelectSyntaxHighlight();
|
|
|
|
FILE *fp = fopen(filename, "r");
|
|
if (!fp) die("fopen");
|
|
|
|
char *line = NULL;
|
|
size_t linecap = 0;
|
|
ssize_t linelen;
|
|
while ((linelen = getline(&line, &linecap, fp)) != -1) {
|
|
while (linelen > 0 && (line[linelen - 1] == '\n' ||
|
|
line[linelen - 1] == '\r'))
|
|
linelen--;
|
|
editorInsertRow(E.numrows, line, linelen);
|
|
}
|
|
free(line);
|
|
fclose(fp);
|
|
E.dirty = 0;
|
|
}
|
|
|
|
void editorSave() {
|
|
if (E.filename == NULL) {
|
|
E.filename = editorPrompt("Save as: %s (ESC to cancel)", NULL);
|
|
if (E.filename == NULL) {
|
|
editorSetStatusMessage("Save aborted");
|
|
return;
|
|
}
|
|
}
|
|
|
|
int len;
|
|
|
|
char *buf = editorRowsToString(&len);
|
|
|
|
int fd = open(E.filename, O_RDWR | O_CREAT, 0644);
|
|
if (fd != -1) {
|
|
if (ftruncate(fd, len) != -1) {
|
|
if (write(fd, buf, len) == len) {
|
|
close(fd);
|
|
free(buf);
|
|
E.dirty = 0;
|
|
editorSetStatusMessage("%d bytes written to disk", len);
|
|
return;
|
|
}
|
|
editorSelectSyntaxHighlight();
|
|
}
|
|
close(fd);
|
|
}
|
|
|
|
free(buf);
|
|
editorSetStatusMessage("Can't save! I/O error: %s", strerror(errno));
|
|
}
|