1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/lib/DtHelp/Format.c
2022-01-26 19:50:11 +08:00

1235 lines
35 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: Format.c /main/18 1996/11/22 12:23:59 cde-hp $ */
/************************************<+>*************************************
****************************************************************************
**
** File: Format.c
**
** Project: Text Graphic Display Library
**
** Description: This body of formats the input into a form understood by
** a Display Area.
**
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
**
** (c) Copyright 1993, 1994 Hewlett-Packard Company
** (c) Copyright 1993, 1994 International Business Machines Corp.
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
** (c) Copyright 1993, 1994 Novell, Inc.
**
**
****************************************************************************
************************************<+>*************************************/
/*
* system includes
*/
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <Xm/Xm.h>
#ifdef X_NOT_STDC_ENV
extern int errno;
#endif
/*
* Core Engine includes
*/
#include "CanvasP.h"
#include "CanvasSegP.h"
/*
* private includes
*/
#include "bufioI.h"
#include "CvtToArrayP.h"
#include "DisplayAreaP.h"
#include "FontAttrI.h"
#include "FontI.h"
#include "HelpXlate.h"
#include "XInterfaceI.h"
#include "Lock.h"
/*
* private core engine
*/
#include "Access.h"
#include "AccessP.h"
#include "AccessI.h"
#include "AccessCCDFI.h"
#include "SDLI.h"
#include "FormatUtilI.h"
#include "FormatCCDFI.h"
#include "FormatSDLI.h"
#include "StringFuncsI.h"
#include "FormatI.h"
#ifdef NLS16
#endif
/******** Private Function Declarations ********/
/******** End Public Function Declarations ********/
/******************************************************************************
*
* Private variables and defines.
*
*****************************************************************************/
#define BUFF_SIZE 1024
static char *ScanString = "\n\t";
static const _FrmtUiInfo defUiInfo = { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 1, False };
/******************************************************************************
*
* Private Functions
*
*****************************************************************************/
/******************************************************************************
* Function: int FormatChunksToXmString ()
*
* Parameters:
* *ret_list may be NULL when called
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: Take some rich text chunks and turn it into an XmString.
*
******************************************************************************/
static int
FormatChunksToXmString(
DtHelpDispAreaStruct *pDAS,
Boolean free_flag,
void **title_chunks,
XmString *ret_title,
XmFontList *ret_list,
Boolean *ret_mod )
{
int result = 0;
int i;
long j;
int quarkCount;
long chunkType;
long myIdx;
_DtCvPointer fontPtr;
char *charSet;
const char *strChunk;
char buffer[16];
_DtHelpFontHints fontSpecs;
XmFontContext fontContext;
XmString partTitle;
XmString newTitle;
XrmQuark charSetQuark;
XrmName myCharSetQuarks[20];
XrmName xrmName[_CEFontAttrNumber];
Boolean myMore;
/*
* Initialize the pointers.
*/
*ret_title = NULL;
*ret_mod = False;
if (title_chunks == NULL)
return -1;
/*
* initialize the font context
*/
_DtHelpCeCopyDefFontAttrList(&fontSpecs);
if ( NULL != *ret_list )
{
if (XmFontListInitFontContext (&fontContext, *ret_list) == False)
result = -1;
else
{
XFontStruct *myFontStruct;
/*
* quarkize all the character sets found.
*/
quarkCount = 0;
do
{
myMore = XmFontListGetNextFont (fontContext, &charSet,
&myFontStruct);
if (myMore)
{
myCharSetQuarks[quarkCount++] =
XrmStringToQuark (charSet);
XtFree (charSet);
}
} while (myMore);
XmFontListFreeFontContext (fontContext);
}
} /* if NULL != *ret_list */
else
{ /* if NULL == *ret_list */
quarkCount = 0;
myCharSetQuarks[0] = 0;
}
/*
* Build the XrmString based on the segments.
* The format of the returned information is
* 'DT_HELP_CE_CHARSET locale string'
* 'DT_HELP_CE_FONT_PTR fontptr string'
* 'DT_HELP_CE_SPC spc'
* 'DT_HELP_CE_STRING string' - uses last specified
* charset/font_ptr.
*
* The order and manner in which the title_chunks are processed
* is known and depended upon in several locations.
* Do not change this without changing the other locations.
* See the _DtHelpFormatxxx() routines and the ones that
* create the title_chunk arrays in FormatSDL.c and FormatCCDF.c
*/
myIdx = __DtHelpDefaultFontIndexGet(pDAS);
_DtHelpCopyDefaultList(xrmName);
for (i = 0; result == 0 && title_chunks[i] != DT_HELP_CE_END; i++)
{
/*
* create a string for the char set and a quark for it.
*/
chunkType = (long) title_chunks[i++];
/*
* i now points to the first value after the type
*/
if (chunkType & DT_HELP_CE_CHARSET)
{
char *charSet;
char *lang = (char *) title_chunks[i];
/*
* test to see if the locale is in a lang.codeset form
*/
if (_DtHelpCeStrchr(lang, ".", 1, &charSet) == 0)
{
*charSet = '\0';
charSet++;
}
else
{
charSet = lang;
lang = NULL;
}
/*
* resolve/load the font for the default fonts
*/
_DtHelpDAResolveFont(pDAS, lang, charSet, fontSpecs, &fontPtr);
myIdx = (long) fontPtr;
if (lang != NULL)
{
charSet--;
*charSet = '.';
}
if (free_flag)
free(title_chunks[i]);
/*
* move the i to point to the string.
*/
i++;
}
else if (chunkType & DT_HELP_CE_FONT_PTR)
{
/*
* get the default font for the language and code set.
*/
(void) __DtHelpFontCharSetQuarkGet(pDAS, (long)title_chunks[i],
&xrmName[_DT_HELP_FONT_CHAR_SET]);
(void) __DtHelpFontLangQuarkGet(pDAS, (long)title_chunks[i],
&xrmName[_DT_HELP_FONT_LANG_TER]);
(void) __DtHelpFontIndexGet(pDAS, xrmName, &myIdx);
/*
* move the i to point to the string.
*/
i++;
}
/*
* the i point spc or string.
*/
if (chunkType & DT_HELP_CE_SPC)
{
j = (long) title_chunks[i];
strChunk = _DtHelpDAGetSpcString(pDAS->spc_chars[j].spc_idx);
fontPtr = pDAS->spc_chars[j].font_ptr;
/*
* get the default font for the language and code set.
*/
(void) __DtHelpFontCharSetQuarkGet(pDAS, (long)fontPtr,
&xrmName[_DT_HELP_FONT_CHAR_SET]);
(void) __DtHelpFontLangQuarkGet(pDAS, (long)fontPtr,
&xrmName[_DT_HELP_FONT_LANG_TER]);
(void) __DtHelpFontIndexGet(pDAS, xrmName, &myIdx);
}
else /* if (chunkType & _DT_HELP_CE_STRING) */
strChunk = (char *) title_chunks[i];
sprintf(buffer, "%ld", myIdx);
charSetQuark = XrmStringToQuark(buffer);
j = 0;
while (j < quarkCount && myCharSetQuarks[j] != charSetQuark)
j++;
/*
* If we didn't find a matching character set,
* add it to the list.
*/
if (j >= quarkCount)
{
/* Copy the input list so XmFontListAppendEntry can mangle it. */
/* But only do it once! */
if (False == *ret_mod)
*ret_list = XmFontListCopy(*ret_list);
if (myIdx < 0)
{
XFontSet fontSet = __DtHelpFontSetGet(pDAS->font_info, myIdx);
XmFontListEntry fontEntry;
fontEntry = XmFontListEntryCreate (buffer,
XmFONT_IS_FONTSET,
(XtPointer) fontSet);
*ret_list = XmFontListAppendEntry (*ret_list, fontEntry);
XmFontListEntryFree (&fontEntry);
}
else
{
XFontStruct *fontStruct =
__DtHelpFontStructGet(pDAS->font_info, myIdx);
XmFontListEntry fontEntry;
fontEntry = XmFontListEntryCreate (buffer,
XmFONT_IS_FONT,
(XtPointer) fontStruct);
*ret_list = XmFontListAppendEntry (*ret_list, fontEntry);
XmFontListEntryFree (&fontEntry);
}
*ret_mod = True;
if (*ret_list == NULL)
result = -1;
myCharSetQuarks[quarkCount++] = charSetQuark;
}
/*
* add this segment to the XmString.
*/
if (result == 0)
{
if (*ret_title == NULL)
*ret_title = XmStringGenerate ((char *) strChunk, buffer,
XmCHARSET_TEXT, NULL);
else
{
partTitle = XmStringGenerate ((char *) strChunk, buffer,
XmCHARSET_TEXT, NULL);
newTitle = XmStringConcat (*ret_title, partTitle);
XmStringFree (*ret_title);
XmStringFree (partTitle);
*ret_title = newTitle;
}
/*
* if a newline was specified,
* replace it with a blank.
*/
if (*ret_title != NULL && (chunkType & DT_HELP_CE_NEWLINE))
{
partTitle = XmStringGenerate (" ", buffer, XmCHARSET_TEXT, NULL);
newTitle = XmStringConcat (*ret_title, partTitle);
XmStringFree (*ret_title);
XmStringFree (partTitle);
*ret_title = newTitle;
}
if (*ret_title == NULL)
result = -1;
}
if (free_flag && (chunkType & DT_HELP_CE_STRING))
free(title_chunks[i]);
}
/*
* deallocate the memory.
*/
if (free_flag) free(title_chunks);
return result;
}
/******************************************************************************
*
* Semi-Public Functions
*
*****************************************************************************/
/*****************************************************************************
* Function: int _DtHelpFormatAsciiFile (char *filename,
* CEParagraph **ret_para, int *ret_num)
*
* Parameters:
* filename Specifies the ascii file to read.
* ret_para Returns a pointer to a list of CEParagraph
* structures.
* ret_num Returns the number of structures in 'ret_para'.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
* EINVAL
*
* Purpose: _DtHelpFormatAsciiFile formats Ascii Files into a list of
* CEParagraph structures.
*
*****************************************************************************/
int
_DtHelpFormatAsciiFile(
XtPointer client_data,
char *filename,
XtPointer *ret_handle)
{
int myFile;
int result = -1;
_DtHelpFontHints fontAttrs;
char buffer [BUFF_SIZE];
BufFilePtr rawInput;
XtPointer varHandle;
_DtCvTopicPtr topic = NULL;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
_FrmtUiInfo myUiInfo = defUiInfo;
/*
* check the parameters
*/
if (filename == NULL || ret_handle == NULL)
{
errno = EINVAL;
return -1;
}
/*
* Initialize the pointers, buffers and counters
*/
*ret_handle = NULL;
/*
* open the file.
*/
myFile = open (filename, O_RDONLY);
if (myFile != -1)
{
/*
* set the information
*/
rawInput = _DtHelpCeBufFileRdWithFd(myFile);
if (rawInput == 0)
{
close (myFile);
return -1;
}
result = _DtHelpCeReadBuf (rawInput, buffer, BUFF_SIZE);
if (result != -1)
{
_DtHelpCeCopyDefFontAttrList (&fontAttrs);
fontAttrs.spacing = _DtHelpFontSpacingMono;
_DtHelpCeGetLcCtype(NULL, &(fontAttrs.language),
&(fontAttrs.char_set));
/*
* fill out the ui information
*/
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.client_data = (_DtCvPointer) pDAS;
myUiInfo.line_width = pDAS->lineThickness;
myUiInfo.line_height = pDAS->lineHeight;
myUiInfo.leading = pDAS->leading;
myUiInfo.avg_char = (int)(pDAS->charWidth / 10 +
((pDAS->charWidth % 10) ? 1 : 0));
myUiInfo.nl_to_space = pDAS->nl_to_space;
/*
* get the formatting structure.
*/
varHandle = __DtHelpCeSetUpVars(&myUiInfo);
if (varHandle == NULL)
{
free(fontAttrs.language);
free(fontAttrs.char_set);
return -1;
}
result = __DtHelpCeProcessString (varHandle, rawInput,
_DtCvLITERAL,
ScanString, buffer, BUFF_SIZE,
0, False, &fontAttrs);
if (result != -1)
result = __DtHelpCeGetParagraphList (varHandle, True,
_DtCvLITERAL,
&topic);
free(fontAttrs.language);
free(fontAttrs.char_set);
free(varHandle);
}
_DtHelpCeBufFileClose(rawInput, True);
}
*ret_handle = (XtPointer) topic;
return result;
} /* End _DtHelpFormatAsciiFile */
/*****************************************************************************
* Function: int _DtHelpFormatAsciiString (char *input_string,
* CEParagraph **ret_para, int *ret_num)
*
* Parameters:
* input_string Specifies the ascii string to format.
* ret_para Returns a pointer to a list of CEParagraph
* structures.
* ret_num Returns the number of structures in 'ret_para'.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: _DtHelpFormatAsciiString formats a string as if it were a
* static string - watching for newlines and using them
* to force a break in the line.
*
*****************************************************************************/
int
_DtHelpFormatAsciiString(
XtPointer client_data,
char *input_string,
XtPointer *ret_handle)
{
int result = -1;
_DtHelpFontHints fontAttrs;
XtPointer varHandle;
_DtCvTopicPtr topic = NULL;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
_FrmtUiInfo myUiInfo = defUiInfo;
/*
* check the parameters.
*/
if (input_string == NULL || ret_handle == NULL)
{
errno = EINVAL;
return -1;
}
/*
* fill out the ui information
*/
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.client_data = (_DtCvPointer) pDAS;
myUiInfo.line_width = pDAS->lineThickness;
myUiInfo.line_height = pDAS->lineHeight;
myUiInfo.leading = pDAS->leading;
myUiInfo.avg_char = (int)(pDAS->charWidth / 10 +
((pDAS->charWidth % 10) ? 1 : 0));
myUiInfo.nl_to_space = pDAS->nl_to_space;
/*
* Get the initialized variables
*/
*ret_handle = NULL;
_DtHelpCeCopyDefFontAttrList (&fontAttrs);
_DtHelpCeGetLcCtype(NULL, &(fontAttrs.language), &(fontAttrs.char_set));
varHandle = __DtHelpCeSetUpVars(&myUiInfo);
if (varHandle == NULL)
{
free(fontAttrs.language);
free(fontAttrs.char_set);
return -1;
}
result = __DtHelpCeProcessString (varHandle, NULL,
_DtCvLITERAL,
ScanString, input_string,
strlen(input_string),
0, False,
&fontAttrs);
if (result != -1)
result = __DtHelpCeGetParagraphList (varHandle, True, _DtCvLITERAL,
&topic);
*ret_handle = (XtPointer) topic;
free(fontAttrs.language);
free(fontAttrs.char_set);
free(varHandle);
return result;
} /* End _DtHelpFormatAsciiString */
/*****************************************************************************
* Function: int _DtHelpFormatAsciiStringDynamic (char *input_string,
* CEParagraph **ret_para, int *ret_num)
*
* Parameters:
* input_string Specifies the ascii string to format.
* ret_para Returns a pointer to a list of CEParagraph
* structures.
* ret_num Returns the number of structures in 'ret_para'.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: _DtHelpFormatAsciiStringDynamic formats a string as if it were
* a dynamic string - it uses newline characters to terminate
* the current paragraph, not a line.
*
*****************************************************************************/
int
_DtHelpFormatAsciiStringDynamic(
XtPointer client_data,
char *input_string,
XtPointer *ret_handle)
{
int result = -1;
_DtHelpFontHints fontAttrs;
XtPointer varHandle;
_DtCvTopicPtr topic = NULL;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
_FrmtUiInfo myUiInfo = defUiInfo;
/*
* check the parameters.
*/
if (input_string == NULL || ret_handle == NULL)
{
errno = EINVAL;
return -1;
}
/*
* fill out the ui information
*/
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.client_data = (_DtCvPointer) pDAS;
myUiInfo.line_width = pDAS->lineThickness;
myUiInfo.line_height = pDAS->lineHeight;
myUiInfo.leading = pDAS->leading;
myUiInfo.avg_char = (int)(pDAS->charWidth / 10 +
((pDAS->charWidth % 10) ? 1 : 0));
myUiInfo.nl_to_space = pDAS->nl_to_space;
/*
* Fake the flag and give the string as the input buffer.
*/
*ret_handle = NULL;
_DtHelpCeCopyDefFontAttrList (&fontAttrs);
_DtHelpCeGetLcCtype(NULL, &(fontAttrs.language), &(fontAttrs.char_set));
varHandle = __DtHelpCeSetUpVars(&myUiInfo);
if (varHandle == NULL)
{
free(fontAttrs.language);
free(fontAttrs.char_set);
return -1;
}
result = __DtHelpCeProcessString (varHandle, NULL,
_DtCvDYNAMIC,
ScanString, input_string,
strlen(input_string),
0, True,
&fontAttrs);
if (result != -1)
result = __DtHelpCeGetParagraphList (varHandle, False, _DtCvDYNAMIC,
&topic);
*ret_handle = (XtPointer) topic;
free(fontAttrs.language);
free(fontAttrs.char_set);
free(varHandle);
return result;
} /* End _DtHelpFormatAsciiStringDynamic */
/******************************************************************************
* Function: int _DtHelpFormatTopicTitle (Display *dpy, _XvhVolume volume,
* char *filename, int offset,
* XmString *ret_title, XmFontList *ret_list,
* Boolean *ret_mod)
*
* Parameters:
* dpy Specifies the connection to the server.
* volume Specifies the Help Volume the information
* is associated with.
* filename Specifies the file containing the Help Topic
* desired.
* offset Specifies the offset into 'filename' to
* the Help Topic desired.
* ret_title Returns XmString containing the title.
* ret_list Specifies the current font list being used.
* Returns a new font list if new character
* sets are added to it.
* ret_mod Returns True if fonts were added to the
* font list.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: _DtHelpFormatTopicTitle formats a topic title and associates
* the correct font with it.
*
******************************************************************************/
int
_DtHelpFormatTopicTitle(
XtPointer client_data,
_DtHelpVolumeHdl volume_handle,
char *location_id,
XmString *ret_title,
XmFontList *ret_list,
Boolean *ret_mod )
{
int result = -1;
void **titleChunks = NULL;
_FrmtUiInfo myUiInfo = defUiInfo;
_DtHelpCeLockInfo lockInfo;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
/*
* Check the parameters
*/
if (ret_title == NULL || ret_list == NULL || ret_mod == NULL)
{
errno = EINVAL;
return -1;
}
/*
* lock the volume
*/
if (_DtHelpCeLockVolume(volume_handle, &lockInfo) != 0)
return -1;
/*
* set up my UI information
*/
myUiInfo.load_graphic = _DtHelpDALoadGraphic;
myUiInfo.resolve_spc = _DtHelpDAResolveSpc;
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.exec_filter = pDAS->exec_filter;
myUiInfo.destroy_region = _DtHelpDADestroyRegion;
myUiInfo.client_data = (_DtCvPointer) pDAS;
/* since we're going for chunks, set avg_char width to 1 */
myUiInfo.line_width = 0;
myUiInfo.line_height = 0;
myUiInfo.leading = 0;
myUiInfo.avg_char = 1;
myUiInfo.nl_to_space = pDAS->nl_to_space;
/*
* Get the title and charsets associated with the title segments.
* The format of the returned information is
* [type,charset/fontptr,]type,string/spc
*/
result = _DtHelpCeGetVolumeFlag(volume_handle);
_DtHelpProcessLock();
if (result == 1)
result = _DtHelpCeGetSdlTitleChunks(volume_handle, location_id,
&myUiInfo, &titleChunks);
else if (result == 0)
result = _DtHelpCeGetCcdfTitleChunks( volume_handle, location_id,
&myUiInfo, &titleChunks);
_DtHelpProcessUnlock();
if (result != -1)
result = FormatChunksToXmString(pDAS, True, titleChunks,
ret_title, ret_list, ret_mod);
_DtHelpCeUnlockVolume(lockInfo);
return result;
} /* End _DtHelpFormatTopicTitle */
/******************************************************************************
* Function: int _DtHelpFormatVolumeTitle (DtHelpDispAreaStruct *pDAS,
* _XvhVolume volume,
* XmString *ret_title, XmFontList *ret_list,
* Boolean *ret_mod)
*
* Parameters:
* volume Specifies the Help Volume the information
* is associated with.
* ret_title Returns XmString containing the title.
* ret_list Specifies the current font list being used.
* Returns a new font list if new character
* sets are added to it.
* ret_mod Returns True if fonts were added to the
* font list.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: _DtHelpFormatVolumeTitle formats a volume title and associates
* the correct font with it.
*
******************************************************************************/
int
_DtHelpFormatVolumeTitle(
XtPointer client_data,
_DtHelpVolumeHdl volume_handle,
XmString *ret_title,
XmFontList *ret_list,
Boolean *ret_mod )
{
int result = -1;
void **titleChunks = NULL;
_FrmtUiInfo myUiInfo = defUiInfo;
_DtHelpCeLockInfo lockInfo;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
/*
* Check the parameters
*/
if (ret_title == NULL || ret_list == NULL || ret_mod == NULL)
{
errno = EINVAL;
return -1;
}
/*
* lock the volume
*/
*ret_title = NULL;
if (_DtHelpCeLockVolume(volume_handle, &lockInfo) != 0)
return -1;
/*
* set up my UI information
*/
myUiInfo.load_graphic = _DtHelpDALoadGraphic;
myUiInfo.resolve_spc = _DtHelpDAResolveSpc;
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.exec_filter = pDAS->exec_filter;
myUiInfo.destroy_region = _DtHelpDADestroyRegion;
myUiInfo.client_data = (_DtCvPointer) pDAS;
/* since we're going for chunks, set avg_char width to 1 */
myUiInfo.line_width = 0;
myUiInfo.line_height = 0;
myUiInfo.leading = 0;
myUiInfo.avg_char = 1;
myUiInfo.nl_to_space = pDAS->nl_to_space;
/*
* Get the title and charsets associated with the volume title.
* The format of the returned information is
* [type,charset/fontptr,]type,string/spc
*/
result = _DtHelpCeGetVolumeFlag(volume_handle);
_DtHelpProcessLock();
if (result == 1)
result = _DtHelpCeGetSdlVolTitleChunks(volume_handle, &myUiInfo,
&titleChunks);
else if (result == 0)
result = _DtHelpCeGetCcdfVolTitleChunks(
(_DtHelpVolume) volume_handle,
&myUiInfo,
&titleChunks);
_DtHelpProcessUnlock();
if (result != -1)
result = FormatChunksToXmString(pDAS, True, titleChunks,
ret_title, ret_list, ret_mod);
_DtHelpCeUnlockVolume(lockInfo);
return result;
} /* End _DtHelpFormatVolumeTitle */
/******************************************************************************
* Function: int _DtHelpFormatIndexEntries (DtHelpDispAreaStruct *pDAS,
* _XvhVolume volume,
* XmString *ret_title, XmFontList *ret_list,
* Boolean *ret_mod)
*
* Parameters:
* volume Specifies the Help Volume the information
* is associated with.
* ret_cnt number of valid entries in the array
* ret_words Returns NULL-termintaed array of
* XmStrings containing the words.
* ret_list Specifies the current font list being used.
* Returns a new font list if new character
* sets are added to it.
* ret_mod Returns True if fonts were added to the
* font list.
*
* Returns: 0 if successful, -1 if errors
*
* errno Values:
*
* Purpose: _DtHelpFormatIndexEntries formats index entries and associates
* the correct font with it.
*
******************************************************************************/
int
_DtHelpFormatIndexEntries(
XtPointer client_data,
_DtHelpVolumeHdl volume_handle,
int *ret_cnt,
XmString **ret_words,
XmFontList *ret_list,
Boolean *ret_mod )
{
int i;
int result = -1;
void *titleChunks[4];
char *charSet;
char **keyWords;
Boolean myMod = False;
XmFontList oldList;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
/*
* Check the parameters
*/
if (ret_words == NULL || ret_list == NULL || ret_mod == NULL)
{
errno = EINVAL;
return -1;
}
*ret_mod = False;
charSet = _DtHelpGetVolumeLocale(volume_handle);
if (charSet != NULL)
{
*ret_cnt = _DtHelpCeGetKeywordList(volume_handle, &keyWords);
if (*ret_cnt > 0)
{
*ret_words = (XmString *) malloc (sizeof(XmString) * (*ret_cnt+1));
if (*ret_words == NULL)
return -1;
/* the order of the string ptr and charset ptr in the titleChunks
is determined by the order of the if(..) tests on the
flags and subsequent processing in FormatChunksToXmString() */
titleChunks[0] = (void *) (DT_HELP_CE_STRING | DT_HELP_CE_CHARSET);
titleChunks[1] = (void *) charSet;
titleChunks[3] = (void *) DT_HELP_CE_END;
for (i = 0, result = 0; result == 0 && i < *ret_cnt; i++)
{
oldList = *ret_list;
titleChunks[2] = (void *) keyWords[i];
result = FormatChunksToXmString(pDAS, False, titleChunks,
&(*ret_words)[i], ret_list, &myMod);
if (myMod == True)
{
/*
* if the list has been modified before,
* free the previously modified list.
*/
if (True == *ret_mod)
XmFontListFree(oldList);
*ret_mod = True;
}
}
(*ret_words)[i] = NULL;
}
free(charSet);
}
return result;
} /* End _DtHelpFormatIndexEntries */
/******************************************************************************
* Function: int _DtHelpFormatTopic (
* DtHelpDispAreaStruct *pDAS,
* _DtHelpVolumeHdl volume,
* char *id_string,
* Boolean look_at_id,
* XtPointer *ret_handle)
*
* Parameters:
* pDAS Specifies the display area to use.
* volume Specifies the Help Volume the information
* is associated with.
* id_string Specifies the location id for the topic.
* This location id can be contained in a
* topic.
* look_at_id Specifies whether or not to start the
* display of the topic at the location id.
* ret_handle Returns a handle to the topic information
* including the number of paragraphs and the
* id match segment.
*
* Returns: 0 if successful.
* -1 if errors.
* -2 if the id was not found.
* -3 if unable to format the topic.
*
* errno Values:
*
* Purpose: _DtHelpParseTopic accesses and parses Help topics.
*
******************************************************************************/
int
_DtHelpFormatTopic(
XtPointer client_data,
_DtHelpVolumeHdl volume,
char *id_string,
Boolean look_at_id,
XtPointer *ret_handle )
{
char *filename = NULL;
int offset;
int result = -2;
_DtHelpCeLockInfo lockInfo;
_FrmtUiInfo myUiInfo = defUiInfo;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
_DtCvTopicInfo *topic = NULL;
if (_DtHelpCeLockVolume(volume, &lockInfo) != 0)
return -1;
if (_DtHelpCeFindId(volume,id_string,lockInfo.fd,&filename,&offset)==True)
{
if (look_at_id == False)
id_string = NULL;
myUiInfo.load_graphic = _DtHelpDALoadGraphic;
myUiInfo.resolve_spc = _DtHelpDAResolveSpc;
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.exec_filter = pDAS->exec_filter;
myUiInfo.destroy_region = _DtHelpDADestroyRegion;
myUiInfo.client_data = (_DtCvPointer) pDAS;
myUiInfo.line_width = pDAS->lineThickness;
myUiInfo.line_height = pDAS->lineHeight;
myUiInfo.leading = pDAS->leading;
myUiInfo.avg_char = (int)(pDAS->charWidth / 10 +
((pDAS->charWidth % 10) ? 1 : 0));
myUiInfo.nl_to_space = pDAS->nl_to_space;
result = _DtHelpCeGetVolumeFlag(volume);
_DtHelpProcessLock();
if (result == 1)
result = _DtHelpCeParseSdlTopic(volume,
&myUiInfo,
lockInfo.fd, offset,
id_string, True, &topic);
else if (result == 0)
result = _DtHelpCeFrmtCcdfTopic((_DtHelpVolume) volume,
filename, offset,
id_string,
&myUiInfo, &topic);
_DtHelpProcessUnlock();
*ret_handle = (XtPointer) topic;
if (result != 0)
result = -3;
if (filename != NULL)
free(filename);
}
_DtHelpCeUnlockVolume(lockInfo);
return result;
} /* End _DtHelpFormatTopic */
/******************************************************************************
* Function: int _DtHelpGetAsciiVolumeTitle (
*
* Parameters: vol Specifies the loaded volume.
* retTitle Returns the title of the volume. This string is
* owned by the caller and must be freed.
*
* Return Value: 0 if successful, -1 if a failure occurs
*
* errno Values: CEErrorMalloc
* EINVAL 'vol' or 'retTitle' is NULL.
* CEErrorMissingTitleRes
* 'vol' does not contain the resource
* 'Title' or 'title' or the resource
* is zero length.
*
* Purpose: Get the title of a volume.
*
******************************************************************************/
int
_DtHelpGetAsciiVolumeTitle (
XtPointer client_data,
_DtHelpVolumeHdl volume,
char **ret_title)
{
int result;
_FrmtUiInfo myUiInfo = defUiInfo;
DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
/*
* What type of volume is it?
*/
result = _DtHelpCeGetVolumeFlag(volume);
if (1 == result)
{
/*
* set up my UI information
*/
myUiInfo.load_graphic = _DtHelpDALoadGraphic;
myUiInfo.resolve_spc = _DtHelpDAResolveSpc;
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.exec_filter = pDAS->exec_filter;
myUiInfo.destroy_region = _DtHelpDADestroyRegion;
myUiInfo.client_data = (_DtCvPointer) pDAS;
/* since we're going for a string, set avg_char width to 1 */
myUiInfo.line_width = 0;
myUiInfo.line_height = 0;
myUiInfo.leading = 0;
myUiInfo.avg_char = 1;
myUiInfo.nl_to_space = pDAS->nl_to_space;
_DtHelpProcessLock();
result = _DtHelpCeFrmtSDLVolTitleToAscii(volume, &myUiInfo, ret_title);
}
else if (0 == result)
{
_DtHelpProcessLock();
result = _DtHelpCeGetCcdfVolumeTitle(volume, ret_title);
}
_DtHelpProcessUnlock();
return result;
}
/*****************************************************************************
* Function: int _DtHelpFormatToc (
* _DtHelpVolumeHdl volume, id);
*
* Parameters:
* canvas Specifies the handle for the canvas.
*
* Returns: -1 if errors.
* 0 if no errors.
* 1 if empty path.
*
* Purpose:
*
*****************************************************************************/
int
_DtHelpFormatToc (
DtHelpDispAreaStruct *pDAS,
_DtHelpVolumeHdl volume,
char *id,
char **ret_id,
XtPointer *ret_handle)
{
int result = 0;
_DtCvTopicPtr topic = NULL;
_DtHelpCeLockInfo lockInfo;
if (volume == NULL || id == NULL)
return -1;
/*
* This becomes my volume; want to ensure that it doesn't
* get closed out from under me, so tell the system that
* i'm using it.
*/
if (_DtHelpCeLockVolume(volume, &lockInfo) != 0)
return -1;
result = _DtHelpCeMapTargetToId(volume, id, ret_id);
if (result == 0)
{
_FrmtUiInfo myUiInfo = defUiInfo;
myUiInfo.client_data = (XtPointer) pDAS;
myUiInfo.load_graphic = _DtHelpDALoadGraphic;
myUiInfo.resolve_spc = _DtHelpDAResolveSpc;
myUiInfo.load_font = _DtHelpDAResolveFont;
myUiInfo.exec_filter = pDAS->exec_filter;
myUiInfo.destroy_region = _DtHelpDADestroyRegion;
myUiInfo.client_data = (_DtCvPointer) pDAS;
myUiInfo.line_width = pDAS->lineThickness;
myUiInfo.line_height = pDAS->lineHeight;
myUiInfo.leading = pDAS->leading;
myUiInfo.avg_char = (int)(pDAS->charWidth / 10 +
((pDAS->charWidth % 10) ? 1 : 0));
myUiInfo.nl_to_space = pDAS->nl_to_space;
result = _DtHelpCeGetVolumeFlag(volume);
_DtHelpProcessLock();
if (result == 1)
result = _DtHelpCeFrmtSdlPathAndChildren(volume,
&myUiInfo,
lockInfo.fd,
*ret_id, &topic);
else if (result == 0)
result = _DtHelpCeFrmtCcdfPathAndChildren(volume,
*ret_id,
&myUiInfo, &topic);
_DtHelpProcessUnlock();
*ret_handle = (XtPointer) topic;
}
/*
* didn't successfully format a path, so close my copy
* of the volume.
*/
else
_DtHelpCloseVolume (volume);
_DtHelpCeUnlockVolume(lockInfo);
return result;
} /* End _DtHelpFormatToc */