mirror of https://github.com/leahneukirchen/mblaze
add mseq (replaces next)
parent
409c80e98f
commit
aa62c73700
@ -0,0 +1,172 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
|
||||
char *
|
||||
seq_open(char *file)
|
||||
{
|
||||
int fd;
|
||||
struct stat st;
|
||||
|
||||
// env $SEQ or something
|
||||
if (!file)
|
||||
file = "map";
|
||||
fd = open(file, O_RDONLY);
|
||||
if (!fd)
|
||||
return 0;
|
||||
|
||||
fstat(fd, &st);
|
||||
char *map = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
|
||||
if (map == MAP_FAILED)
|
||||
return 0;
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
static const char *
|
||||
readlin(const char *p)
|
||||
{
|
||||
static char b[PATH_MAX];
|
||||
int r = readlink(p, b, sizeof b - 1);
|
||||
if (r < 0)
|
||||
r = 0;
|
||||
b[r] = 0;
|
||||
return b;
|
||||
}
|
||||
|
||||
char *
|
||||
parse_relnum(char *a, long cur, long last, long *out)
|
||||
{
|
||||
long base;
|
||||
char *b;
|
||||
|
||||
if (strcmp(a, "+") == 0)
|
||||
a = ".+1";
|
||||
else if (strcmp(a, "-") == 0)
|
||||
a = ".-1";
|
||||
else if (strcmp(a, "$") == 0)
|
||||
a = "-1";
|
||||
|
||||
if (*a == '.') {
|
||||
a++;
|
||||
base = cur;
|
||||
} else if (*a == '-') {
|
||||
base = last + 1;
|
||||
} else {
|
||||
base = 0;
|
||||
}
|
||||
errno = 0;
|
||||
long d = strtol(a, &b, 10);
|
||||
if (errno != 0) {
|
||||
perror("strtol");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
*out = base + d;
|
||||
if (*out <= 0)
|
||||
*out = 1;
|
||||
if (*out > last)
|
||||
*out = last;
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char *map = seq_open(0);
|
||||
if (!map)
|
||||
return 1;
|
||||
|
||||
long lines;
|
||||
long cur = 0;
|
||||
|
||||
const char *curfile = readlin("map.cur");
|
||||
char *curpath;
|
||||
|
||||
char *s, *t;
|
||||
for (s = map, lines = 0; s; s = t) {
|
||||
t = strchr(s+1, '\n');
|
||||
if (!t)
|
||||
break;
|
||||
s++;
|
||||
// printf("{%.*s}\n", t-s, s);
|
||||
lines++;
|
||||
// XXX compare modulo whitespace
|
||||
if (!cur &&
|
||||
strncmp(s, curfile, strlen(curfile)) == 0 &&
|
||||
s[strlen(curfile)] == '\n')
|
||||
cur = lines;
|
||||
}
|
||||
lines--;
|
||||
|
||||
long i, start, stop;
|
||||
for (i = 1; i < argc; i++) {
|
||||
char *a = argv[i];
|
||||
start = stop = 0;
|
||||
|
||||
while (*a && *a != ':') {
|
||||
char *b = parse_relnum(a, cur, lines, &start);
|
||||
if (a == b) {
|
||||
printf("huh\n");
|
||||
exit(1);
|
||||
}
|
||||
a = b;
|
||||
}
|
||||
if (*a == ':') {
|
||||
a++;
|
||||
if (!*a) {
|
||||
stop = lines;
|
||||
} else {
|
||||
char *b = parse_relnum(a, cur, lines, &stop);
|
||||
if (a == b) {
|
||||
printf("huh\n");
|
||||
exit(1);
|
||||
}
|
||||
a = b;
|
||||
}
|
||||
} else if (!*a) {
|
||||
stop = start;
|
||||
} else {
|
||||
printf("huh\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
long line;
|
||||
for (s = map, line = 0; s; s = t) {
|
||||
t = strchr(s+1, '\n');
|
||||
if (!t)
|
||||
break;
|
||||
s++;
|
||||
line++;
|
||||
|
||||
if (line >= start && line <= stop) {
|
||||
fwrite(s, 1, t-s, stdout);
|
||||
putchar('\n');
|
||||
cur = line;
|
||||
curpath = s;
|
||||
while (*curpath == ' ')
|
||||
curpath++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
char *e = strchr(curpath, '\n');
|
||||
unlink("map.cur-");
|
||||
symlink(strndup(curpath, e-curpath), "map.cur-");
|
||||
rename("map.cur-", "map.cur");
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int fd;
|
||||
struct stat st;
|
||||
|
||||
fd = open("map", O_RDONLY);
|
||||
if (!fd)
|
||||
exit(101);
|
||||
|
||||
fstat(fd, &st);
|
||||
char *map = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
if (map == MAP_FAILED)
|
||||
exit(102);
|
||||
|
||||
char *s;
|
||||
char *arg;
|
||||
if (argc > 2)
|
||||
arg = argv[2];
|
||||
else
|
||||
arg = "+1";
|
||||
|
||||
if (argc <= 1 || !argv[1][0]) {
|
||||
// default to first line
|
||||
arg = "1";
|
||||
}
|
||||
|
||||
if (*arg == '+' || *arg == '-') {
|
||||
s = strstr(map, argv[1]);
|
||||
int a = atoi(arg);
|
||||
if (!s) {
|
||||
s = map;
|
||||
a = 0;
|
||||
}
|
||||
if (a > 0) {
|
||||
while (a-- > 0) {
|
||||
while (*s && *s != '\n')
|
||||
s++;
|
||||
s++;
|
||||
}
|
||||
} else {
|
||||
while (a++ <= 0 && map < s) {
|
||||
s--;
|
||||
while (map < s && *s != '\n')
|
||||
s--;
|
||||
}
|
||||
if (map < s && *s == '\n')
|
||||
s++;
|
||||
}
|
||||
} else {
|
||||
int a = atoi(arg);
|
||||
s = map;
|
||||
while (--a > 0) {
|
||||
char *n = strchr(s+1, '\n');
|
||||
if (!n)
|
||||
break;
|
||||
s = n;
|
||||
}
|
||||
if (s && *s)
|
||||
s++;
|
||||
}
|
||||
char *t = s;
|
||||
while (*t && *t != '\n')
|
||||
t++;
|
||||
if (!*t)
|
||||
return 1;
|
||||
t++;
|
||||
if (write(1, s, t-s) <= 0)
|
||||
return 2;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue