13b6eaa7bSAndrey A. Chernov /* $Header: /src/pub/tcsh/tc.prompt.c,v 3.41 2000/11/11 23:03:39 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * tc.prompt.c: Prompt printing stuff 4c80476e4SDavid E. O'Brien */ 5c80476e4SDavid E. O'Brien /*- 6c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 7c80476e4SDavid E. O'Brien * All rights reserved. 8c80476e4SDavid E. O'Brien * 9c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 10c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 11c80476e4SDavid E. O'Brien * are met: 12c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 13c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 14c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 16c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 17c80476e4SDavid E. O'Brien * 3. All advertising materials mentioning features or use of this software 18c80476e4SDavid E. O'Brien * must display the following acknowledgement: 19c80476e4SDavid E. O'Brien * This product includes software developed by the University of 20c80476e4SDavid E. O'Brien * California, Berkeley and its contributors. 21c80476e4SDavid E. O'Brien * 4. Neither the name of the University nor the names of its contributors 22c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 23c80476e4SDavid E. O'Brien * without specific prior written permission. 24c80476e4SDavid E. O'Brien * 25c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35c80476e4SDavid E. O'Brien * SUCH DAMAGE. 36c80476e4SDavid E. O'Brien */ 37c80476e4SDavid E. O'Brien #include "sh.h" 38c80476e4SDavid E. O'Brien 393b6eaa7bSAndrey A. Chernov RCSID("$Id: tc.prompt.c,v 3.41 2000/11/11 23:03:39 christos Exp $") 40c80476e4SDavid E. O'Brien 41c80476e4SDavid E. O'Brien #include "ed.h" 42c80476e4SDavid E. O'Brien #include "tw.h" 43c80476e4SDavid E. O'Brien 44c80476e4SDavid E. O'Brien /* 45c80476e4SDavid E. O'Brien * kfk 21oct1983 -- add @ (time) and / ($cwd) in prompt. 46c80476e4SDavid E. O'Brien * PWP 4/27/87 -- rearange for tcsh. 47c80476e4SDavid E. O'Brien * mrdch@com.tau.edu.il 6/26/89 - added ~, T and .# - rearanged to switch() 48c80476e4SDavid E. O'Brien * instead of if/elseif 49c80476e4SDavid E. O'Brien * Luke Mewburn, <lukem@cs.rmit.edu.au> 50c80476e4SDavid E. O'Brien * 6-Sep-91 changed date format 51c80476e4SDavid E. O'Brien * 16-Feb-94 rewrote directory prompt code, added $ellipsis 52c80476e4SDavid E. O'Brien * 29-Dec-96 added rprompt support 53c80476e4SDavid E. O'Brien */ 54c80476e4SDavid E. O'Brien 55c80476e4SDavid E. O'Brien static char *month_list[12]; 56c80476e4SDavid E. O'Brien static char *day_list[7]; 57c80476e4SDavid E. O'Brien 58c80476e4SDavid E. O'Brien void 59c80476e4SDavid E. O'Brien dateinit() 60c80476e4SDavid E. O'Brien { 61c80476e4SDavid E. O'Brien #ifdef notyet 62c80476e4SDavid E. O'Brien int i; 63c80476e4SDavid E. O'Brien 64c80476e4SDavid E. O'Brien setlocale(LC_TIME, ""); 65c80476e4SDavid E. O'Brien 66c80476e4SDavid E. O'Brien for (i = 0; i < 12; i++) 67c80476e4SDavid E. O'Brien xfree((ptr_t) month_list[i]); 68c80476e4SDavid E. O'Brien month_list[0] = strsave(_time_info->abbrev_month[0]); 69c80476e4SDavid E. O'Brien month_list[1] = strsave(_time_info->abbrev_month[1]); 70c80476e4SDavid E. O'Brien month_list[2] = strsave(_time_info->abbrev_month[2]); 71c80476e4SDavid E. O'Brien month_list[3] = strsave(_time_info->abbrev_month[3]); 72c80476e4SDavid E. O'Brien month_list[4] = strsave(_time_info->abbrev_month[4]); 73c80476e4SDavid E. O'Brien month_list[5] = strsave(_time_info->abbrev_month[5]); 74c80476e4SDavid E. O'Brien month_list[6] = strsave(_time_info->abbrev_month[6]); 75c80476e4SDavid E. O'Brien month_list[7] = strsave(_time_info->abbrev_month[7]); 76c80476e4SDavid E. O'Brien month_list[8] = strsave(_time_info->abbrev_month[8]); 77c80476e4SDavid E. O'Brien month_list[9] = strsave(_time_info->abbrev_month[9]); 78c80476e4SDavid E. O'Brien month_list[10] = strsave(_time_info->abbrev_month[10]); 79c80476e4SDavid E. O'Brien month_list[11] = strsave(_time_info->abbrev_month[11]); 80c80476e4SDavid E. O'Brien 81c80476e4SDavid E. O'Brien for (i = 0; i < 7; i++) 82c80476e4SDavid E. O'Brien xfree((ptr_t) day_list[i]); 83c80476e4SDavid E. O'Brien day_list[0] = strsave(_time_info->abbrev_wkday[0]); 84c80476e4SDavid E. O'Brien day_list[1] = strsave(_time_info->abbrev_wkday[1]); 85c80476e4SDavid E. O'Brien day_list[2] = strsave(_time_info->abbrev_wkday[2]); 86c80476e4SDavid E. O'Brien day_list[3] = strsave(_time_info->abbrev_wkday[3]); 87c80476e4SDavid E. O'Brien day_list[4] = strsave(_time_info->abbrev_wkday[4]); 88c80476e4SDavid E. O'Brien day_list[5] = strsave(_time_info->abbrev_wkday[5]); 89c80476e4SDavid E. O'Brien day_list[6] = strsave(_time_info->abbrev_wkday[6]); 90c80476e4SDavid E. O'Brien #else 91c80476e4SDavid E. O'Brien month_list[0] = "Jan"; 92c80476e4SDavid E. O'Brien month_list[1] = "Feb"; 93c80476e4SDavid E. O'Brien month_list[2] = "Mar"; 94c80476e4SDavid E. O'Brien month_list[3] = "Apr"; 95c80476e4SDavid E. O'Brien month_list[4] = "May"; 96c80476e4SDavid E. O'Brien month_list[5] = "Jun"; 97c80476e4SDavid E. O'Brien month_list[6] = "Jul"; 98c80476e4SDavid E. O'Brien month_list[7] = "Aug"; 99c80476e4SDavid E. O'Brien month_list[8] = "Sep"; 100c80476e4SDavid E. O'Brien month_list[9] = "Oct"; 101c80476e4SDavid E. O'Brien month_list[10] = "Nov"; 102c80476e4SDavid E. O'Brien month_list[11] = "Dec"; 103c80476e4SDavid E. O'Brien 104c80476e4SDavid E. O'Brien day_list[0] = "Sun"; 105c80476e4SDavid E. O'Brien day_list[1] = "Mon"; 106c80476e4SDavid E. O'Brien day_list[2] = "Tue"; 107c80476e4SDavid E. O'Brien day_list[3] = "Wed"; 108c80476e4SDavid E. O'Brien day_list[4] = "Thu"; 109c80476e4SDavid E. O'Brien day_list[5] = "Fri"; 110c80476e4SDavid E. O'Brien day_list[6] = "Sat"; 111c80476e4SDavid E. O'Brien #endif 112c80476e4SDavid E. O'Brien } 113c80476e4SDavid E. O'Brien 114c80476e4SDavid E. O'Brien void 115c80476e4SDavid E. O'Brien printprompt(promptno, str) 116c80476e4SDavid E. O'Brien int promptno; 117c80476e4SDavid E. O'Brien char *str; 118c80476e4SDavid E. O'Brien { 119c80476e4SDavid E. O'Brien static Char *ocp = NULL; 120c80476e4SDavid E. O'Brien static char *ostr = NULL; 121c80476e4SDavid E. O'Brien time_t lclock = time(NULL); 122c80476e4SDavid E. O'Brien Char *cp; 123c80476e4SDavid E. O'Brien 124c80476e4SDavid E. O'Brien switch (promptno) { 125c80476e4SDavid E. O'Brien default: 126c80476e4SDavid E. O'Brien case 0: 127c80476e4SDavid E. O'Brien cp = varval(STRprompt); 128c80476e4SDavid E. O'Brien break; 129c80476e4SDavid E. O'Brien case 1: 130c80476e4SDavid E. O'Brien cp = varval(STRprompt2); 131c80476e4SDavid E. O'Brien break; 132c80476e4SDavid E. O'Brien case 2: 133c80476e4SDavid E. O'Brien cp = varval(STRprompt3); 134c80476e4SDavid E. O'Brien break; 135c80476e4SDavid E. O'Brien case 3: 136c80476e4SDavid E. O'Brien if (ocp != NULL) { 137c80476e4SDavid E. O'Brien cp = ocp; 138c80476e4SDavid E. O'Brien str = ostr; 139c80476e4SDavid E. O'Brien } 140c80476e4SDavid E. O'Brien else 141c80476e4SDavid E. O'Brien cp = varval(STRprompt); 142c80476e4SDavid E. O'Brien break; 143c80476e4SDavid E. O'Brien } 144c80476e4SDavid E. O'Brien 145c80476e4SDavid E. O'Brien if (promptno < 2) { 146c80476e4SDavid E. O'Brien ocp = cp; 147c80476e4SDavid E. O'Brien ostr = str; 148c80476e4SDavid E. O'Brien } 149c80476e4SDavid E. O'Brien 150c80476e4SDavid E. O'Brien PromptBuf[0] = '\0'; 151c80476e4SDavid E. O'Brien tprintf(FMT_PROMPT, PromptBuf, cp, 2 * INBUFSIZE - 2, str, lclock, NULL); 152c80476e4SDavid E. O'Brien 153c80476e4SDavid E. O'Brien if (!editing) { 154c80476e4SDavid E. O'Brien for (cp = PromptBuf; *cp ; ) 155c80476e4SDavid E. O'Brien (void) putraw(*cp++); 156c80476e4SDavid E. O'Brien SetAttributes(0); 157c80476e4SDavid E. O'Brien flush(); 158c80476e4SDavid E. O'Brien } 159c80476e4SDavid E. O'Brien 160c80476e4SDavid E. O'Brien RPromptBuf[0] = '\0'; 161c80476e4SDavid E. O'Brien if (promptno == 0) { /* determine rprompt if using main prompt */ 162c80476e4SDavid E. O'Brien cp = varval(STRrprompt); 163c80476e4SDavid E. O'Brien tprintf(FMT_PROMPT, RPromptBuf, cp, INBUFSIZE - 2, NULL, lclock, NULL); 164c80476e4SDavid E. O'Brien 165c80476e4SDavid E. O'Brien /* if not editing, put rprompt after prompt */ 166c80476e4SDavid E. O'Brien if (!editing && RPromptBuf[0] != '\0') { 167c80476e4SDavid E. O'Brien for (cp = RPromptBuf; *cp ; ) 168c80476e4SDavid E. O'Brien (void) putraw(*cp++); 169c80476e4SDavid E. O'Brien SetAttributes(0); 170c80476e4SDavid E. O'Brien putraw(' '); 171c80476e4SDavid E. O'Brien flush(); 172c80476e4SDavid E. O'Brien } 173c80476e4SDavid E. O'Brien } 174c80476e4SDavid E. O'Brien } 175c80476e4SDavid E. O'Brien 176c80476e4SDavid E. O'Brien void 177c80476e4SDavid E. O'Brien tprintf(what, buf, fmt, siz, str, tim, info) 178c80476e4SDavid E. O'Brien int what; 179c80476e4SDavid E. O'Brien Char *buf; 180c80476e4SDavid E. O'Brien const Char *fmt; 181c80476e4SDavid E. O'Brien size_t siz; 182c80476e4SDavid E. O'Brien char *str; 183c80476e4SDavid E. O'Brien time_t tim; 184c80476e4SDavid E. O'Brien ptr_t info; 185c80476e4SDavid E. O'Brien { 186c80476e4SDavid E. O'Brien Char *z, *q; 187c80476e4SDavid E. O'Brien Char attributes = 0; 188c80476e4SDavid E. O'Brien static int print_prompt_did_ding = 0; 189c80476e4SDavid E. O'Brien Char buff[BUFSIZE]; 190959f4c6cSDavid E. O'Brien /* Need to be unsigned to avoid sign extension */ 191959f4c6cSDavid E. O'Brien const unsigned char *cz; 192959f4c6cSDavid E. O'Brien unsigned char cbuff[BUFSIZE]; 193c80476e4SDavid E. O'Brien 194c80476e4SDavid E. O'Brien Char *p = buf; 195c80476e4SDavid E. O'Brien Char *ep = &p[siz]; 196c80476e4SDavid E. O'Brien const Char *cp = fmt; 197c80476e4SDavid E. O'Brien Char Scp; 198c80476e4SDavid E. O'Brien struct tm *t = localtime(&tim); 199c80476e4SDavid E. O'Brien 200c80476e4SDavid E. O'Brien /* prompt stuff */ 201c80476e4SDavid E. O'Brien static Char *olddir = NULL, *olduser = NULL; 202c80476e4SDavid E. O'Brien extern int tlength; /* cache cleared */ 203c80476e4SDavid E. O'Brien int updirs, sz; 204c80476e4SDavid E. O'Brien size_t pdirs; 205c80476e4SDavid E. O'Brien 206c80476e4SDavid E. O'Brien for (; *cp; cp++) { 207c80476e4SDavid E. O'Brien if (p >= ep) 208c80476e4SDavid E. O'Brien break; 2098e66bd9eSDavid E. O'Brien #ifdef DSPMBYTE 2108e66bd9eSDavid E. O'Brien if (Ismbyte1(*cp) && ! (cp[1] == '\0')) 2118e66bd9eSDavid E. O'Brien { 2128e66bd9eSDavid E. O'Brien *p++ = attributes | *cp++; /* normal character */ 2138e66bd9eSDavid E. O'Brien *p++ = attributes | *cp; /* normal character */ 2148e66bd9eSDavid E. O'Brien } 2158e66bd9eSDavid E. O'Brien else 2168e66bd9eSDavid E. O'Brien #endif /* DSPMBYTE */ 217c80476e4SDavid E. O'Brien if ((*cp == '%') && ! (cp[1] == '\0')) { 218c80476e4SDavid E. O'Brien cp++; 219c80476e4SDavid E. O'Brien switch (*cp) { 220c80476e4SDavid E. O'Brien case 'R': 221c80476e4SDavid E. O'Brien if (what == FMT_HISTORY) 222959f4c6cSDavid E. O'Brien fmthist('R', info, (char *) (cz = cbuff), sizeof(cbuff)); 223959f4c6cSDavid E. O'Brien else 224959f4c6cSDavid E. O'Brien cz = (unsigned char *) str; 225078e45bcSDavid E. O'Brien if (cz != NULL) 226959f4c6cSDavid E. O'Brien for (; *cz; *p++ = attributes | *cz++) 227c80476e4SDavid E. O'Brien if (p >= ep) break; 228c80476e4SDavid E. O'Brien break; 229c80476e4SDavid E. O'Brien case '#': 230c80476e4SDavid E. O'Brien *p++ = attributes | ((uid == 0) ? PRCHROOT : PRCH); 231c80476e4SDavid E. O'Brien break; 232c80476e4SDavid E. O'Brien case '!': 233c80476e4SDavid E. O'Brien case 'h': 234c80476e4SDavid E. O'Brien switch (what) { 235c80476e4SDavid E. O'Brien case FMT_HISTORY: 236c80476e4SDavid E. O'Brien fmthist('h', info, (char *) cbuff, sizeof(cbuff)); 237c80476e4SDavid E. O'Brien break; 238c80476e4SDavid E. O'Brien case FMT_SCHED: 239959f4c6cSDavid E. O'Brien (void) xsnprintf((char *) cbuff, sizeof(cbuff), "%d", 240959f4c6cSDavid E. O'Brien *(int *)info); 241c80476e4SDavid E. O'Brien break; 242c80476e4SDavid E. O'Brien default: 243959f4c6cSDavid E. O'Brien (void) xsnprintf((char *) cbuff, sizeof(cbuff), "%d", 244959f4c6cSDavid E. O'Brien eventno + 1); 245c80476e4SDavid E. O'Brien break; 246c80476e4SDavid E. O'Brien } 247c80476e4SDavid E. O'Brien for (cz = cbuff; *cz; *p++ = attributes | *cz++) 248c80476e4SDavid E. O'Brien if (p >= ep) break; 249c80476e4SDavid E. O'Brien break; 250c80476e4SDavid E. O'Brien case 'T': /* 24 hour format */ 251c80476e4SDavid E. O'Brien case '@': 252c80476e4SDavid E. O'Brien case 't': /* 12 hour am/pm format */ 253c80476e4SDavid E. O'Brien case 'p': /* With seconds */ 254c80476e4SDavid E. O'Brien case 'P': 255c80476e4SDavid E. O'Brien { 256c80476e4SDavid E. O'Brien char ampm = 'a'; 257c80476e4SDavid E. O'Brien int hr = t->tm_hour; 258c80476e4SDavid E. O'Brien 259c80476e4SDavid E. O'Brien if (p >= ep - 10) break; 260c80476e4SDavid E. O'Brien 261c80476e4SDavid E. O'Brien /* addition by Hans J. Albertsson */ 262c80476e4SDavid E. O'Brien /* and another adapted from Justin Bur */ 263c80476e4SDavid E. O'Brien if (adrof(STRampm) || (*cp != 'T' && *cp != 'P')) { 264c80476e4SDavid E. O'Brien if (hr >= 12) { 265c80476e4SDavid E. O'Brien if (hr > 12) 266c80476e4SDavid E. O'Brien hr -= 12; 267c80476e4SDavid E. O'Brien ampm = 'p'; 268c80476e4SDavid E. O'Brien } 269c80476e4SDavid E. O'Brien else if (hr == 0) 270c80476e4SDavid E. O'Brien hr = 12; 271c80476e4SDavid E. O'Brien } /* else do a 24 hour clock */ 272c80476e4SDavid E. O'Brien 273c80476e4SDavid E. O'Brien /* "DING!" stuff by Hans also */ 274c80476e4SDavid E. O'Brien if (t->tm_min || print_prompt_did_ding || 275c80476e4SDavid E. O'Brien what != FMT_PROMPT || adrof(STRnoding)) { 276c80476e4SDavid E. O'Brien if (t->tm_min) 277c80476e4SDavid E. O'Brien print_prompt_did_ding = 0; 278c80476e4SDavid E. O'Brien p = Itoa(hr, p, 0, attributes); 279c80476e4SDavid E. O'Brien *p++ = attributes | ':'; 280c80476e4SDavid E. O'Brien p = Itoa(t->tm_min, p, 2, attributes); 281c80476e4SDavid E. O'Brien if (*cp == 'p' || *cp == 'P') { 282c80476e4SDavid E. O'Brien *p++ = attributes | ':'; 283c80476e4SDavid E. O'Brien p = Itoa(t->tm_sec, p, 2, attributes); 284c80476e4SDavid E. O'Brien } 285c80476e4SDavid E. O'Brien if (adrof(STRampm) || (*cp != 'T' && *cp != 'P')) { 286c80476e4SDavid E. O'Brien *p++ = attributes | ampm; 287c80476e4SDavid E. O'Brien *p++ = attributes | 'm'; 288c80476e4SDavid E. O'Brien } 289c80476e4SDavid E. O'Brien } 290c80476e4SDavid E. O'Brien else { /* we need to ding */ 291c80476e4SDavid E. O'Brien int i = 0; 292c80476e4SDavid E. O'Brien 293c80476e4SDavid E. O'Brien (void) Strcpy(buff, STRDING); 294c80476e4SDavid E. O'Brien while (buff[i]) { 295c80476e4SDavid E. O'Brien *p++ = attributes | buff[i++]; 296c80476e4SDavid E. O'Brien } 297c80476e4SDavid E. O'Brien print_prompt_did_ding = 1; 298c80476e4SDavid E. O'Brien } 299c80476e4SDavid E. O'Brien } 300c80476e4SDavid E. O'Brien break; 301c80476e4SDavid E. O'Brien 302c80476e4SDavid E. O'Brien case 'M': 303c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 304c80476e4SDavid E. O'Brien if (what == FMT_WHO) 305959f4c6cSDavid E. O'Brien cz = (unsigned char *) who_info(info, 'M', 306959f4c6cSDavid E. O'Brien (char *) cbuff, sizeof(cbuff)); 307c80476e4SDavid E. O'Brien else 308c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 309959f4c6cSDavid E. O'Brien cz = (unsigned char *) getenv("HOST"); 310c80476e4SDavid E. O'Brien /* 311c80476e4SDavid E. O'Brien * Bug pointed out by Laurent Dami <dami@cui.unige.ch>: don't 312c80476e4SDavid E. O'Brien * derefrence that NULL (if HOST is not set)... 313c80476e4SDavid E. O'Brien */ 314c80476e4SDavid E. O'Brien if (cz != NULL) 315c80476e4SDavid E. O'Brien for (; *cz ; *p++ = attributes | *cz++) 316c80476e4SDavid E. O'Brien if (p >= ep) break; 317c80476e4SDavid E. O'Brien break; 318c80476e4SDavid E. O'Brien 319c80476e4SDavid E. O'Brien case 'm': 320c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 321c80476e4SDavid E. O'Brien if (what == FMT_WHO) 322959f4c6cSDavid E. O'Brien cz = (unsigned char *) who_info(info, 'm', (char *) cbuff, 323959f4c6cSDavid E. O'Brien sizeof(cbuff)); 324c80476e4SDavid E. O'Brien else 325c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 326959f4c6cSDavid E. O'Brien cz = (unsigned char *) getenv("HOST"); 327c80476e4SDavid E. O'Brien 328c80476e4SDavid E. O'Brien if (cz != NULL) 329c80476e4SDavid E. O'Brien for ( ; *cz && (what == FMT_WHO || *cz != '.') 330c80476e4SDavid E. O'Brien ; *p++ = attributes | *cz++ ) 331c80476e4SDavid E. O'Brien if (p >= ep) break; 332c80476e4SDavid E. O'Brien break; 333c80476e4SDavid E. O'Brien 334c80476e4SDavid E. O'Brien /* lukem: new directory prompt code */ 335c80476e4SDavid E. O'Brien case '~': 336c80476e4SDavid E. O'Brien case '/': 337c80476e4SDavid E. O'Brien case '.': 338c80476e4SDavid E. O'Brien case 'c': 339c80476e4SDavid E. O'Brien case 'C': 340c80476e4SDavid E. O'Brien Scp = *cp; 341c80476e4SDavid E. O'Brien if (Scp == 'c') /* store format type (c == .) */ 342c80476e4SDavid E. O'Brien Scp = '.'; 343c80476e4SDavid E. O'Brien if ((z = varval(STRcwd)) == STRNULL) 344c80476e4SDavid E. O'Brien break; /* no cwd, so don't do anything */ 345c80476e4SDavid E. O'Brien 346c80476e4SDavid E. O'Brien /* show ~ whenever possible - a la dirs */ 347c80476e4SDavid E. O'Brien if (Scp == '~' || Scp == '.' ) { 348c80476e4SDavid E. O'Brien if (tlength == 0 || olddir != z) { 349c80476e4SDavid E. O'Brien olddir = z; /* have we changed dir? */ 350c80476e4SDavid E. O'Brien olduser = getusername(&olddir); 351c80476e4SDavid E. O'Brien } 352c80476e4SDavid E. O'Brien if (olduser) 353c80476e4SDavid E. O'Brien z = olddir; 354c80476e4SDavid E. O'Brien } 355c80476e4SDavid E. O'Brien updirs = pdirs = 0; 356c80476e4SDavid E. O'Brien 357c80476e4SDavid E. O'Brien /* option to determine fixed # of dirs from path */ 358c80476e4SDavid E. O'Brien if (Scp == '.' || Scp == 'C') { 359c80476e4SDavid E. O'Brien int skip; 3603b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE 361c80476e4SDavid E. O'Brien if (z[1] == ':') { 362c80476e4SDavid E. O'Brien *p++ = attributes | *z++; 363c80476e4SDavid E. O'Brien *p++ = attributes | *z++; 364c80476e4SDavid E. O'Brien } 365c80476e4SDavid E. O'Brien if (*z == '/' && z[1] == '/') { 366c80476e4SDavid E. O'Brien *p++ = attributes | *z++; 367c80476e4SDavid E. O'Brien *p++ = attributes | *z++; 368c80476e4SDavid E. O'Brien do { 369c80476e4SDavid E. O'Brien *p++ = attributes | *z++; 370c80476e4SDavid E. O'Brien }while(*z != '/'); 371c80476e4SDavid E. O'Brien } 3723b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 373c80476e4SDavid E. O'Brien q = z; 374c80476e4SDavid E. O'Brien while (*z) /* calc # of /'s */ 375c80476e4SDavid E. O'Brien if (*z++ == '/') 376c80476e4SDavid E. O'Brien updirs++; 377c80476e4SDavid E. O'Brien if ((Scp == 'C' && *q != '/')) 378c80476e4SDavid E. O'Brien updirs++; 379c80476e4SDavid E. O'Brien 380c80476e4SDavid E. O'Brien if (cp[1] == '0') { /* print <x> or ... */ 381c80476e4SDavid E. O'Brien pdirs = 1; 382c80476e4SDavid E. O'Brien cp++; 383c80476e4SDavid E. O'Brien } 384c80476e4SDavid E. O'Brien if (cp[1] >= '1' && cp[1] <= '9') { /* calc # to skip */ 385c80476e4SDavid E. O'Brien skip = cp[1] - '0'; 386c80476e4SDavid E. O'Brien cp++; 387c80476e4SDavid E. O'Brien } 388c80476e4SDavid E. O'Brien else 389c80476e4SDavid E. O'Brien skip = 1; 390c80476e4SDavid E. O'Brien 391c80476e4SDavid E. O'Brien updirs -= skip; 392c80476e4SDavid E. O'Brien while (skip-- > 0) { 393c80476e4SDavid E. O'Brien while ((z > q) && (*z != '/')) 394c80476e4SDavid E. O'Brien z--; /* back up */ 395c80476e4SDavid E. O'Brien if (skip && z > q) 396c80476e4SDavid E. O'Brien z--; 397c80476e4SDavid E. O'Brien } 398c80476e4SDavid E. O'Brien if (*z == '/' && z != q) 399c80476e4SDavid E. O'Brien z++; 400c80476e4SDavid E. O'Brien } /* . || C */ 401c80476e4SDavid E. O'Brien 402c80476e4SDavid E. O'Brien /* print ~[user] */ 403c80476e4SDavid E. O'Brien if ((olduser) && ((Scp == '~') || 404c80476e4SDavid E. O'Brien (Scp == '.' && (pdirs || (!pdirs && updirs <= 0))) )) { 405c80476e4SDavid E. O'Brien *p++ = attributes | '~'; 406c80476e4SDavid E. O'Brien if (p >= ep) break; 407c80476e4SDavid E. O'Brien for (q = olduser; *q; *p++ = attributes | *q++) 408c80476e4SDavid E. O'Brien if (p >= ep) break; 409c80476e4SDavid E. O'Brien } 410c80476e4SDavid E. O'Brien 411c80476e4SDavid E. O'Brien /* RWM - tell you how many dirs we've ignored */ 412c80476e4SDavid E. O'Brien /* and add '/' at front of this */ 413c80476e4SDavid E. O'Brien if (updirs > 0 && pdirs) { 414c80476e4SDavid E. O'Brien if (p >= ep - 5) break; 415c80476e4SDavid E. O'Brien if (adrof(STRellipsis)) { 416c80476e4SDavid E. O'Brien *p++ = attributes | '.'; 417c80476e4SDavid E. O'Brien *p++ = attributes | '.'; 418c80476e4SDavid E. O'Brien *p++ = attributes | '.'; 419c80476e4SDavid E. O'Brien } else { 420c80476e4SDavid E. O'Brien *p++ = attributes | '/'; 421c80476e4SDavid E. O'Brien *p++ = attributes | '<'; 422c80476e4SDavid E. O'Brien if (updirs > 9) { 423c80476e4SDavid E. O'Brien *p++ = attributes | '9'; 424c80476e4SDavid E. O'Brien *p++ = attributes | '+'; 425c80476e4SDavid E. O'Brien } else 426c80476e4SDavid E. O'Brien *p++ = attributes | ('0' + updirs); 427c80476e4SDavid E. O'Brien *p++ = attributes | tcsh ? '>' : '%'; 428c80476e4SDavid E. O'Brien } 429c80476e4SDavid E. O'Brien } 430c80476e4SDavid E. O'Brien 431c80476e4SDavid E. O'Brien for (; *z ; *p++ = attributes | *z++) 432c80476e4SDavid E. O'Brien if (p >= ep) break; 433c80476e4SDavid E. O'Brien break; 434c80476e4SDavid E. O'Brien /* lukem: end of new directory prompt code */ 435c80476e4SDavid E. O'Brien 436c80476e4SDavid E. O'Brien case 'n': 437c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 438c80476e4SDavid E. O'Brien if (what == FMT_WHO) { 439959f4c6cSDavid E. O'Brien cz = (unsigned char *) who_info(info, 'n', 440959f4c6cSDavid E. O'Brien (char *) cbuff, sizeof(cbuff)); 441c80476e4SDavid E. O'Brien for (; cz && *cz ; *p++ = attributes | *cz++) 442c80476e4SDavid E. O'Brien if (p >= ep) break; 443c80476e4SDavid E. O'Brien } 444c80476e4SDavid E. O'Brien else 445c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 446c80476e4SDavid E. O'Brien { 447c80476e4SDavid E. O'Brien if ((z = varval(STRuser)) != STRNULL) 448c80476e4SDavid E. O'Brien for (; *z; *p++ = attributes | *z++) 449c80476e4SDavid E. O'Brien if (p >= ep) break; 450c80476e4SDavid E. O'Brien } 451c80476e4SDavid E. O'Brien break; 452c80476e4SDavid E. O'Brien case 'l': 453c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 454c80476e4SDavid E. O'Brien if (what == FMT_WHO) { 455959f4c6cSDavid E. O'Brien cz = (unsigned char *) who_info(info, 'l', 456959f4c6cSDavid E. O'Brien (char *) cbuff, sizeof(cbuff)); 457c80476e4SDavid E. O'Brien for (; cz && *cz ; *p++ = attributes | *cz++) 458c80476e4SDavid E. O'Brien if (p >= ep) break; 459c80476e4SDavid E. O'Brien } 460c80476e4SDavid E. O'Brien else 461c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 462c80476e4SDavid E. O'Brien { 463c80476e4SDavid E. O'Brien if ((z = varval(STRtty)) != STRNULL) 464c80476e4SDavid E. O'Brien for (; *z; *p++ = attributes | *z++) 465c80476e4SDavid E. O'Brien if (p >= ep) break; 466c80476e4SDavid E. O'Brien } 467c80476e4SDavid E. O'Brien break; 468c80476e4SDavid E. O'Brien case 'd': 469959f4c6cSDavid E. O'Brien for (cz = (unsigned char *) day_list[t->tm_wday]; *cz; 470959f4c6cSDavid E. O'Brien *p++ = attributes | *cz++) 471c80476e4SDavid E. O'Brien if (p >= ep) break; 472c80476e4SDavid E. O'Brien break; 473c80476e4SDavid E. O'Brien case 'D': 474c80476e4SDavid E. O'Brien if (p >= ep - 3) break; 475c80476e4SDavid E. O'Brien p = Itoa(t->tm_mday, p, 2, attributes); 476c80476e4SDavid E. O'Brien break; 477c80476e4SDavid E. O'Brien case 'w': 478c80476e4SDavid E. O'Brien if (p >= ep - 5) break; 479959f4c6cSDavid E. O'Brien for (cz = (unsigned char *) month_list[t->tm_mon]; *cz; 480078e45bcSDavid E. O'Brien *p++ = attributes | *cz++) 481959f4c6cSDavid E. O'Brien if (p >= ep) break; 482c80476e4SDavid E. O'Brien break; 483c80476e4SDavid E. O'Brien case 'W': 484c80476e4SDavid E. O'Brien if (p >= ep - 3) break; 485c80476e4SDavid E. O'Brien p = Itoa(t->tm_mon + 1, p, 2, attributes); 486c80476e4SDavid E. O'Brien break; 487c80476e4SDavid E. O'Brien case 'y': 488c80476e4SDavid E. O'Brien if (p >= ep - 3) break; 489c80476e4SDavid E. O'Brien p = Itoa(t->tm_year % 100, p, 2, attributes); 490c80476e4SDavid E. O'Brien break; 491c80476e4SDavid E. O'Brien case 'Y': 492c80476e4SDavid E. O'Brien if (p >= ep - 5) break; 493c80476e4SDavid E. O'Brien p = Itoa(t->tm_year + 1900, p, 4, attributes); 494c80476e4SDavid E. O'Brien break; 495c80476e4SDavid E. O'Brien case 'S': /* start standout */ 496c80476e4SDavid E. O'Brien attributes |= STANDOUT; 497c80476e4SDavid E. O'Brien break; 498c80476e4SDavid E. O'Brien case 'B': /* start bold */ 499c80476e4SDavid E. O'Brien attributes |= BOLD; 500c80476e4SDavid E. O'Brien break; 501c80476e4SDavid E. O'Brien case 'U': /* start underline */ 502c80476e4SDavid E. O'Brien attributes |= UNDER; 503c80476e4SDavid E. O'Brien break; 504c80476e4SDavid E. O'Brien case 's': /* end standout */ 505c80476e4SDavid E. O'Brien attributes &= ~STANDOUT; 506c80476e4SDavid E. O'Brien break; 507c80476e4SDavid E. O'Brien case 'b': /* end bold */ 508c80476e4SDavid E. O'Brien attributes &= ~BOLD; 509c80476e4SDavid E. O'Brien break; 510c80476e4SDavid E. O'Brien case 'u': /* end underline */ 511c80476e4SDavid E. O'Brien attributes &= ~UNDER; 512c80476e4SDavid E. O'Brien break; 513c80476e4SDavid E. O'Brien case 'L': 514c80476e4SDavid E. O'Brien ClearToBottom(); 515c80476e4SDavid E. O'Brien break; 516c80476e4SDavid E. O'Brien case '?': 517c80476e4SDavid E. O'Brien if ((z = varval(STRstatus)) != STRNULL) 518c80476e4SDavid E. O'Brien for (; *z; *p++ = attributes | *z++) 519c80476e4SDavid E. O'Brien if (p >= ep) break; 520c80476e4SDavid E. O'Brien break; 521c80476e4SDavid E. O'Brien case '$': 522c80476e4SDavid E. O'Brien sz = (int) (ep - p); 5233b6eaa7bSAndrey A. Chernov (void) expdollar(&p, &cp, &sz, attributes); 524c80476e4SDavid E. O'Brien break; 525c80476e4SDavid E. O'Brien case '%': 526c80476e4SDavid E. O'Brien *p++ = attributes | '%'; 527c80476e4SDavid E. O'Brien break; 528c80476e4SDavid E. O'Brien case '{': /* literal characters start */ 529c80476e4SDavid E. O'Brien #if LITERAL == 0 530c80476e4SDavid E. O'Brien /* 531c80476e4SDavid E. O'Brien * No literal capability, so skip all chars in the literal 532c80476e4SDavid E. O'Brien * string 533c80476e4SDavid E. O'Brien */ 534c80476e4SDavid E. O'Brien while (*cp != '\0' && (*cp != '%' || cp[1] != '}')) 535c80476e4SDavid E. O'Brien cp++; 536c80476e4SDavid E. O'Brien #endif /* LITERAL == 0 */ 537c80476e4SDavid E. O'Brien attributes |= LITERAL; 538c80476e4SDavid E. O'Brien break; 539c80476e4SDavid E. O'Brien case '}': /* literal characters end */ 540c80476e4SDavid E. O'Brien attributes &= ~LITERAL; 541c80476e4SDavid E. O'Brien break; 542c80476e4SDavid E. O'Brien default: 543c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 544c80476e4SDavid E. O'Brien if (*cp == 'a' && what == FMT_WHO) { 545c80476e4SDavid E. O'Brien cz = who_info(info, 'a', (char *) cbuff, sizeof(cbuff)); 546c80476e4SDavid E. O'Brien for (; cz && *cz; *p++ = attributes | *cz++) 547c80476e4SDavid E. O'Brien if (p >= ep) break; 548c80476e4SDavid E. O'Brien } 549c80476e4SDavid E. O'Brien else 550c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 551c80476e4SDavid E. O'Brien { 552c80476e4SDavid E. O'Brien if (p >= ep - 3) break; 553c80476e4SDavid E. O'Brien *p++ = attributes | '%'; 554c80476e4SDavid E. O'Brien *p++ = attributes | *cp; 555c80476e4SDavid E. O'Brien } 556c80476e4SDavid E. O'Brien break; 557c80476e4SDavid E. O'Brien } 558c80476e4SDavid E. O'Brien } 559c80476e4SDavid E. O'Brien else if (*cp == '\\' || *cp == '^') 560c80476e4SDavid E. O'Brien *p++ = attributes | parseescape(&cp); 561c80476e4SDavid E. O'Brien else if (*cp == HIST) { /* EGS: handle '!'s in prompts */ 562c80476e4SDavid E. O'Brien if (what == FMT_HISTORY) 563c80476e4SDavid E. O'Brien fmthist('h', info, (char *) cbuff, sizeof(cbuff)); 564c80476e4SDavid E. O'Brien else 565c80476e4SDavid E. O'Brien (void) xsnprintf((char *) cbuff, sizeof(cbuff), "%d", eventno + 1); 566c80476e4SDavid E. O'Brien for (cz = cbuff; *cz; *p++ = attributes | *cz++) 567c80476e4SDavid E. O'Brien if (p >= ep) break; 568c80476e4SDavid E. O'Brien } 569c80476e4SDavid E. O'Brien else 570c80476e4SDavid E. O'Brien *p++ = attributes | *cp; /* normal character */ 571c80476e4SDavid E. O'Brien } 572c80476e4SDavid E. O'Brien *p = '\0'; 573c80476e4SDavid E. O'Brien } 574c80476e4SDavid E. O'Brien 575c80476e4SDavid E. O'Brien Char * 576c80476e4SDavid E. O'Brien expdollar(dstp, srcp, spp, attr) 577c80476e4SDavid E. O'Brien Char **dstp; 578c80476e4SDavid E. O'Brien const Char **srcp; 579c80476e4SDavid E. O'Brien size_t *spp; 580c80476e4SDavid E. O'Brien int attr; 581c80476e4SDavid E. O'Brien { 582c80476e4SDavid E. O'Brien struct varent *vp; 583c80476e4SDavid E. O'Brien Char var[MAXVARLEN]; 584c80476e4SDavid E. O'Brien const Char *src = *srcp; 585c80476e4SDavid E. O'Brien Char *val; 586c80476e4SDavid E. O'Brien Char *dst = *dstp; 587c80476e4SDavid E. O'Brien int i, curly = 0; 588c80476e4SDavid E. O'Brien 589c80476e4SDavid E. O'Brien /* found a variable, expand it */ 590c80476e4SDavid E. O'Brien for (i = 0; i < MAXVARLEN; i++) { 591c80476e4SDavid E. O'Brien var[i] = *++src & TRIM; 592c80476e4SDavid E. O'Brien if (i == 0 && var[i] == '{') { 593c80476e4SDavid E. O'Brien curly = 1; 594c80476e4SDavid E. O'Brien var[i] = *++src & TRIM; 595c80476e4SDavid E. O'Brien } 596c80476e4SDavid E. O'Brien if (!alnum(var[i])) { 597c80476e4SDavid E. O'Brien 598c80476e4SDavid E. O'Brien var[i] = '\0'; 599c80476e4SDavid E. O'Brien break; 600c80476e4SDavid E. O'Brien } 601c80476e4SDavid E. O'Brien } 602c80476e4SDavid E. O'Brien if (curly && (*src & TRIM) == '}') 603c80476e4SDavid E. O'Brien src++; 604c80476e4SDavid E. O'Brien 605c80476e4SDavid E. O'Brien vp = adrof(var); 606c80476e4SDavid E. O'Brien val = (!vp) ? tgetenv(var) : NULL; 607c80476e4SDavid E. O'Brien if (vp) { 608c80476e4SDavid E. O'Brien for (i = 0; vp->vec[i] != NULL; i++) { 609c80476e4SDavid E. O'Brien for (val = vp->vec[i]; *spp > 0 && *val; (*spp)--) 610c80476e4SDavid E. O'Brien *dst++ = *val++ | attr; 611c80476e4SDavid E. O'Brien if (vp->vec[i+1] && *spp > 0) { 612c80476e4SDavid E. O'Brien *dst++ = ' ' | attr; 613c80476e4SDavid E. O'Brien (*spp)--; 614c80476e4SDavid E. O'Brien } 615c80476e4SDavid E. O'Brien } 616c80476e4SDavid E. O'Brien } 617c80476e4SDavid E. O'Brien else if (val) { 618c80476e4SDavid E. O'Brien for (; *spp > 0 && *val; (*spp)--) 619c80476e4SDavid E. O'Brien *dst++ = *val++ | attr; 620c80476e4SDavid E. O'Brien } 621c80476e4SDavid E. O'Brien else { 622c80476e4SDavid E. O'Brien **dstp = '\0'; 623c80476e4SDavid E. O'Brien *srcp = src; 624c80476e4SDavid E. O'Brien return NULL; 625c80476e4SDavid E. O'Brien } 626c80476e4SDavid E. O'Brien *dst = '\0'; 627c80476e4SDavid E. O'Brien 628c80476e4SDavid E. O'Brien val = *dstp; 629c80476e4SDavid E. O'Brien *srcp = src; 630c80476e4SDavid E. O'Brien *dstp = dst; 631c80476e4SDavid E. O'Brien 632c80476e4SDavid E. O'Brien return val; 633c80476e4SDavid E. O'Brien } 634