diff options
author | jnweiger <jnweiger> | 2005-12-16 18:37:23 +0000 |
---|---|---|
committer | jnweiger <jnweiger> | 2005-12-16 18:37:23 +0000 |
commit | b3e7420c1fe103e5a3d71c3b74cf0843bee23317 (patch) | |
tree | b4103eac70f404e174ddd795a8702626a5c6793f /src/fileio.c | |
parent | 522f11a34fb4e4efea730fd937837a156cc5feb0 (diff) | |
download | screen-b3e7420c1fe103e5a3d71c3b74cf0843bee23317.tar.gz |
old version screen-3.9.11 Feb 14 2002
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 116 |
1 files changed, 85 insertions, 31 deletions
diff --git a/src/fileio.c b/src/fileio.c index fa27142..ad76886 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1993-2000 +/* Copyright (c) 1993-2002 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann @@ -55,8 +55,8 @@ static char *CatExtra __P((char *, char *)); static char *findrcfile __P((char *)); -static FILE *fp = NULL; -char *rc_name; +char *rc_name = ""; +int rc_recursion = 0; static char * CatExtra(str1, str2) @@ -95,32 +95,36 @@ static char * findrcfile(rcfile) char *rcfile; { - static char buf[256]; - char *rc, *p; + char buf[256]; + char *p; if (rcfile) { - rc = SaveStr(rcfile); + char *rcend = rindex(rc_name, '/'); + if (*rcfile != '/' && rcend && (rcend - rc_name) + strlen(rcfile) + 2 < sizeof(buf)) + { + strncpy(buf, rc_name, rcend - rc_name + 1); + strcpy(buf + (rcend - rc_name) + 1, rcfile); + if (access(buf, R_OK) == 0) + return SaveStr(buf); + } debug1("findrcfile: you specified '%s'\n", rcfile); + return SaveStr(rcfile); + } + debug("findrcfile: you specified nothing...\n"); + if ((p = getenv("SCREENRC")) != NULL && *p != '\0') + { + debug1(" $SCREENRC has: '%s'\n", p); + return SaveStr(p); } else { - debug("findrcfile: you specified nothing...\n"); - if ((p = getenv("SCREENRC")) != NULL && *p != '\0') - { - debug1(" $SCREENRC has: '%s'\n", p); - rc = SaveStr(p); - } - else - { - debug(" ...nothing in $SCREENRC, defaulting $HOME/.screenrc\n"); - if (strlen(home) > sizeof(buf) - 12) - Panic(0, "Rc: home too large"); - sprintf(buf, "%s/.screenrc", home); - rc = SaveStr(buf); - } + debug(" ...nothing in $SCREENRC, defaulting $HOME/.screenrc\n"); + if (strlen(home) > sizeof(buf) - 12) + Panic(0, "Rc: home too large"); + sprintf(buf, "%s/.screenrc", home); + return SaveStr(buf); } - return rc; } /* @@ -136,6 +140,8 @@ char *rcfilename; register char *p, *cp; char buf[2048]; char *args[MAXARGS]; + FILE *fp; + char *oldrc_name = rc_name; /* always fix termcap/info capabilities */ extra_incap = CatExtra("TF", extra_incap); @@ -148,7 +154,7 @@ char *rcfilename; if ((fp = secfopen(rc_name, "r")) == NULL) { - if (RcFileName && strcmp(RcFileName, rc_name) == 0) + if (!rc_recursion && RcFileName && !strcmp(RcFileName, rc_name)) { /* * User explicitly gave us that name, @@ -161,7 +167,7 @@ char *rcfilename; } debug1("StartRc: '%s' no good. ignored\n", rc_name); Free(rc_name); - rc_name = ""; + rc_name = oldrc_name; return; } while (fgets(buf, sizeof buf, fp) != NULL) @@ -230,10 +236,19 @@ char *rcfilename; if (argc == 4) extra_outcap = CatExtra(args[3], extra_outcap); } + else if (!strcmp(args[0], "source")) + { + if (rc_recursion <= 10) + { + rc_recursion++; + StartRc(args[1]); + rc_recursion--; + } + } } fclose(fp); Free(rc_name); - rc_name = ""; + rc_name = oldrc_name; } void @@ -241,12 +256,16 @@ FinishRc(rcfilename) char *rcfilename; { char buf[2048]; + FILE *fp; + char *oldrc_name = rc_name; rc_name = findrcfile(rcfilename); if ((fp = secfopen(rc_name, "r")) == NULL) { - if (RcFileName && strcmp(RcFileName, rc_name) == 0) + if (rc_recursion) + Msg(errno, "%s: source %s", oldrc_name, rc_name); + else if (RcFileName && !strcmp(RcFileName, rc_name)) { /* * User explicitly gave us that name, @@ -259,7 +278,7 @@ char *rcfilename; } debug1("FinishRc: '%s' no good. ignored\n", rc_name); Free(rc_name); - rc_name = ""; + rc_name = oldrc_name; return; } @@ -268,9 +287,24 @@ char *rcfilename; RcLine(buf); (void) fclose(fp); Free(rc_name); - rc_name = ""; + rc_name = oldrc_name; +} + +void +do_source(rcfilename) +char *rcfilename; +{ + if (rc_recursion > 10) + { + Msg(0, "%s: source: recursion limit reached", rc_name); + return; + } + rc_recursion++; + FinishRc(rcfilename); + rc_recursion--; } + /* * Running a Command Line in the environment determined by the display. * The fore window is taken from the display as well as the user. @@ -325,6 +359,7 @@ int dump; * #ifdef COPY_PASTE * dump==2: BUFFERFILE * #endif COPY_PASTE + * dump==1: scrollback, */ register int i, j, k; register char *p; @@ -358,8 +393,11 @@ int dump; } break; case DUMP_HARDCOPY: + case DUMP_SCROLLBACK: if (fn == 0) { + if (fore == 0) + return; if (hardcopydir && *hardcopydir && strlen(hardcopydir) < sizeof(fnbuf) - 21) sprintf(fnbuf, "%s/hardcopy.%d", hardcopydir, fore->w_number); else @@ -433,6 +471,9 @@ int dump; switch (dump) { case DUMP_HARDCOPY: + case DUMP_SCROLLBACK: + if (!fore) + break; if (*mode == 'a') { putc('>', f); @@ -440,9 +481,21 @@ int dump; putc('=', f); fputs("<\n", f); } + if (dump == DUMP_SCROLLBACK) + { + for (i = 0; i < fore->w_histheight; i++) + { + p = (char *)(WIN(i)->image); + for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--) + ; + for (j = 0; j <= k; j++) + putc(p[j], f); + putc('\n', f); + } + } for (i = 0; i < fore->w_height; i++) { - p = fore->w_mlines[i].image; + p = (char *)fore->w_mlines[i].image; for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--) ; for (j = 0; j <= k; j++) @@ -459,8 +512,8 @@ int dump; break; #ifdef COPY_PASTE case DUMP_EXCHANGE: - p = user->u_copybuffer; - for (i = user->u_copylen; i-- > 0; p++) + p = user->u_plop.buf; + for (i = user->u_plop.len; i-- > 0; p++) if (*p == '\r' && (i == 0 || p[1] != '\n')) putc('\n', f); else @@ -474,7 +527,7 @@ int dump; } if (UserStatus() <= 0) Msg(0, "Cannot open \"%s\"", fn); - else + else if (display && !*rc_name) { switch (dump) { @@ -482,6 +535,7 @@ int dump; Msg(0, "Termcap entry written to \"%s\".", fn); break; case DUMP_HARDCOPY: + case DUMP_SCROLLBACK: Msg(0, "Screen image %s to \"%s\".", (*mode == 'a') ? "appended" : "written", fn); break; |