|
|
1.1 ! root 1: /* ! 2: * tkGet.c -- ! 3: * ! 4: * This file contains a number of "Tk_GetXXX" procedures, which ! 5: * parse text strings into useful forms for Tk. This file has ! 6: * the simpler procedures, like Tk_GetDirection and Tk_GetUid. ! 7: * The more complex procedures like Tk_GetColor are in separate ! 8: * files. ! 9: * ! 10: * Copyright 1991 Regents of the University of California ! 11: * Permission to use, copy, modify, and distribute this ! 12: * software and its documentation for any purpose and without ! 13: * fee is hereby granted, provided that the above copyright ! 14: * notice appear in all copies. The University of California ! 15: * makes no representations about the suitability of this ! 16: * software for any purpose. It is provided "as is" without ! 17: * express or implied warranty. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGet.c,v 1.5 92/08/10 09:02:46 ouster Exp $ SPRITE (Berkeley)"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <tk.h> ! 25: #include "tkconfig.h" ! 26: ! 27: /* ! 28: * The hash table below is used to keep track of all the Tk_Uids created ! 29: * so far. ! 30: */ ! 31: ! 32: static Tcl_HashTable uidTable; ! 33: static int initialized = 0; ! 34: ! 35: /* ! 36: *-------------------------------------------------------------- ! 37: * ! 38: * Tk_GetAnchor -- ! 39: * ! 40: * Given a string, return the corresponding Tk_Anchor. ! 41: * ! 42: * Results: ! 43: * The return value is a standard Tcl return result. If ! 44: * TCL_OK is returned, then everything went well and the ! 45: * position is stored at *anchorPtr; otherwise TCL_ERROR ! 46: * is returned and an error message is left in ! 47: * interp->result. ! 48: * ! 49: * Side effects: ! 50: * None. ! 51: * ! 52: *-------------------------------------------------------------- ! 53: */ ! 54: ! 55: int ! 56: Tk_GetAnchor(interp, string, anchorPtr) ! 57: Tcl_Interp *interp; /* Use this for error reporting. */ ! 58: char *string; /* String describing a direction. */ ! 59: Tk_Anchor *anchorPtr; /* Where to store Tk_Anchor corresponding ! 60: * to string. */ ! 61: { ! 62: switch (string[0]) { ! 63: case 'n': ! 64: if (string[1] == 0) { ! 65: *anchorPtr = TK_ANCHOR_N; ! 66: return TCL_OK; ! 67: } else if ((string[1] == 'e') && (string[2] == 0)) { ! 68: *anchorPtr = TK_ANCHOR_NE; ! 69: return TCL_OK; ! 70: } else if ((string[1] == 'w') && (string[2] == 0)) { ! 71: *anchorPtr = TK_ANCHOR_NW; ! 72: return TCL_OK; ! 73: } ! 74: goto error; ! 75: case 's': ! 76: if (string[1] == 0) { ! 77: *anchorPtr = TK_ANCHOR_S; ! 78: return TCL_OK; ! 79: } else if ((string[1] == 'e') && (string[2] == 0)) { ! 80: *anchorPtr = TK_ANCHOR_SE; ! 81: return TCL_OK; ! 82: } else if ((string[1] == 'w') && (string[2] == 0)) { ! 83: *anchorPtr = TK_ANCHOR_SW; ! 84: return TCL_OK; ! 85: } else { ! 86: goto error; ! 87: } ! 88: case 'e': ! 89: if (string[1] == 0) { ! 90: *anchorPtr = TK_ANCHOR_E; ! 91: return TCL_OK; ! 92: } ! 93: goto error; ! 94: case 'w': ! 95: if (string[1] == 0) { ! 96: *anchorPtr = TK_ANCHOR_W; ! 97: return TCL_OK; ! 98: } ! 99: goto error; ! 100: case 'c': ! 101: if (strncmp(string, "center", strlen(string)) == 0) { ! 102: *anchorPtr = TK_ANCHOR_CENTER; ! 103: return TCL_OK; ! 104: } ! 105: goto error; ! 106: } ! 107: ! 108: error: ! 109: Tcl_AppendResult(interp, "bad anchor position \"", string, ! 110: "\": must be n, ne, e, se, s, sw, w, nw, or center", ! 111: (char *) NULL); ! 112: return TCL_ERROR; ! 113: } ! 114: ! 115: /* ! 116: *-------------------------------------------------------------- ! 117: * ! 118: * Tk_NameOfAnchor -- ! 119: * ! 120: * Given a Tk_Anchor, return the string that corresponds ! 121: * to it. ! 122: * ! 123: * Results: ! 124: * None. ! 125: * ! 126: * Side effects: ! 127: * None. ! 128: * ! 129: *-------------------------------------------------------------- ! 130: */ ! 131: ! 132: char * ! 133: Tk_NameOfAnchor(anchor) ! 134: Tk_Anchor anchor; /* Anchor for which identifying string ! 135: * is desired. */ ! 136: { ! 137: switch (anchor) { ! 138: case TK_ANCHOR_N: return "n"; ! 139: case TK_ANCHOR_NE: return "ne"; ! 140: case TK_ANCHOR_E: return "e"; ! 141: case TK_ANCHOR_SE: return "se"; ! 142: case TK_ANCHOR_S: return "s"; ! 143: case TK_ANCHOR_SW: return "sw"; ! 144: case TK_ANCHOR_W: return "w"; ! 145: case TK_ANCHOR_NW: return "nw"; ! 146: case TK_ANCHOR_CENTER: return "center"; ! 147: } ! 148: return "unknown anchor position"; ! 149: } ! 150: ! 151: /* ! 152: *-------------------------------------------------------------- ! 153: * ! 154: * Tk_GetJoinStyle -- ! 155: * ! 156: * Given a string, return the corresponding Tk_JoinStyle. ! 157: * ! 158: * Results: ! 159: * The return value is a standard Tcl return result. If ! 160: * TCL_OK is returned, then everything went well and the ! 161: * justification is stored at *joinPtr; otherwise ! 162: * TCL_ERROR is returned and an error message is left in ! 163: * interp->result. ! 164: * ! 165: * Side effects: ! 166: * None. ! 167: * ! 168: *-------------------------------------------------------------- ! 169: */ ! 170: ! 171: int ! 172: Tk_GetJoinStyle(interp, string, joinPtr) ! 173: Tcl_Interp *interp; /* Use this for error reporting. */ ! 174: char *string; /* String describing a justification style. */ ! 175: int *joinPtr; /* Where to store join style corresponding ! 176: * to string. */ ! 177: { ! 178: int c, length; ! 179: ! 180: c = string[0]; ! 181: length = strlen(string); ! 182: ! 183: if ((c == 'b') && (strncmp(string, "bevel", length) == 0)) { ! 184: *joinPtr = JoinBevel; ! 185: return TCL_OK; ! 186: } ! 187: if ((c == 'm') && (strncmp(string, "miter", length) == 0)) { ! 188: *joinPtr = JoinMiter; ! 189: return TCL_OK; ! 190: } ! 191: if ((c == 'r') && (strncmp(string, "round", length) == 0)) { ! 192: *joinPtr = JoinRound; ! 193: return TCL_OK; ! 194: } ! 195: ! 196: Tcl_AppendResult(interp, "bad join style \"", string, ! 197: "\": must be bevel, miter, or round", ! 198: (char *) NULL); ! 199: return TCL_ERROR; ! 200: } ! 201: ! 202: /* ! 203: *-------------------------------------------------------------- ! 204: * ! 205: * Tk_NameOfJoinStyle -- ! 206: * ! 207: * Given a Tk_JoinStyle, return the string that corresponds ! 208: * to it. ! 209: * ! 210: * Results: ! 211: * None. ! 212: * ! 213: * Side effects: ! 214: * None. ! 215: * ! 216: *-------------------------------------------------------------- ! 217: */ ! 218: ! 219: char * ! 220: Tk_NameOfJoinStyle(join) ! 221: int join; /* Join style for which identifying string ! 222: * is desired. */ ! 223: { ! 224: switch (join) { ! 225: case JoinBevel: return "bevel"; ! 226: case JoinMiter: return "miter"; ! 227: case JoinRound: return "round"; ! 228: } ! 229: return "unknown join style"; ! 230: } ! 231: ! 232: /* ! 233: *-------------------------------------------------------------- ! 234: * ! 235: * Tk_GetCapStyle -- ! 236: * ! 237: * Given a string, return the corresponding Tk_CapStyle. ! 238: * ! 239: * Results: ! 240: * The return value is a standard Tcl return result. If ! 241: * TCL_OK is returned, then everything went well and the ! 242: * justification is stored at *capPtr; otherwise ! 243: * TCL_ERROR is returned and an error message is left in ! 244: * interp->result. ! 245: * ! 246: * Side effects: ! 247: * None. ! 248: * ! 249: *-------------------------------------------------------------- ! 250: */ ! 251: ! 252: int ! 253: Tk_GetCapStyle(interp, string, capPtr) ! 254: Tcl_Interp *interp; /* Use this for error reporting. */ ! 255: char *string; /* String describing a justification style. */ ! 256: int *capPtr; /* Where to store cap style corresponding ! 257: * to string. */ ! 258: { ! 259: int c, length; ! 260: ! 261: c = string[0]; ! 262: length = strlen(string); ! 263: ! 264: if ((c == 'b') && (strncmp(string, "butt", length) == 0)) { ! 265: *capPtr = CapButt; ! 266: return TCL_OK; ! 267: } ! 268: if ((c == 'p') && (strncmp(string, "projecting", length) == 0)) { ! 269: *capPtr = CapProjecting; ! 270: return TCL_OK; ! 271: } ! 272: if ((c == 'r') && (strncmp(string, "round", length) == 0)) { ! 273: *capPtr = CapRound; ! 274: return TCL_OK; ! 275: } ! 276: ! 277: Tcl_AppendResult(interp, "bad cap style \"", string, ! 278: "\": must be butt, projecting, or round", ! 279: (char *) NULL); ! 280: return TCL_ERROR; ! 281: } ! 282: ! 283: /* ! 284: *-------------------------------------------------------------- ! 285: * ! 286: * Tk_NameOfCapStyle -- ! 287: * ! 288: * Given a Tk_CapStyle, return the string that corresponds ! 289: * to it. ! 290: * ! 291: * Results: ! 292: * None. ! 293: * ! 294: * Side effects: ! 295: * None. ! 296: * ! 297: *-------------------------------------------------------------- ! 298: */ ! 299: ! 300: char * ! 301: Tk_NameOfCapStyle(cap) ! 302: int cap; /* Cap style for which identifying string ! 303: * is desired. */ ! 304: { ! 305: switch (cap) { ! 306: case CapButt: return "butt"; ! 307: case CapProjecting: return "projecting"; ! 308: case CapRound: return "round"; ! 309: } ! 310: return "unknown cap style"; ! 311: } ! 312: ! 313: /* ! 314: *-------------------------------------------------------------- ! 315: * ! 316: * Tk_GetJustify -- ! 317: * ! 318: * Given a string, return the corresponding Tk_Justify. ! 319: * ! 320: * Results: ! 321: * The return value is a standard Tcl return result. If ! 322: * TCL_OK is returned, then everything went well and the ! 323: * justification is stored at *justifyPtr; otherwise ! 324: * TCL_ERROR is returned and an error message is left in ! 325: * interp->result. ! 326: * ! 327: * Side effects: ! 328: * None. ! 329: * ! 330: *-------------------------------------------------------------- ! 331: */ ! 332: ! 333: int ! 334: Tk_GetJustify(interp, string, justifyPtr) ! 335: Tcl_Interp *interp; /* Use this for error reporting. */ ! 336: char *string; /* String describing a justification style. */ ! 337: Tk_Justify *justifyPtr; /* Where to store Tk_Justify corresponding ! 338: * to string. */ ! 339: { ! 340: int c, length; ! 341: ! 342: c = string[0]; ! 343: length = strlen(string); ! 344: ! 345: if ((c == 'l') && (strncmp(string, "left", length) == 0)) { ! 346: *justifyPtr = TK_JUSTIFY_LEFT; ! 347: return TCL_OK; ! 348: } ! 349: if ((c == 'r') && (strncmp(string, "right", length) == 0)) { ! 350: *justifyPtr = TK_JUSTIFY_RIGHT; ! 351: return TCL_OK; ! 352: } ! 353: if ((c == 'c') && (strncmp(string, "center", length) == 0)) { ! 354: *justifyPtr = TK_JUSTIFY_CENTER; ! 355: return TCL_OK; ! 356: } ! 357: if ((c == 'f') && (strncmp(string, "fill", length) == 0)) { ! 358: *justifyPtr = TK_JUSTIFY_FILL; ! 359: return TCL_OK; ! 360: } ! 361: ! 362: Tcl_AppendResult(interp, "bad justification \"", string, ! 363: "\": must be left, right, center, or fill", ! 364: (char *) NULL); ! 365: return TCL_ERROR; ! 366: } ! 367: ! 368: /* ! 369: *-------------------------------------------------------------- ! 370: * ! 371: * Tk_NameOfJustify -- ! 372: * ! 373: * Given a Tk_Justify, return the string that corresponds ! 374: * to it. ! 375: * ! 376: * Results: ! 377: * None. ! 378: * ! 379: * Side effects: ! 380: * None. ! 381: * ! 382: *-------------------------------------------------------------- ! 383: */ ! 384: ! 385: char * ! 386: Tk_NameOfJustify(justify) ! 387: Tk_Justify justify; /* Justification style for which ! 388: * identifying string is desired. */ ! 389: { ! 390: switch (justify) { ! 391: case TK_JUSTIFY_LEFT: return "left"; ! 392: case TK_JUSTIFY_RIGHT: return "right"; ! 393: case TK_JUSTIFY_CENTER: return "center"; ! 394: case TK_JUSTIFY_FILL: return "fill"; ! 395: } ! 396: return "unknown justification style"; ! 397: } ! 398: ! 399: /* ! 400: *---------------------------------------------------------------------- ! 401: * ! 402: * Tk_GetUid -- ! 403: * ! 404: * Given a string, this procedure returns a unique identifier ! 405: * for the string. ! 406: * ! 407: * Results: ! 408: * This procedure returns a Tk_Uid corresponding to the "string" ! 409: * argument. The Tk_Uid has a string value identical to string ! 410: * (strcmp will return 0), but it's guaranteed that any other ! 411: * calls to this procedure with a string equal to "string" will ! 412: * return exactly the same result (i.e. can compare Tk_Uid ! 413: * *values* directly, without having to call strcmp on what they ! 414: * point to). ! 415: * ! 416: * Side effects: ! 417: * New information may be entered into the identifier table. ! 418: * ! 419: *---------------------------------------------------------------------- ! 420: */ ! 421: ! 422: Tk_Uid ! 423: Tk_GetUid(string) ! 424: char *string; /* String to convert. */ ! 425: { ! 426: int dummy; ! 427: ! 428: if (!initialized) { ! 429: Tcl_InitHashTable(&uidTable, TCL_STRING_KEYS); ! 430: initialized = 1; ! 431: } ! 432: return (Tk_Uid) Tcl_GetHashKey(&uidTable, ! 433: Tcl_CreateHashEntry(&uidTable, string, &dummy)); ! 434: } ! 435: ! 436: /* ! 437: *-------------------------------------------------------------- ! 438: * ! 439: * Tk_GetScreenMM -- ! 440: * ! 441: * Given a string, returns the number of screen millimeters ! 442: * corresponding to that string. ! 443: * ! 444: * Results: ! 445: * The return value is a standard Tcl return result. If ! 446: * TCL_OK is returned, then everything went well and the ! 447: * screen distance is stored at *doublePtr; otherwise ! 448: * TCL_ERROR is returned and an error message is left in ! 449: * interp->result. ! 450: * ! 451: * Side effects: ! 452: * None. ! 453: * ! 454: *-------------------------------------------------------------- ! 455: */ ! 456: ! 457: int ! 458: Tk_GetScreenMM(interp, tkwin, string, doublePtr) ! 459: Tcl_Interp *interp; /* Use this for error reporting. */ ! 460: Tk_Window tkwin; /* Window whose screen determines conversion ! 461: * from centimeters and other absolute ! 462: * units. */ ! 463: char *string; /* String describing a screen distance. */ ! 464: double *doublePtr; /* Place to store converted result. */ ! 465: { ! 466: char *end; ! 467: double d; ! 468: ! 469: d = strtod(string, &end); ! 470: if (end == string) { ! 471: error: ! 472: Tcl_AppendResult(interp, "bad screen distance \"", string, ! 473: "\"", (char *) NULL); ! 474: return TCL_ERROR; ! 475: } ! 476: while ((*end != '\0') && isspace(*end)) { ! 477: end++; ! 478: } ! 479: switch (*end) { ! 480: case 0: ! 481: d /= WidthOfScreen(Tk_Screen(tkwin)); ! 482: d *= WidthMMOfScreen(Tk_Screen(tkwin)); ! 483: break; ! 484: case 'c': ! 485: d *= 10; ! 486: end++; ! 487: break; ! 488: case 'i': ! 489: d *= 25.4; ! 490: end++; ! 491: break; ! 492: case 'm': ! 493: end++; ! 494: break; ! 495: case 'p': ! 496: d *= 25.4/72.0; ! 497: end++; ! 498: break; ! 499: default: ! 500: goto error; ! 501: } ! 502: while ((*end != '\0') && isspace(*end)) { ! 503: end++; ! 504: } ! 505: if (*end != 0) { ! 506: goto error; ! 507: } ! 508: *doublePtr = d; ! 509: return TCL_OK; ! 510: } ! 511: ! 512: /* ! 513: *-------------------------------------------------------------- ! 514: * ! 515: * Tk_GetPixels -- ! 516: * ! 517: * Given a string, returns the number of pixels corresponding ! 518: * to that string. ! 519: * ! 520: * Results: ! 521: * The return value is a standard Tcl return result. If ! 522: * TCL_OK is returned, then everything went well and the ! 523: * rounded pixel distance is stored at *intPtr; otherwise ! 524: * TCL_ERROR is returned and an error message is left in ! 525: * interp->result. ! 526: * ! 527: * Side effects: ! 528: * None. ! 529: * ! 530: *-------------------------------------------------------------- ! 531: */ ! 532: ! 533: int ! 534: Tk_GetPixels(interp, tkwin, string, intPtr) ! 535: Tcl_Interp *interp; /* Use this for error reporting. */ ! 536: Tk_Window tkwin; /* Window whose screen determines conversion ! 537: * from centimeters and other absolute ! 538: * units. */ ! 539: char *string; /* String describing a justification style. */ ! 540: int *intPtr; /* Place to store converted result. */ ! 541: { ! 542: char *end; ! 543: double d; ! 544: ! 545: d = strtod(string, &end); ! 546: if (end == string) { ! 547: error: ! 548: Tcl_AppendResult(interp, "bad screen distance \"", string, ! 549: "\"", (char *) NULL); ! 550: return TCL_ERROR; ! 551: } ! 552: while ((*end != '\0') && isspace(*end)) { ! 553: end++; ! 554: } ! 555: switch (*end) { ! 556: case 0: ! 557: break; ! 558: case 'c': ! 559: d *= 10*WidthOfScreen(Tk_Screen(tkwin)); ! 560: d /= WidthMMOfScreen(Tk_Screen(tkwin)); ! 561: end++; ! 562: break; ! 563: case 'i': ! 564: d *= 25.4*WidthOfScreen(Tk_Screen(tkwin)); ! 565: d /= WidthMMOfScreen(Tk_Screen(tkwin)); ! 566: end++; ! 567: break; ! 568: case 'm': ! 569: d *= WidthOfScreen(Tk_Screen(tkwin)); ! 570: d /= WidthMMOfScreen(Tk_Screen(tkwin)); ! 571: end++; ! 572: break; ! 573: case 'p': ! 574: d *= (25.4/72.0)*WidthOfScreen(Tk_Screen(tkwin)); ! 575: d /= WidthMMOfScreen(Tk_Screen(tkwin)); ! 576: end++; ! 577: break; ! 578: default: ! 579: goto error; ! 580: } ! 581: while ((*end != '\0') && isspace(*end)) { ! 582: end++; ! 583: } ! 584: if (*end != 0) { ! 585: goto error; ! 586: } ! 587: if (d < 0) { ! 588: *intPtr = (int) (d - 0.5); ! 589: } else { ! 590: *intPtr = (int) (d + 0.5); ! 591: } ! 592: return TCL_OK; ! 593: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.