Annotation of mstools/samples/sdktools/dlgedit/include.c, revision 1.1

1.1     ! root        1: 
        !             2: /******************************************************************************\
        !             3: *       This is a part of the Microsoft Source Code Samples. 
        !             4: *       Copyright (C) 1993 Microsoft Corporation.
        !             5: *       All rights reserved. 
        !             6: *       This source code is only intended as a supplement to 
        !             7: *       Microsoft Development Tools and/or WinHelp documentation.
        !             8: *       See these sources for detailed information regarding the 
        !             9: *       Microsoft samples programs.
        !            10: \******************************************************************************/
        !            11: 
        !            12: /****************************** Module Header *******************************
        !            13: * Module Name: include.c
        !            14: *
        !            15: * This module contains routines that manipulate the linked lists
        !            16: * of labels (symbols plus id values).
        !            17: *
        !            18: * Functions:
        !            19: *    AddLabel()
        !            20: *    FindLabel()
        !            21: *    FindID()
        !            22: *    FindIDInRes()
        !            23: *    DeleteLabel()
        !            24: *    IsSymbol()
        !            25: *    IDToLabel()
        !            26: *    LabelToID()
        !            27: *    FreeLabels()
        !            28: *
        !            29: * Comments:
        !            30: *
        !            31: * The following describes the linked lists of LABEL structures that
        !            32: * contain all the symbols that are in the include file.  It is
        !            33: * important that these structures and lists be maintained properly
        !            34: * for the udpating of the include file to occur properly.
        !            35: *
        !            36: * The following fields are in the LABEL structure:
        !            37: *
        !            38: *   npNext   - points to * the next label in the list.  This is NULL 
        !            39: *              for the last link in the list.  
        !            40: *   pszLabel - points to a null terminated, allocated string that 
        !            41: *              has the symbol.  This needs to be free'd if the structure
        !            42: *              is free'd.
        !            43: *   id       - the current id value for this symbol.
        !            44: *   idOrig   - the id value as read from the include file.  This
        !            45: *              field is used to determine if the id value has been changed 
        !            46: *              or not, so it is the same as the id unless the user has 
        !            47: *              modified the id value of the symbol.  
        !            48: *   fpos     - the file pointer offset to the "#" in the "#define" in 
        !            49: *              the include file as it was read in.  This field is used 
        !            50: *              to determine where the "#define" line starts in the
        !            51: *              file.  If the label is added by the user (it does not exist 
        !            52: *              in the include file) this field will be set to FPOS_MAX.
        !            53: *   nValueOffset - the offset in bytes from the fpos value to the start of 
        !            54: *              the id value in the "#define" line in the include file.  This 
        !            55: *              will be ignored if fpos is set to FPOS_MAX.
        !            56: *
        !            57: * The order of the linked lists of labels are very important.  The order
        !            58: * will be exactly the same as is read from the include file.  This
        !            59: * allows any changes to be merged back out to the new  include file
        !            60: * when it is saved.  If any labels are added by the user, they will be
        !            61: * added to the end of the list.  The start of the new ones is detected
        !            62: * by the first label with an fpos value of FPOS_MAX (which all the
        !            63: * new ones should have).  Because the order of the new labels is not
        !            64: * critical (they will be added to the end of the include file) the
        !            65: * new labels are sorted by id value.  Because the id values given
        !            66: * to dialogs and controls by default are ascending, this will tend to
        !            67: * group dialogs labels and their associated control labels together.
        !            68: *
        !            69: * Linked lists of labels always come in pairs.  There is the linked
        !            70: * list of current labels (ones read from the include file followed
        !            71: * by labels added later), and there is also a separate linked list
        !            72: * of "deleted" labels.  The deleted label list is required because
        !            73: * when the include file is saved, the deleted labels must be removed
        !            74: * from the include file, so the label structure for them (which
        !            75: * contains their file offset and so on) must be kept around.  When
        !            76: * the user deletes a label, it is removed from the current label
        !            77: * linked list and added to the deleted label list.  The deleted label
        !            78: * list MUST be kept in order by fpos, but if the label that is
        !            79: * deleted is one that did not exist in the include file (its fpos
        !            80: * was FPOS_MAX) then it does NOT have to be added to the deleted
        !            81: * list, and can simply be free'd.  When the user adds a new label,
        !            82: * the deleted list is searched first to see if the label was
        !            83: * previously deleted.  If it was, it is removed from the deleted list
        !            84: * and placed back in the current label list (sorted by fpos, of
        !            85: * course).  If it is a new label, it is simply added to the new labels
        !            86: * at the end of the list (sorted by id value).  This is why every
        !            87: * function that takes a pointer to the head of a label list also
        !            88: * takes a pointer to the head of a deleted label list.
        !            89: *
        !            90: ****************************************************************************/
        !            91: 
        !            92: #include "dlgedit.h"
        !            93: #include "dlgfuncs.h"
        !            94: #include "dlgextrn.h"
        !            95: 
        !            96: 
        !            97: 
        !            98: /************************************************************************
        !            99: * AddLabel
        !           100: *
        !           101: * This adds a symbol/label into the given include file list.  The deleted
        !           102: * include list is first searched and if a deleted label is found with the
        !           103: * same symbol, it is transfered back into the include list.  This is to
        !           104: * handle the case where a user reads in an include file, deletes one of
        !           105: * the labels then adds it back in later.
        !           106: *
        !           107: * The npLabelSkip parameter is for the special case of changing a
        !           108: * label.  This is done by adding a new label then deleting the old
        !           109: * one, so setting this parameter prevents a spurious "duplicate id"
        !           110: * message during the add.
        !           111: *
        !           112: * The pfDups parameter can be used to set a flag when there is a
        !           113: * duplicate symbol, or a symbol with the same id found in the include
        !           114: * list.  If this parameter is NULL, nothing is returned and the appropriate
        !           115: * error message is displayed if a dup is found.  If this parameter is not
        !           116: * NULL, it is assumed to point to a BOOL that will be set to TRUE if either
        !           117: * of these conditions is found.  The flag will NOT be set to FALSE if this
        !           118: * condition is NOT found, so AddLabel can be used in a loop and when the
        !           119: * loop is done, *pfDups will contain TRUE if there were any duplicates.
        !           120: * Note that if pfDups is not NULL, the dup error messages will be supressed.
        !           121: * This routine truncates pszLabel at the first space.  It can allocate 
        !           122: * memory for a LABEL and for its string. The pplHead and pplDelHead lists
        !           123: * are updated.
        !           124: *
        !           125: * Arguments:
        !           126: *     LPTSTR pszLabel      = The label to add.
        !           127: *     INT id               = The id associated with rgchLabel.
        !           128: *     DWORD fpos           = The file position in the include file where the
        !           129: *                            "#define" for this label starts, or FPOS_MAX
        !           130: *                            if the label was not read from an include file.
        !           131: *     INT nValueOffset     = Offset from fpos where the id value begins.
        !           132: *     NPLABEL *pplHead     = Pointer to the head of the include list to use.
        !           133: *     NPLABEL *pplDelHead  = Pointer to the head of the deleted include list.
        !           134: *     NPLABEL npLabelSkip  = If not NULL, points to a label to skip when
        !           135: *                            checking for duplicates.
        !           136: *     BOOL *pfDups         = Points to a BOOL that is set to TRUE if there
        !           137: *                            is a duplicate symbol or id found.
        !           138: *
        !           139: * Returns:
        !           140: *     Pointer to the allocated LABEL structure - NULL for an error.
        !           141: *
        !           142: ************************************************************************/
        !           143: 
        !           144: NPLABEL AddLabel(
        !           145:     LPTSTR pszLabel,
        !           146:     INT id,
        !           147:     DWORD fpos,
        !           148:     INT nValueOffset,
        !           149:     NPLABEL *pplHead,
        !           150:     NPLABEL *pplDelHead,
        !           151:     NPLABEL npLabelSkip,
        !           152:     BOOL *pfDups)
        !           153: {
        !           154:     register NPLABEL npTmp;
        !           155:     NPLABEL npLabel;
        !           156:     NPLABEL npPrevLabel;
        !           157:     BOOL fFoundDeleted = FALSE;
        !           158: 
        !           159:     /*
        !           160:      * First check for a duplicate id or symbol.
        !           161:      */
        !           162:     for (npTmp = *pplHead; npTmp; npTmp = npTmp->npNext) {
        !           163:         if ((npTmp->id == id || lstrcmp(pszLabel, npTmp->pszLabel) == 0) &&
        !           164:                 npTmp != npLabelSkip) {
        !           165:             if (pfDups) {
        !           166:                 *pfDups = TRUE;
        !           167:             }
        !           168:             else {
        !           169:                 if (npTmp->id == id)
        !           170:                     Message(MSG_LABELDUPID);
        !           171:                 else
        !           172:                     Message(MSG_SYMEXISTS);
        !           173:             }
        !           174: 
        !           175:             return NULL;
        !           176:         }
        !           177:     }
        !           178: 
        !           179:     /*
        !           180:      * Search for this symbol in the deleted list first.
        !           181:      */
        !           182:     npPrevLabel = NULL;
        !           183:     for (npLabel = *pplDelHead; npLabel; npLabel = npLabel->npNext) {
        !           184:         if (lstrcmp(pszLabel, npLabel->pszLabel) == 0) {
        !           185:             fFoundDeleted = TRUE;
        !           186:             break;
        !           187:         }
        !           188: 
        !           189:         npPrevLabel = npLabel;
        !           190:     }
        !           191: 
        !           192:     /*
        !           193:      * Was the label found in the deleted list?
        !           194:      */
        !           195:     if (fFoundDeleted) {
        !           196:         /*
        !           197:          * Close up the deleted list where the deleted label was.
        !           198:          */
        !           199:         if (npPrevLabel)
        !           200:             npPrevLabel->npNext = npLabel->npNext;
        !           201:         else
        !           202:             *pplDelHead = npLabel->npNext;
        !           203: 
        !           204:         /*
        !           205:          * Set the id in case the user is adding the same symbol
        !           206:          * but with a different id.
        !           207:          */
        !           208:         npLabel->id = id;
        !           209: 
        !           210:         /*
        !           211:          * Search for where the label should be inserted
        !           212:          * based on its fpos.
        !           213:          */
        !           214:         npPrevLabel = NULL;
        !           215:         for (npTmp = *pplHead; npTmp; npTmp = npTmp->npNext) {
        !           216:             if (npTmp->fpos == FPOS_MAX || npTmp->fpos > npLabel->fpos)
        !           217:                 break;
        !           218: 
        !           219:             npPrevLabel = npTmp;
        !           220:         }
        !           221:     }
        !           222:     else {
        !           223:         /*
        !           224:          * Label was not found in the deleted list.  Allocate, etc.
        !           225:          */
        !           226:         if (!(npLabel = (NPLABEL)MyAlloc(sizeof(LABEL))))
        !           227:             return NULL;
        !           228: 
        !           229:         npLabel->id = id;
        !           230:         npLabel->idOrig = id;
        !           231:         npLabel->fpos = fpos;
        !           232:         npLabel->nValueOffset = nValueOffset;
        !           233: 
        !           234:         if (!(npLabel->pszLabel =
        !           235:                 (LPTSTR)MyAlloc((lstrlen(pszLabel) + 1) * sizeof(TCHAR)))) {
        !           236:             MyFree(npLabel);
        !           237:             return NULL;
        !           238:         }
        !           239: 
        !           240:         lstrcpy(npLabel->pszLabel, pszLabel);
        !           241: 
        !           242:         /*
        !           243:          * Find where to insert the new label.  This will either be
        !           244:          * at the end of the list, or in ascending numerical order
        !           245:          * among the new labels.
        !           246:          */
        !           247:         npPrevLabel = NULL;
        !           248:         for (npTmp = *pplHead;
        !           249:                 npTmp && (npTmp->fpos != FPOS_MAX || npTmp->id < id);
        !           250:                 npTmp = npTmp->npNext)
        !           251:             npPrevLabel = npTmp;
        !           252:     }
        !           253: 
        !           254:     /*
        !           255:      * At this point, npLabel points to the label to add, either
        !           256:      * transferred from the deleted list, or allocated fresh.
        !           257:      * The variable npPrevLabel points to the label to insert
        !           258:      * after, or is NULL to indicate that the new label should
        !           259:      * be inserted at the head of the list.
        !           260:      */
        !           261: 
        !           262:     /*
        !           263:      * If this is the first label in the list, or if the
        !           264:      * first label had a greater fpos than the new label,
        !           265:      * insert the new label at the head of the list.
        !           266:      */
        !           267:     if (!npPrevLabel) {
        !           268:         npLabel->npNext = *pplHead;
        !           269:         *pplHead = npLabel;
        !           270:     }
        !           271:     /*
        !           272:      * Otherwise, insert it either in the middle of the
        !           273:      * list or at the end.
        !           274:      */
        !           275:     else {
        !           276:         npLabel->npNext = npPrevLabel->npNext;
        !           277:         npPrevLabel->npNext = npLabel;
        !           278:     }
        !           279: 
        !           280:     return npLabel;
        !           281: }
        !           282: 
        !           283: 
        !           284: 
        !           285: /************************************************************************
        !           286: * FindLabel
        !           287: *
        !           288: * Tells you if the named label is in the given include label list.
        !           289: *
        !           290: * Arguments:
        !           291: *     LPTSTR pszLabel = The label to find.
        !           292: *     NPLABEL plHead  = Head of the include list to traverse.
        !           293: *
        !           294: * Returns:
        !           295: *     NULL if the label is not found.
        !           296: *     Pointer to label structure if the label was found.
        !           297: *
        !           298: *
        !           299: ************************************************************************/
        !           300: 
        !           301: NPLABEL FindLabel(
        !           302:     LPTSTR pszLabel,
        !           303:     NPLABEL plHead)
        !           304: {
        !           305:     NPLABEL npLabel;
        !           306: 
        !           307:     for (npLabel = plHead; npLabel; npLabel = npLabel->npNext) {
        !           308:         if (lstrcmp(pszLabel, npLabel->pszLabel) == 0)
        !           309:             break;
        !           310:     }
        !           311: 
        !           312:     return npLabel;
        !           313: }
        !           314: 
        !           315: 
        !           316: 
        !           317: /************************************************************************
        !           318: * FindID
        !           319: *
        !           320: * Tells you if the named id is in the given include file buffer.
        !           321: *
        !           322: * Arguments:
        !           323: *     INT id         = The id to find.
        !           324: *     NPLABEL plHead = Head of the label list to use.
        !           325: *
        !           326: * Returns:
        !           327: *     NULL if the id was not found.
        !           328: *     Pointer to label struct if the id was found.
        !           329: *
        !           330: *
        !           331: ************************************************************************/
        !           332: 
        !           333: NPLABEL FindID(
        !           334:     INT id,
        !           335:     NPLABEL plHead)
        !           336: {
        !           337:     NPLABEL npLabel;
        !           338: 
        !           339:     for (npLabel = plHead; npLabel; npLabel = npLabel->npNext) {
        !           340:         if (npLabel->id == id)
        !           341:             break;
        !           342:     }
        !           343: 
        !           344:     return npLabel;
        !           345: }
        !           346: 
        !           347: 
        !           348: 
        !           349: /************************************************************************
        !           350: * FindIDInRes
        !           351: *
        !           352: * Tells you if the named id is used by any control in the current
        !           353: * resource list.  This also includes searching through the dialog
        !           354: * currently being edited, if there is one.
        !           355: *
        !           356: * Arguments:
        !           357: *   INT id = The id to find.
        !           358: *
        !           359: * Returns:
        !           360: *   TRUE if the id was found, or FALSE if it was not.
        !           361: *
        !           362: *
        !           363: ************************************************************************/
        !           364: 
        !           365: BOOL FindIDInRes(
        !           366:     INT id)
        !           367: {
        !           368:     INT cControls;
        !           369:     PRESLINK prl;
        !           370:     PRES pRes;
        !           371:     PDIALOGBOXHEADER pdbh;
        !           372:     PCONTROLDATA pcd;
        !           373:     NPCTYPE npc;
        !           374:     BOOL fFound = FALSE;
        !           375: 
        !           376:     /*
        !           377:      * Is there a current dialog?  If so, search it first and
        !           378:      * we will skip any image for it in the resource list (the
        !           379:      * resource list is probably out of date, anyways).
        !           380:      */
        !           381:     if (gfEditingDlg) {
        !           382:         /*
        !           383:          * Is the id the same as the current dialog's name?
        !           384:          */
        !           385:         if (IsOrd(gcd.pszDlgName) && id == (INT)OrdID(gcd.pszDlgName))
        !           386:             return TRUE;
        !           387: 
        !           388:         /*
        !           389:          * Loop through the current controls, looking for an id match.
        !           390:          */
        !           391:         for (npc = npcHead; npc; npc = npc->npcNext)
        !           392:             if (npc->id == id)
        !           393:                 return TRUE;
        !           394:     }
        !           395: 
        !           396:     for (prl = gprlHead; prl && !fFound; prl = prl->prlNext) {
        !           397:         /*
        !           398:          * Is this a dialog resource and is it NOT the current
        !           399:          * dialog being edited?  If it is the current dialog,
        !           400:          * we skip it because it is probably out of date.
        !           401:          */
        !           402:         if (prl->fDlgResource && prl != gcd.prl) {
        !           403:             if (IsOrd(prl->pszName) && id == (INT)OrdID(prl->pszName)) {
        !           404:                 fFound = TRUE;
        !           405:             }
        !           406:             else {
        !           407:                 pRes = (PRES)GlobalLock(prl->hRes);
        !           408:                 pdbh = (PDIALOGBOXHEADER)SkipResHeader(pRes);
        !           409:                 cControls = (INT)pdbh->NumberOfItems;
        !           410:                 pcd = SkipDialogBoxHeader(pdbh);
        !           411:                 while (cControls--) {
        !           412:                     if (id == (INT)pcd->wId) {
        !           413:                         fFound = TRUE;
        !           414:                         break;
        !           415:                     }
        !           416: 
        !           417:                     pcd = SkipControlData(pcd);
        !           418:                 }
        !           419: 
        !           420:                 GlobalUnlock(prl->hRes);
        !           421:             }
        !           422:         }
        !           423:     }
        !           424: 
        !           425:     return fFound;
        !           426: }
        !           427: 
        !           428: 
        !           429: 
        !           430: /************************************************************************
        !           431: * DeleteLabel
        !           432: *
        !           433: * Removes the LABEL with text pszLabel from the list of labels in
        !           434: * pplHead, closing up the link, and might add it to the deleted list.
        !           435: *
        !           436: * If the label is one that exists in the include file (fpos is valid)
        !           437: * then the label is added to the pplDelHead list in the proper position
        !           438: * (sorted ascending by fpos).  If the label does not exist in the
        !           439: * include file, there is no need to track it and it can be tossed.
        !           440: *
        !           441: * Arguments:
        !           442: *     LPTSTR pszLabel     = The text of the label to delete.
        !           443: *     NPLABEL *pplHead    = Pointer to the head of the include list to use.
        !           444: *     NPLABEL *pplDelHead = Pointer to the head of the deleted include list.
        !           445: *
        !           446: * Side Effects:
        !           447: *     Deletes from the pplHead list.
        !           448: *     Can null *pplHead if the last label is deleted.
        !           449: *     Can add to the pplDelHead list.
        !           450: *     Can free the memory associated with the LABEL and its string.
        !           451: *
        !           452: *
        !           453: ************************************************************************/
        !           454: 
        !           455: VOID DeleteLabel(
        !           456:     LPTSTR pszLabel,
        !           457:     NPLABEL *pplHead,
        !           458:     NPLABEL *pplDelHead)
        !           459: {
        !           460:     NPLABEL npLabel;
        !           461:     NPLABEL npDelLabel;
        !           462:     NPLABEL npPrevLabel;
        !           463: 
        !           464:     npPrevLabel = NULL;
        !           465:     for (npLabel = *pplHead; npLabel; npLabel = npLabel->npNext) {
        !           466:         if (lstrcmp(pszLabel, npLabel->pszLabel) == 0) {
        !           467:             /*
        !           468:              * Close up the linked list where the deleted label was.
        !           469:              */
        !           470:             if (npPrevLabel)
        !           471:                 npPrevLabel->npNext = npLabel->npNext;
        !           472:             else
        !           473:                 *pplHead = npLabel->npNext;
        !           474: 
        !           475:             /*
        !           476:              * Is this a label that is NOT in the include file?
        !           477:              * If so, just toss it away.
        !           478:              */
        !           479:             if (npLabel->fpos == FPOS_MAX) {
        !           480:                 MyFree(npLabel->pszLabel);
        !           481:                 MyFree(npLabel);
        !           482:             }
        !           483:             /*
        !           484:              * Otherwise, it must be added to the deleted list.
        !           485:              */
        !           486:             else {
        !           487:                 /*
        !           488:                  * Search for where the label should be inserted
        !           489:                  * based on its fpos.
        !           490:                  */
        !           491:                 npPrevLabel = NULL;
        !           492:                 for (npDelLabel = *pplDelHead; npDelLabel;
        !           493:                         npDelLabel = npDelLabel->npNext) {
        !           494:                     if (npDelLabel->fpos > npLabel->fpos)
        !           495:                         break;
        !           496: 
        !           497:                     npPrevLabel = npDelLabel;
        !           498:                 }
        !           499: 
        !           500:                 /*
        !           501:                  * If this is the first label in the deleted list, or
        !           502:                  * if the first label had a greater fpos than the new
        !           503:                  * label, insert the new label at the head of the list.
        !           504:                  */
        !           505:                 if (!npPrevLabel) {
        !           506:                     npLabel->npNext = *pplDelHead;
        !           507:                     *pplDelHead = npLabel;
        !           508:                 }
        !           509:                 /*
        !           510:                  * Otherwise, insert it either in the middle of the
        !           511:                  * list or at the end.
        !           512:                  */
        !           513:                 else {
        !           514:                     npLabel->npNext = npPrevLabel->npNext;
        !           515:                     npPrevLabel->npNext = npLabel;
        !           516:                 }
        !           517:             }
        !           518: 
        !           519:             break;
        !           520:         }
        !           521: 
        !           522:         npPrevLabel = npLabel;
        !           523:     }
        !           524: }
        !           525: 
        !           526: 
        !           527: 
        !           528: /****************************************************************************
        !           529: * IsSymbol
        !           530: *
        !           531: * This routine returns TRUE if the given string is a valid "C" or "RC"
        !           532: * identifier.
        !           533: *
        !           534: * Valid is:  First char is a letter or '_'.
        !           535: *
        !           536: ****************************************************************************/
        !           537: 
        !           538: BOOL IsSymbol(
        !           539:     LPTSTR pszSym)
        !           540: {
        !           541:     register TCHAR ch = *pszSym;
        !           542: 
        !           543:     return ((ch >= CHAR_CAP_A && ch <= CHAR_CAP_Z) ||
        !           544:             (ch >= CHAR_A && ch <= CHAR_Z) ||
        !           545:             (ch == CHAR_UNDERLINE));
        !           546: }
        !           547: 
        !           548: 
        !           549: 
        !           550: /************************************************************************
        !           551: * IDToLabel
        !           552: *
        !           553: * This function finds the label with the given id.
        !           554: * The first LABEL in the list with the given id will be found.
        !           555: * The label will be put in pchLabel.
        !           556: * If the id was not found then the id is converted to an ascii
        !           557: * representation and put in pchLabel.  This ascii representation
        !           558: * will be in hex notation if hex mode is in effect (unless fHexOK
        !           559: * is FALSE).
        !           560: *
        !           561: * This function special cases the IDOK and IDCANCEL id values.
        !           562: * If there happens to be a label in the include file for these values
        !           563: * then that label will be returned, but if not, either "IDOK" or
        !           564: * "IDCANCEL" will be returned.
        !           565: *
        !           566: * Arguments:
        !           567: *   LPTSTR pchLabel - Where to put the label.
        !           568: *   INT id          - The id of the label to find or match.
        !           569: *   BOOL fHexOK     - TRUE if hex representations of the id are allowed.
        !           570: *
        !           571: *
        !           572: ************************************************************************/
        !           573: 
        !           574: VOID IDToLabel(
        !           575:     LPTSTR pchLabel,
        !           576:     INT id,
        !           577:     BOOL fHexOK)
        !           578: {
        !           579:     NPLABEL npLabel;
        !           580: 
        !           581:     npLabel = FindID(id, plInclude);
        !           582: 
        !           583:     if (npLabel) {
        !           584:         lstrcpy(pchLabel, npLabel->pszLabel);
        !           585:     }
        !           586:     else {
        !           587:         if (id == IDOK && !FindLabel(ids(IDS_IDOK), plInclude)) {
        !           588:             lstrcpy(pchLabel, ids(IDS_IDOK));
        !           589:         }
        !           590:         else if (id == IDCANCEL && !FindLabel(ids(IDS_IDCANCEL), plInclude)) {
        !           591:             lstrcpy(pchLabel, ids(IDS_IDCANCEL));
        !           592:         }
        !           593:         else {
        !           594:             if (fHexOK)
        !           595:                 Myitoa(id, pchLabel);
        !           596:             else
        !           597:                 itoaw(id, pchLabel, 10);
        !           598:         }
        !           599:     }
        !           600: }
        !           601: 
        !           602: 
        !           603: 
        !           604: /************************************************************************
        !           605: * LabelToID
        !           606: *
        !           607: * This function converts a label string to its associated id value.
        !           608: * It first checks the labels in the current include file for a
        !           609: * match.  If it is not found, it then checks for some special values,
        !           610: * like "IDOK", "IDCANCEL" and "(Unused)".
        !           611: *
        !           612: * The return value will be TRUE of the label (symbol) was found, or
        !           613: * FALSE if it was not.
        !           614: *
        !           615: * Arguments:
        !           616: *   LPTSTR pszLabel - The symbol to search for.
        !           617: *   PINT pID        - Where to return the associated id, if found.
        !           618: *
        !           619: ************************************************************************/
        !           620: 
        !           621: BOOL LabelToID(
        !           622:     LPTSTR pszLabel,
        !           623:     PINT pID)
        !           624: {
        !           625:     INT id;
        !           626:     NPLABEL npLabel;
        !           627: 
        !           628:     /*
        !           629:      * Is it an existing label?
        !           630:      */
        !           631:     if (npLabel = FindLabel(pszLabel, plInclude)) {
        !           632:         id = npLabel->id;
        !           633:     }
        !           634:     /*
        !           635:      * Is it the "unused" symbol?
        !           636:      */
        !           637:     else if (lstrcmp(pszLabel, ids(IDS_UNUSED)) == 0) {
        !           638:         id = IDUNUSED;
        !           639:     }
        !           640:     /*
        !           641:      * How about the special IDOK entry?
        !           642:      */
        !           643:     else if (lstrcmp(pszLabel, ids(IDS_IDOK)) == 0) {
        !           644:         id = IDOK;
        !           645:     }
        !           646:     /*
        !           647:      * How about the special IDCANCEL entry?
        !           648:      */
        !           649:     else if (lstrcmp(pszLabel, ids(IDS_IDCANCEL)) == 0) {
        !           650:         id = IDCANCEL;
        !           651:     }
        !           652:     else {
        !           653:         return FALSE;
        !           654:     }
        !           655: 
        !           656:     *pID = id;
        !           657:     return TRUE;
        !           658: }
        !           659: 
        !           660: 
        !           661: 
        !           662: /****************************************************************************
        !           663: * FreeLabels
        !           664: *
        !           665: * This function frees the labels in the label list pointed to by
        !           666: * nppLabels, including the strings.  When it is done, the label
        !           667: * list head is set to NULL.
        !           668: *
        !           669: ****************************************************************************/
        !           670: 
        !           671: VOID FreeLabels(
        !           672:     NPLABEL *nppLabels)
        !           673: {
        !           674:     register NPLABEL npl;
        !           675:     register NPLABEL nplTemp;
        !           676: 
        !           677:     npl = *nppLabels;
        !           678: 
        !           679:     while (npl) {
        !           680:         MyFree(npl->pszLabel);
        !           681: 
        !           682:         nplTemp = npl->npNext;
        !           683: 
        !           684:         MyFree(npl);
        !           685:         npl = nplTemp;
        !           686:     }
        !           687: 
        !           688:     *nppLabels = NULL;
        !           689: }
        !           690: 
        !           691: 
        !           692: 

unix.superglobalmegacorp.com

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