getstring.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1997 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <ctype.h>
#include <curses.h>
#include "wish.h"
#include "vtdefs.h"
#include "token.h"
#include "actrec.h"
#include "slk.h"
#include "winp.h"
#include "moremacros.h"
struct prompt {
token (*myfunc)();
struct actrec *rec;
char *prompt;
char *init;
bool helpismenu;
char *helpfile;
char *helptitle;
int flags;
};
static struct prompt p = { NULL, NULL, NULL, NULL, 0};
static struct actrec *prompt_actrec;
extern int Vflag;
static int
prompt_noncur(a, all)
struct actrec *a;
bool all;
{
#ifdef _DEBUG
_debug(stderr, "clearing PROMPT MODE\n");
#endif
wgo(0, 0);
wclrwin();
return SUCCESS;
}
static int
prompt_ctl(rec, cmd, a1, a2, a3, a4, a5, a6)
struct actrec *rec;
int cmd;
int a1, a2, a3, a4, a5, a6;
{
#ifdef _DEBUG
_debug(stderr, "prompt_ctl(0x%x, %d, %d, %d)\n", rec, cmd, a1, a2);
#endif
return vt_ctl(rec->id, cmd, a1, a2, a3, a4, a5, a6);
}
static token
prompt_stream(rec, t)
struct actrec *rec;
register token t;
{
register char *s;
char *fldval, *getfield();
switch (t = field_stream(t)) {
case TOK_SAVE:
fldval = getfield(NULL, NULL);
s = strsave(fldval);
break;
case TOK_CANCEL:
s = NULL;
break;
case TOK_NOP:
case TOK_HELP:
return t;
default:
return t | TOK_ERROR;
}
ar_backup();
/*
* MUST clear the message line before doing the token operation
* because (temporary) messages may be generated via ar_backup()
* which calls ar_current() (yuk!!);
*/
mess_temp("");
t = (*p.rec->fcntbl[AR_ODSH])(p.rec, (*p.myfunc)(s, t));
if (s)
free(s);
return t;
}
static int
prompt_current(rec)
register struct actrec *rec;
{
ifield *fld, *deffield();
p.rec = rec->backup;
vt_current(rec->id);
wgo(0, 0);
wclrwin();
if (p.prompt)
winputs(p.prompt, NULL);
fld = deffield();
setfieldflags(fld, p.flags);
gotofield(fld, 0, 0);
if (p.init) {
putfield(fld, p.init);
gotofield(fld, 0, min(fld->cols - 1, strlen(p.init)));
}
return SUCCESS;
}
static int
prompt_help()
{
if (Vflag) {
if (p.helpismenu)
return objop("OPEN", "MENU", p.helpfile, p.helptitle, NULL);
else
return objop("OPEN", "TEXT", "$VMSYS/OBJECTS/Text.help", p.helpfile, p.helptitle, NULL);
}
else
return(SUCCESS);
}
void
get_string(func, s1, s2, flags, helpismenu, helpfile, helptitle)
token (*func)();
char *s1;
char *s2;
int flags;
int helpismenu;
char *helpfile;
char *helptitle;
{
p.myfunc = func;
p.prompt = s1;
if (s2)
p.init = s2;
else
p.init = strnsave("", 0); /* abs */
p.flags = flags | I_SCROLL; /* abs. added srcoll flag */
p.helpismenu = helpismenu;
p.helpfile = helpfile;
p.helptitle = helptitle;
if (prompt_actrec == NULL) {
struct actrec a;
struct actrec *ar_create();
extern struct slk Echslk[];
a.id = CMD_WIN;
a.flags = AR_SKIP;
a.odptr = a.path = NULL;
a.fcntbl[AR_CLOSE] = AR_NOP;
a.fcntbl[AR_REINIT] = AR_NOP;
a.fcntbl[AR_REREAD] = AR_NOP; /* abs k18 */
a.fcntbl[AR_HELP] = prompt_help;
a.fcntbl[AR_NONCUR] = prompt_noncur;
a.fcntbl[AR_CURRENT] = prompt_current;
a.fcntbl[AR_TEMP_CUR] = prompt_current;
a.fcntbl[AR_CTL] = prompt_ctl;
a.fcntbl[AR_ODSH] = (int (*)())prompt_stream; /* added cast. abs */
a.lifetime = AR_PERMANENT;
a.slks = Echslk;
prompt_actrec = ar_create(&a);
}
ar_current(prompt_actrec, FALSE); /* abs k15 */
}