Mercurial > illumos > onarm
diff usr/src/cmd/fmli/qued/getfield.c @ 0:c9caec207d52 b86
Initial porting based on b86
author | Koji Uno <koji.uno@sun.com> |
---|---|
date | Tue, 02 Jun 2009 18:56:50 +0900 |
parents | |
children | 1a15d5aaf794 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/fmli/qued/getfield.c Tue Jun 02 18:56:50 2009 +0900 @@ -0,0 +1,189 @@ +/* + * 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 1992 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + +#pragma ident "@(#)getfield.c 1.7 05/06/08 SMI" + +#include <stdio.h> +#include <curses.h> +#include "token.h" +#include "wish.h" +#include "winp.h" +#include "fmacs.h" +#include "terror.h" + +static char *getfixedval(); +static char *getscrollval(); + +/* + * GETFIELD will return the contents of the current field. It is not + * stable as of yet and does not account for scrolling field. + */ +char * +getfield(fld, buff) +ifield *fld; +char *buff; +{ + register char *fbuf, *val; + ifield *savefield; + + savefield = Cfld; + if (fld != NULL) + Cfld = fld; + if (Flags & I_INVISIBLE) { + if (Value == NULL) + val = nil; + else + val = Value; + } + else if (Flags & I_SCROLL) + val = getscrollval(); + else + val = getfixedval(); + /* + * getscrollval() and getfixedval() return NULL from + * time to time - causing calling functions to segfault. + */ + if (val == NULL) + val = nil; + if (buff == NULL) + fbuf = val; + else { + strcpy(buff, val); + fbuf = buff; + } + Cfld = savefield; + return(fbuf); +} + +static char * +getfixedval() +{ + register int row; + register char *bptr; + + if (!(Flags & I_CHANGED)) + return(Value); + Flags &= ~(I_CHANGED); + + /* + * If this field does not already have a value then + * allocate space equal to the size of the field dimensions + * (Buffer is guarenteed to be at least this size if there + * already is a field value) + */ + if (!Value && (Value = malloc(FIELDBYTES +1)) == NULL) /* +1 abs k15 */ + fatal(NOMEM, nil); + + /* + * Read the field value from the window map and eat + * trailing new-line characters + */ + for (bptr = Value, row = 0; row <= LASTROW; row++) { + bptr += freadline(row, bptr, TRUE); + *bptr++ = '\n'; + } + while (--bptr >= Value && *bptr == '\n') + *bptr = '\0'; + return(Value); +} + +static char * +getscrollval() +{ + register char *dptr; + register chtype *sptr, *lastptr, *saveptr; + unsigned buflength, lenvalptr; + char *dest; + + if (!(Flags & I_CHANGED)) + return(Value); + Flags &= ~(I_CHANGED); + /* + * HORIZONTAL SCROLL FIELD + * + * - syncronize the window map with the scroll buffer. + * - set Value to the result + * + */ + if (Currtype == SINGLE) { + syncbuf(Buffoffset, 0, 0); /* syncronize buffer */ + if ((dest = malloc(Buffsize + 1)) == NULL) + fatal(NOMEM, nil); + dptr = dest; + sptr = Scrollbuf; + while ((*dptr++ = (char)(*(sptr++) & A_CHARTEXT)) != '\0') + ; + if (Value) + free(Value); + Value = dest; + return(Value); + } + + /* + * VERTICAL SCROLL FIELD + * + * - syncronize the window map with the scroll buffer. + * - "pack" the scoll buffer (remove trailing blanks). + * - append the remaining (unprocessed) text pointed to by Valptr. + * - eat trailing new-lines + * - set Value to the result. + * + */ + syncbuf(Buffoffset, 0, Fieldrows - 1); /* syncronize buffer */ + if ((dest = malloc(Buffsize + 1)) == NULL) + fatal(NOMEM, nil); + lastptr = Scrollbuf + Bufflast; + saveptr = sptr = Scrollbuf; + dptr = dest; + while (sptr < lastptr) { /* pack Scrollbuf */ + if ((*dptr++ = (char)(*(sptr++) & A_CHARTEXT)) == '\0') { + saveptr += LINEBYTES; + sptr = saveptr; + *(dptr - 1) = '\n'; + } + } + *dptr = '\0'; + + buflength = strlen(dest); + if (Valptr) { /* append unprocessed text */ + lenvalptr = strlen(Valptr); + if ((dest = realloc(dest, buflength + lenvalptr + 1)) == NULL) + fatal(NOMEM, nil); + strcat(dest, Valptr); + Valptr = dest + buflength; + buflength += lenvalptr; + } + if (Value) + free(Value); + Value = dest; + for (dptr = dest + buflength - 1; --dptr >= dest && *dptr == '\n'; ) + *dptr = '\0'; /* eat trailing new-lines */ + return(Value); +} +