cdesktopenv/cde/programs/dtudcexch/xlfdutil.c

333 lines
7.6 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: xlfdutil.c /main/2 1996/10/14 14:45:50 barstow $ */
/*
* All Rights Reserved, Copyright (c) FUJITSU LIMITED 1995
*
* This is unpublished proprietary source code of FUJITSU LIMITED
*
* Authors: Seiya Miyazaki FUJITSU LIMITED
* Hiroyuki Chiba Fujitsu Basic Software Corporation
*
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <nl_types.h>
#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/Label.h>
#include <Xm/SeparatoG.h>
#include <Xm/List.h>
#include <Xm/ToggleB.h>
#include <Xm/MessageB.h>
#include "FaLib.h"
#include "falxlfd.h"
#include "selectxlfd.h"
#ifdef DEBUG
#undef Dprintf
#define Dprintf fprintf
#else
#define Dprintf
#endif /* DEBUG */
/*
* parameters
*/
static char* skipSpace() ;
extern FalFontDataList *font_L ;
extern FalxFontDataBuff KeyBuff ;
extern FalxCodeList *CodeList ;
extern FalxStyleList *StyleList ;
extern FalxSizeList *SizeList ;
extern int SelectedOffset ;
extern int getmask ;
extern char *fullPathName ;
extern Widget toplevel ;
extern Widget
xlfdWform, cpyWform,
slctBLabel[BUTTONITEMS],slctBText[BUTTONITEMS], slctButton[BUTTONITEMS],
listPop[BUTTONITEMS], listW[BUTTONITEMS],
errorMD, msgBox ;
/****************************************************************
* functions for get font infomation
****************************************************************/
int
GetXLFDInfomations()
{
Dprintf( stdout, "GetXLFDInfomations()\n" ) ;
/* initialize */
getmask = 0 ;
SelectedOffset = 0 ;
fullPathName = NULL ;
FalxInitDataBuff( &KeyBuff ) ;
/* get UDC informations */
if( FalxGetFontList( &font_L, XtDisplayOfObject( toplevel ) ) ){
Dprintf( stderr, "GetXLFDInfomations() : FalxGetFontList() error.\n" ) ;
return(-1);
}
/* create code area list */
if( FalxCreateCodeList( &CodeList, font_L ) ){
Dprintf( stderr, "\nGetXLFDInfomations() : FalxCreateCodeList() error.\n" ) ;
return(-1);
}
/* create style list */
if( FalxCreateStyleList( &StyleList, font_L ) ){
Dprintf( stderr, "\nGetXLFDInfomations() : FalxCreateStyleList() error.\n" ) ;
return(-1);
}
/* create size list */
if( FalxCreateSizeList( &SizeList, font_L ) ){
Dprintf( stderr, "\nGetXLFDInfomations() : FalxCreateSizeList() error.\n" ) ;
return(-1);
}
return(0) ;
}
int
GetItemsToDisplay( int num, int *itemcnt, XmString **xms_list )
{
int i, j, cnt ;
char *sp ,string[256], buf[256] ;
Arg args[1];
int length, maxlength ;
FalxXlfdList *xlist ;
int tmp_cnt ;
char **tmp_dlist, *str ;
XmString *xms ;
int rlen ;
int rtn ;
switch( num ){
case 0 : /* XLFD */
/* set key data */
for( i=1; i<BUTTONITEMS; i++ ){
if( (str = XmTextGetString( slctBText[i] )) == NULL ){
exit(-1) ;
}
if( *str == ' ' || *str == NULL ) continue ;
if( SetKeyBuff( i, str ) ){
exit(-1) ;
}
}
rtn = FalxGetXlfdList( &xlist, font_L, &KeyBuff, getmask ) ;
if( rtn ) return( rtn ) ;
tmp_cnt = xlist->num ;
tmp_dlist = xlist->list ;
break ;
case 1 : /* code area */
tmp_cnt = CodeList->num ;
tmp_dlist = (char **)malloc( sizeof(char *) * tmp_cnt ) ;
if( tmp_dlist == NULL ) return(-1) ;
for( i=0; i<tmp_cnt; i++ ){
sp = string ;
rlen = sprintf( sp, "CS:%d ", (CodeList->dlist[i]->fontset) ) ;
sp += rlen ;
for( j=0; j<CodeList->dlist[i]->code_area_num; j++ ){
rlen = sprintf( sp, "%x - %x ",
CodeList->dlist[i]->alist[j]->udc_start,
CodeList->dlist[i]->alist[j]->udc_end ) ;
sp += rlen ;
}
if( (tmp_dlist[i] = strdup( string )) == NULL ){
return(-1) ;
}
}
break ;
case 2 : /* style */
tmp_cnt = StyleList->num ;
tmp_dlist = (char **)malloc( sizeof(char *) * tmp_cnt ) ;
for( i=0; i<tmp_cnt; i++ ){
if( (tmp_dlist[i] = strdup( StyleList->list[i] )) == NULL ){
return(-1) ;
}
}
break ;
case 3 : /* size */
tmp_cnt = SizeList->num ;
tmp_dlist = (char **)malloc( sizeof(char *) * tmp_cnt ) ;
for( i=0; i<tmp_cnt; i++ ){
sprintf( string, "%d ", SizeList->list[i] ) ;
if( (tmp_dlist[i] = strdup( string )) == NULL ){
return(-1) ;
}
}
break ;
default : /* error */
return(-1) ;
}
if( (xms = (XmString *)calloc( tmp_cnt, sizeof(XmString) )) == NULL ){
return( -1 ) ;
}
/*
* set list for display
*/
maxlength = 0 ;
for ( i=0; i<tmp_cnt; i++ ){
xms[i] = XmStringCreateLocalized( tmp_dlist[i] );
}
/*
* free allocated memory
*/
switch( num ){
case 0 : /* XLFD */
FalxFreeXlfdList( xlist ) ;
break ;
case 1 : /* code area */
case 2 : /* style */
case 3 : /* size */
for( i=0; i<tmp_cnt; i++ ){
free( tmp_dlist[i] ) ;
}
free( tmp_dlist ) ;
break ;
default : /* error */
return(-1) ;
}
*itemcnt = tmp_cnt ;
*xms_list = xms ;
return(0) ;
}
static char*
skipSpace( char *str, int skipcnt )
{
int i, spacecnt ;
char *sp ;
int len ;
if( *str == NULL ) return( NULL ) ;
len = strlen( str ) ;
sp = str ;
for( i=0,spacecnt=0; i<len-1; i++, sp++ ) {
if( *sp == NULL ) return( NULL ) ;
if( *sp == ' ' ) spacecnt++ ;
if( spacecnt == skipcnt ) break ;
}
sp++ ;
return( sp ) ;
}
int
SetKeyBuff( int num, char *str )
{
int i, j ;
int cdset, start, end ;
FalxUdcArea *tmp_list ;
char hyp, *sp ;
switch( num ){
case 0 : /* XLFD */
KeyBuff.FontData.xlfdname = str ;
break ;
case 1 : /* code area */
getmask |= FAL_FONT_MASK_CODE_SET ;
if( KeyBuff.FileData.list != NULL ){
free( KeyBuff.FileData.list ) ;
}
KeyBuff.FileData.list = NULL ;
tmp_list = NULL ;
sp = str ;
if( sscanf( sp, "CS:%d ", &cdset ) != 1 ){
return(-1) ;
}
if( (sp = skipSpace( sp, 1 )) == NULL ) return( -1 ) ;
num = 0 ;
KeyBuff.FontData.cd_set = cdset ;
while( sscanf( sp, "%x %c %x ", &start, &hyp, &end ) == 3 ){
if( hyp != '-' ) break ;
if( tmp_list == NULL ){
tmp_list = (FalxUdcArea *)malloc( sizeof(FalxUdcArea) ) ;
}else{
tmp_list = (FalxUdcArea *)realloc( KeyBuff.FileData.list,
sizeof(FalxUdcArea) * (num+1) ) ;
}
if( tmp_list == NULL ) return(-1) ;
tmp_list[num].udc_start = (int)start ;
tmp_list[num].udc_end = (int)end ;
num ++ ;
if( (sp = skipSpace( sp, 3 )) == NULL ) break ;
}
if( num == 0 ) return(-1) ;
KeyBuff.FileData.code_area_num = num ;
KeyBuff.FileData.list = tmp_list ;
break ;
case 2 : /* style */
getmask |= FAL_FONT_MASK_STYLE_NAME ;
KeyBuff.FontData.style.name = str ;
break ;
case 3 : /* size */
getmask |= FAL_FONT_MASK_LETTER_W ;
getmask |= FAL_FONT_MASK_LETTER_H ;
KeyBuff.FontData.letter.w = atoi( str ) ;
KeyBuff.FontData.letter.h = atoi( str ) ;
break ;
default :
return(-1) ;
}
return(0);
}