#include "copyright.h"

/* Copyright 	Massachusetts Institute of Technology  1985, 1986, 1987 */
/* $XConsortium: XParseGeom.c,v 11.13 88/09/06 16:09:29 jim Exp $ */

#include "Xlibint.h"
#include "Xutil.h"

#ifdef notdef

/*
 * Returns pointer to first char ins search which is also in what, else NULL.
 */
static char *
strscan (search, what)
  char *search, *what;
{
  int i, len = strlen (what);
  char c;

  while ((c = *(search++)) != NULL)
    for (i = 0; i < len; i++)
      if (c == what[i])
	return (--search);
  return (NULL);
}

#endif

/*
 * XParseGeometry parses strings of the form
 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where width, height,
 * xoffset, and yoffset are unsigned integers. Example:  "=80x24+300-49" The
 * equal sign is optional. It returns a bitmask that indicates which of the
 * four values were actually found in the string.  For each value found, the
 * corresponding argument is updated;  for each value not found, the
 * corresponding argument is left unchanged.
 */

int
ReadInteger (string, NextString)
  register char *string;
  char **NextString;
{
  register int Result = 0;
  int Sign = 1;

  if (*string == '+')
    string++;
  else if (*string == '-') {
    string++;
    Sign = -1;
  }
  for (; (*string >= '0') && (*string <= '9'); string++) {
    Result = (Result * 10) + (*string - '0');
  }
  *NextString = string;
  if (Sign >= 0)
    return (Result);
  else
    return (-Result);
}

int
XParseGeometry (string, x, y, width, height)
  char *string;
  int *x, *y;
  unsigned int *width, *height;	/* RETURN */
{
  int mask = NoValue;
  register char *strind;
  unsigned int tempWidth, tempHeight;
  int tempX, tempY;
  char *nextCharacter;

  if ((string == NULL) || (*string == '\0'))
    return (mask);
  if (*string == '=')
    string++;			/* ignore possible '=' at beg of geometry
				 * spec */

  strind = string;
  if (*strind != '+' && *strind != '-' && *strind != 'x') {
    tempWidth = ReadInteger (strind, &nextCharacter);
    if (strind == nextCharacter)
      return (0);
    strind = nextCharacter;
    mask |= WidthValue;
  }

  if (*strind == 'x') {
    strind++;
    tempHeight = ReadInteger (strind, &nextCharacter);
    if (strind == nextCharacter)
      return (0);
    strind = nextCharacter;
    mask |= HeightValue;
  }

  if ((*strind == '+') || (*strind == '-')) {
    if (*strind == '-') {
      strind++;
      tempX = -ReadInteger (strind, &nextCharacter);
      if (strind == nextCharacter)
	return (0);
      strind = nextCharacter;
      mask |= XNegative;

    }
    else {
      strind++;
      tempX = ReadInteger (strind, &nextCharacter);
      if (strind == nextCharacter)
	return (0);
      strind = nextCharacter;
    }
    mask |= XValue;
    if ((*strind == '+') || (*strind == '-')) {
      if (*strind == '-') {
	strind++;
	tempY = -ReadInteger (strind, &nextCharacter);
	if (strind == nextCharacter)
	  return (0);
	strind = nextCharacter;
	mask |= YNegative;

      }
      else {
	strind++;
	tempY = ReadInteger (strind, &nextCharacter);
	if (strind == nextCharacter)
	  return (0);
	strind = nextCharacter;
      }
      mask |= YValue;
    }
  }

  /*
   * If strind isn't at the end of the string the it's an invalid geometry
   * specification.
   */

  if (*strind != '\0')
    return (0);

  if (mask & XValue)
    *x = tempX;
  if (mask & YValue)
    *y = tempY;
  if (mask & WidthValue)
    *width = tempWidth;
  if (mask & HeightValue)
    *height = tempHeight;
  return (mask);
}
