|
|
1.1 ! root 1: /* ! 2: * Copyright 1985, Cognition Inc. ! 3: * This software is not supported by Cognition Inc. and is ! 4: * provided "as is". To keep the X revolution growing, please forward ! 5: * enhancements and bug fixes to anyone who is interested. ! 6: */ ! 7: #ifndef lint ! 8: static char *rcsid_xshell_c = "$Header: xutils.c,v 10.3 86/02/01 16:19:44 tony Rel $"; ! 9: #endif ! 10: ! 11: #include <stdio.h> ! 12: #include <strings.h> ! 13: #include <ctype.h> ! 14: ! 15: /**************************************************************************** ! 16: * XParse_Window_Geometry - parses a standard X dimension string like ! 17: * ! 18: * =WIDTHxHEIGHT+XOFF+YOFF ! 19: * =WIDTHxHEIGHT-XOFF-YOFF ! 20: * ! 21: * and returns 1 if everything goes okay, else 0 so that you can use the ! 22: * routine in an if statement. Note that it will not touch the integer input ! 23: * arguments but does mung the geometry. ! 24: */ ! 25: ! 26: ! 27: #define bomb(msg) return(0) ! 28: ! 29: int XParse_Window_Geometry (geometry, widthp, heightp, ! 30: xsignp, xoffp, ysignp, yoffp) ! 31: char *geometry; ! 32: int *widthp, *heightp, *xsignp, *xoffp, *ysignp, *yoffp; ! 33: { ! 34: register char *cp; ! 35: int xoff, yoff, xsign, ysign, width, height; ! 36: ! 37: xoff = yoff = -1; /* put it in the lower right hand corner */ ! 38: xsign = ysign = 0; /* so that we can see if it is set or not */ ! 39: width = height = -1; /* ditto */ ! 40: ! 41: if (geometry != (char *) NULL) {/* normal =XxY+w+h or =XxY-w-h etc. */ ! 42: if (*geometry == '=') geometry++; /* skip = sign */ ! 43: switch (*geometry) { /* what is the first char we see? */ ! 44: case '+': /* it is the positive XOFF */ ! 45: xsign = 1; ! 46: goto get_xoff; ! 47: case '-': /* it is the negative XOFF */ ! 48: xsign = -1; ! 49: goto get_xoff; ! 50: case 'x': /* it is the HEIGHT */ ! 51: goto get_height; ! 52: default: /* it is the WIDTH */ ! 53: break; ! 54: } /*end switch*/ ! 55: cp = index (geometry, 'x'); /* find the x */ ! 56: if (cp == (char *) NULL) bomb ("width"); ! 57: *cp = '\0'; ! 58: width = atoi (geometry); ! 59: geometry = cp; /* skip to WIDTH */ ! 60: get_height: ! 61: for (cp = ++geometry; isdigit (*cp); cp++) ; ! 62: switch (*cp) { ! 63: case '\0': ! 64: height = atoi (geometry); ! 65: goto done; ! 66: case '+': ! 67: xsign = 1; ! 68: break; ! 69: case '-': ! 70: xsign = -1; ! 71: break; ! 72: default: ! 73: bomb ("height"); ! 74: } /*end switch*/ ! 75: *cp = '\0'; ! 76: height = atoi (geometry); ! 77: geometry = cp; ! 78: get_xoff: ! 79: for (cp = ++geometry; isdigit (*cp); cp++) ; ! 80: switch (*cp) { ! 81: case '\0': ! 82: xoff = atoi (geometry); ! 83: goto done; ! 84: case '+': ! 85: ysign = 1; ! 86: break; ! 87: case '-': ! 88: ysign = -1; ! 89: break; ! 90: default: ! 91: bomb ("X position"); ! 92: } /*end switch*/ ! 93: *cp = '\0'; ! 94: xoff = atoi (geometry); ! 95: geometry = cp; ! 96: for (cp = ++geometry; isdigit (*cp); cp++) ; ! 97: if (*cp != '\0') bomb ("Y position"); ! 98: yoff = atoi (geometry); ! 99: } /*end if*/ ! 100: ! 101: done: ! 102: if (width != -1) *widthp = width; ! 103: if (height != -1) *heightp = height; ! 104: ! 105: if (xsign != 0) *xsignp = xsign; ! 106: if (ysign != 0) *ysignp = ysign; ! 107: ! 108: if (xoff != -1) *xoffp = xoff; ! 109: if (yoff != -1) *yoffp = yoff; ! 110: ! 111: return (1); ! 112: ! 113: } /*end XParse_Window_Geometry*/ ! 114:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.