|
Packit |
b099d7 |
/* $XConsortium: XmStringGet.c /main/6 1995/09/19 23:13:21 cde-sun $ */
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "XmStringI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringComponentType
|
|
Packit |
b099d7 |
XmStringGetNextComponent(
|
|
Packit |
b099d7 |
XmStringContext context,
|
|
Packit |
b099d7 |
char **text,
|
|
Packit |
b099d7 |
XmStringTag *str_tag,
|
|
Packit |
b099d7 |
XmStringDirection *direction,
|
|
Packit |
b099d7 |
XmStringComponentType *unknown_tag,
|
|
Packit |
b099d7 |
unsigned short *unknown_length,
|
|
Packit |
b099d7 |
unsigned char **unknown_value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringComponentType type;
|
|
Packit |
b099d7 |
unsigned int len;
|
|
Packit |
b099d7 |
XtPointer val;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
type = XmeStringGetComponent((_XmStringContext) context, True, True, &len, &val;;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Case on return type */
|
|
Packit |
b099d7 |
/* Set appropriate return value and return. */
|
|
Packit |
b099d7 |
switch (type)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_DIRECTION:
|
|
Packit |
b099d7 |
*direction = *(XmStringDirection *)val;
|
|
Packit |
b099d7 |
XtFree((char *)val);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_TAG:
|
|
Packit |
b099d7 |
*str_tag = (XmStringTag)val;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_TEXT:
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_LOCALE_TEXT:
|
|
Packit |
b099d7 |
*text = (char *)val;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_SEPARATOR:
|
|
Packit |
b099d7 |
case XmSTRING_COMPONENT_END:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
*unknown_tag = type;
|
|
Packit |
b099d7 |
*unknown_length = len;
|
|
Packit |
b099d7 |
*unknown_value = (unsigned char *)val;
|
|
Packit |
b099d7 |
type = XmSTRING_COMPONENT_UNKNOWN;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
return(type);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringComponentType
|
|
Packit |
b099d7 |
XmStringPeekNextComponent(XmStringContext context)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
unsigned int len;
|
|
Packit |
b099d7 |
XtPointer val;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XmeStringGetComponent((_XmStringContext) context, False, False, &len, &val;;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* fetch the first text 'segment' of the external TCS that matches the given
|
|
Packit |
b099d7 |
* char set.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmStringGetLtoR(
|
|
Packit |
b099d7 |
XmString string,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
char **text )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringContext context;
|
|
Packit |
b099d7 |
char * t;
|
|
Packit |
b099d7 |
XmStringTag c, curtag = NULL;
|
|
Packit |
b099d7 |
XmStringDirection d;
|
|
Packit |
b099d7 |
Boolean s, is_local = FALSE, done = FALSE, is_default = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
if (!string) {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
return(FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (!tag) {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
return (FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((tag == XmFONTLIST_DEFAULT_TAG) ||
|
|
Packit |
b099d7 |
(strcmp(tag, XmFONTLIST_DEFAULT_TAG) == 0))
|
|
Packit |
b099d7 |
is_local = TRUE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*text = NULL; /* pre-condition result */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!is_local)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
curtag = _XmStringGetCurrentCharset();
|
|
Packit |
b099d7 |
is_default = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else curtag = tag;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringInitContext (&context, string);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while ( ! done)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmStringGetNextSegment (context, &t, &c, &d, &s))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (c && ((d == XmSTRING_DIRECTION_L_TO_R) ||
|
|
Packit |
b099d7 |
(d == XmSTRING_DIRECTION_UNSET)) &&
|
|
Packit |
b099d7 |
(((is_local || is_default) &&
|
|
Packit |
b099d7 |
((c == XmFONTLIST_DEFAULT_TAG) ||
|
|
Packit |
b099d7 |
(strcmp(c, XmFONTLIST_DEFAULT_TAG) == 0) ||
|
|
Packit |
b099d7 |
(strcmp(c, _XmStringGetCurrentCharset()) == 0))) ||
|
|
Packit |
b099d7 |
(curtag && (strcmp (c, curtag) == 0))))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*text = t; /* OK, pass text to caller */
|
|
Packit |
b099d7 |
done = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
XtFree (t); /* not this text */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (c)
|
|
Packit |
b099d7 |
XtFree (c); /* always dump charset */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
done = TRUE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringFreeContext (context);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
return (*text != NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|