From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 362 invoked from network); 30 Dec 1996 04:00:18 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by coral.primenet.com.au with SMTP; 30 Dec 1996 04:00:18 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id WAA17207; Sun, 29 Dec 1996 22:45:30 -0500 (EST) Resent-Date: Sun, 29 Dec 1996 22:45:30 -0500 (EST) From: Zoltan Hidvegi Message-Id: <199612300339.EAA04022@hzoli.ppp.cs.elte.hu> Subject: Long directories in prompt To: zsh-workers@math.gatech.edu (Zsh hacking and development) Date: Mon, 30 Dec 1996 04:39:51 +0100 (MET) X-Mailer: ELM [version 2.4ME+ PL17 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"Tq1qU3.0.oC4.Qhpno"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2665 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu %~, %d, %c, %. and %C prompt escapes caused coredump when pwd was longer than PATH_MAX. This patch fixes putpromptchar() but still there is a bug in finddir() causing coredumps when %~ is used. This is for zsh-3.1.0 only. Zoltan *** Src/prompt.c 1996/12/21 02:35:32 3.1.1.0 --- Src/prompt.c 1996/12/30 03:20:14 *************** *** 293,300 **** switch (*fm) { case '~': if ((nd = finddir(pwd))) { ! sprintf(buf3, "~%s%s", nd->nam, pwd + strlen(nd->dir)); ! stradd(buf3); break; } case 'd': --- 293,301 ---- switch (*fm) { case '~': if ((nd = finddir(pwd))) { ! stradd("~"); ! stradd(nd->nam); ! stradd(pwd + strlen(nd->dir)); break; } case 'd': *************** *** 303,333 **** break; case 'c': case '.': ! if ((nd = finddir(pwd))) ! sprintf(buf3, "~%s%s", nd->nam, pwd + strlen(nd->dir)); ! else ! strcpy(buf3, pwd); ! if (!arg) ! arg++; ! for (ss = buf3 + strlen(buf3); ss > buf3; ss--) ! if (*ss == '/' && !--arg) { ss++; ! break; ! } ! if (*ss == '/' && ss[1] && (ss != buf3)) ! ss++; ! stradd(ss); ! break; case 'C': - strcpy(buf3, pwd); if (!arg) arg++; ! for (ss = buf3 + strlen(buf3); ss > buf3; ss--) if (*ss == '/' && !--arg) { ss++; break; } ! if (*ss == '/' && ss[1] && (ss != buf3)) ss++; stradd(ss); break; --- 304,340 ---- break; case 'c': case '.': ! { ! char *t; ! ! if ((nd = finddir(pwd))) ! t = pwd + strlen(nd->dir); ! else ! t = pwd; ! if (!arg) ! arg++; ! for (ss = t + strlen(t); ss > t; ss--) ! if (*ss == '/' && !--arg) { ! ss++; ! break; ! } ! if (nd && ss == t && (*ss != '/' || arg > 1)) { ! stradd("~"); ! stradd(nd->nam); ! } else if (*ss == '/' && ss[1] && (ss != pwd)) ss++; ! stradd(ss); ! break; ! } case 'C': if (!arg) arg++; ! for (ss = pwd + strlen(pwd); ss > pwd; ss--) if (*ss == '/' && !--arg) { ss++; break; } ! if (*ss == '/' && ss[1] && (ss != pwd)) ss++; stradd(ss); break;