static char* getcopy(void) { if (ed.addr1 > ed.addr2) return 0; return lineget((ed.addr1++)->offset); }
static void global(int sense, int query) { register char* s; register int c; register Line_t* a1; if (ed.global) error(2, "recursive global not allowed"); setwide(); squeeze(ed.dol > ed.zero); compile(); if (query) newline(); else { s = getrec(ed.buffer.global, '\n', REC_SPLICE|REC_TERMINATE); if (s[0] == '\n' && !s[1]) sfputr(ed.buffer.global, "p\n", 0); } for (a1 = ed.zero; a1 <= ed.dol; a1++) { a1->offset &= ~LINE_GLOBAL; if (a1 >= ed.addr1 && a1 <= ed.addr2 && execute(a1, 0) == sense) a1->offset |= LINE_GLOBAL; } /* special case: g/.../d (avoid n^2 algorithm) */ if (!query && s[0] == 'd' && s[1] == '\n' && !s[2]) gdelete(); else { for (a1 = ed.zero; a1 <= ed.dol; a1++) { if (a1->offset & LINE_GLOBAL) { a1->offset &= ~LINE_GLOBAL; ed.dot = a1; if (query) { putrec(lineget(a1->offset)); if ((c = getchr()) == EOF) break; else if (c == '\n') continue; else if (c == '&') { newline(); if (!*(ed.global = sfstrbase(ed.buffer.query))) error(2, "no saved command"); } else { ed.peekc = c; ed.global = getrec(ed.buffer.query, '\n', REC_TERMINATE); } } else ed.global = s; commands(); a1 = ed.zero; } } } }
int main() { int length; char string[MAXLEN]; length = lineget(string); reverse(string,length); printf("%s\n",length,string); return 0; }
static void print(void) { register Line_t* a1; nonzero(); a1 = ed.addr1; do { if (ed.print & REG_SUB_NUMBER) sfprintf(ed.msg, "%d\t", a1 - ed.zero); putrec(lineget((a1++)->offset)); } while (a1 <= ed.addr2); ed.dot = ed.addr2; ed.print = 0; }
static void join(void) { register Line_t* a1; char* s; nonzero(); sfstrseek(ed.buffer.work, 0, SEEK_SET); for (a1 = ed.addr1; a1 <= ed.addr2;) sfputr(ed.buffer.work, lineget((a1++)->offset), -1); a1 = ed.dot = ed.addr1; if (!(s = sfstruse(ed.buffer.work))) error(ERROR_SYSTEM|3, "out of space"); replace(a1, s); if (a1 < ed.addr2) rdelete(a1 + 1, ed.addr2); }
static void putfile(void) { register Line_t* a1; register int n; ed.bytes = 0; ed.lines = 0; a1 = ed.addr1; do { if ((n = sfputr(ed.iop, lineget((a1++)->offset), '\n')) < 0) error(ERROR_SYSTEM|2, "write error"); ed.bytes += n; ed.lines++; } while (a1 <= ed.addr2); if (sfsync(ed.iop)) error(ERROR_SYSTEM|2, "write error"); }
static int execute(Line_t* addr, regflags_t flags) { register char* s; register int c; trap(); if (!addr) s = CUR(); else if (addr == ed.zero) return 0; else { s = lineget(addr->offset); SET(s, 0); } if (c = regexec(&ed.re, s, elementsof(ed.match), ed.match, ed.reflags|flags)) { if (c != REG_NOMATCH) regfatal(&ed.re, 2, c); return 0; } return 1; }