Blame lib/Xm/XmStringGet.c

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