Annotation of micropolis/src/tk/tkget.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.