00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <stdio.h>
00028 #include <string.h>
00029
00030 #include <malloc.h>
00031 #include <assert.h>
00032 #include "kapi_parse.h"
00033 #include "kapi_error.h"
00034
00035 #include "kapi_debug.h"
00036 #include "kapi_internal.h"
00037 #include "kapi_util.h"
00038
00039 tokval_t kapi_lval;
00040 int kapi_cLine;
00041
00042 extern FILE *yyin;
00043 extern char *yytext;
00044
00045 knobs_t *kapi_pknobsCurrent;
00046
00047 static void AddEnums( stn_t *pstnType, valn_t *pvalnIdents, int fAllowRepeats );
00048 static void AppendEnums( stn_t *pstnType, valn_t *pvalnIdents, int fAllowRepeats);
00049
00050 static int fMatch_valn_list( valn_t *pvalnList1, valn_t *pvalnList2, tty_t tty );
00051
00052 void pvalhdrCopy( valhdr_t *pvalhdrTarget, valhdr_t *pvalhdrSource );
00053 int fFailCheckLimitValue( valhdr_t *pvalhdr, ed_t *ped );
00054 int fFailCheckLimitValue2( valn_t *pvalnCheck, valhdr_t *pvalhdrLimit );
00055
00056 void SetVariableValueLimit( valhdr_t *pvalhdr, limp_t *plimpNew );
00057 static int posInEnumList( char *pch, valn_t *pvalnEnums );
00058 static int fFailCheck( valhdr_t *pvalhdrRHS, ed_t *ped, stn_t *pstnLHS, char * );
00059 static int fCheckIdenticalVal( valhdr_t *pvalhdrRHS, ed_t *pedRHSVal );
00060 static int fEqual_val( val_t *pval1, val_t *pval2, tty_t tty );
00061
00062 static void KAPI2X_checkPortTypes( knobs_t *pknobs,
00063 stn_t *pstnArray, char *, valhdr_t * );
00064
00065 static void KAPI2X_update_cluster0Cutports( knobs_t *pknobs, stn_t *pstnType );
00066 static void KAPI3X_update_cluster0Cutports( knobs_t *pknobs, stn_t *pstnArray,
00067 char *, valhdr_t * );
00068 static void AddStringToAttr( stn_t *pstnAttr, char *pch );
00069
00070 void
00071 kapi_ParseFile( knobs_t *pknobs, FILE *fp )
00072 {
00073 if ( fp == NULL ) {
00074 return;
00075 }
00076
00077
00078 kapi_cntSemanticWarning = 0;
00079 kapi_cntSyntaxWarning = 0;
00080 kapi_cntSemanticError = 0;
00081 kapi_cntSyntaxError = 0;
00082 kapi_cLine = 1;
00083 kapi_pknobsCurrent = pknobs;
00084 yyin = fp;
00085
00086 yyparse();
00087 }
00088
00089 void
00090 kapi_error()
00091 {
00092 fprintf( stderr, "Error found line %4d\n", kapi_cLine );
00093 }
00094
00095 void
00096 pstnTypeInit( stn_t *pstnType )
00097 {
00098 pstnType->u.tfi.tty = ttyENUM;
00099 pstnType->u.tfi.pvalnEnums = NULL;
00100 pstnType->u.tfi.pvalnPreviousEnums = NULL;
00101 pstnType->u.tfi.nEnumConst = 0;
00102 pstnType->u.tfi.pstnIdent = pstnType;
00103 pstnType->u.tfi.tredefStatus = tredefSTATUS_OK;
00104
00105 pstnType->u.tfi.ptfiBitmaskBaseType = NULL;
00106 pstnType->u.tfi.ptfiArrayEltType = NULL;
00107 pstnType->u.tfi.ptfiArrayIndexType = NULL;
00108 pstnType->fRHS = 0;
00109 }
00110
00111
00112
00113
00114 static void
00115 AppendEnums( stn_t *pstnType, valn_t *pvalnIdents, int fAllowRepeats )
00116 {
00117 valn_t *pvalnOldList;
00118 valn_t *pvalnNewList;
00119 valn_t *pvalnRun;
00120
00121
00122 pvalnOldList=pstnType->u.tfi.pvalnEnums;
00123
00124
00125 AddEnums(pstnType, pvalnIdents, fAllowRepeats );
00126
00127 pvalnNewList=pstnType->u.tfi.pvalnEnums;
00128
00129
00130 pvalnRun=pvalnOldList;
00131
00132 while (pvalnRun->pvalnNext!=NULL)
00133 pvalnRun = pvalnRun->pvalnNext;
00134
00135 pvalnRun->pvalnNext=pvalnNewList;
00136
00137 pstnType->u.tfi.pvalnEnums=pvalnOldList;
00138 }
00139
00140
00141 static void
00142 AddEnums( stn_t *pstnType, valn_t *pvalnIdents, int fAllowRepeats )
00143 {
00144 stn_t *pstnRun;
00145 valn_t *pvalnRun;
00146
00147 pstnType->u.tfi.pvalnEnums = pvalnIdents;
00148 pvalnRun = pvalnIdents;
00149 while ( pvalnRun ) {
00150 pstnRun = kapi_pstnLookup( kapi_pknobsCurrent, pvalnRun->val.pch );
00151 if ( pstnRun->ity == ityUNKNOWN ||
00152 ( pstnRun->ity == ityENUMCONST && pstnRun->fExpected )
00153 || fAllowRepeats ) {
00154 pstnRun->ity = ityENUMCONST;
00155 pstnRun->fExpected = 0;
00156 pstnRun->u.efi.ptfiBaseType = &(pstnType->u.tfi);
00157 pstnType->u.tfi.nEnumConst++;
00158 } else {
00159 kapi_Error_pch1( kapi_cLine, 0,
00160 "Identifier '%s' already defined, cannot reuse as enum",
00161 pstnRun->pchName );
00162 }
00163 pvalnRun = pvalnRun->pvalnNext;
00164 }
00165 }
00166
00167 static void
00168 DefineType( stn_t *pstnType, valn_t *pvalnIdents, limp_t *plimpList )
00169 {
00170 limp_t *plimp;
00171
00172 pstnTypeInit( pstnType );
00173 pstnType->ity = ityTYPENAME;
00174 pstnType->fExpected = 0;
00175 pstnType->plimpListParse = plimpList;
00176
00177 plimp = plimpLookup( plimpList, kapi_pknobsCurrent->pchToolname );
00178 if ( plimp ) {
00179 pstnType->u.tfi.tredefStatus = tredefSTATUS_MARKED_NOREDEFINE;
00180 if ( plimp->valhdrValues.vals != valsNOREDEFINE ) {
00181 kapi_Error( kapi_cLine, 0, "Limits on types can only be specified as 'noredefine'" );
00182 }
00183 }
00184
00185 AddEnums( pstnType, pvalnIdents, 0 );
00186 }
00187
00188 static valn_t *
00189 pvalnRemoveEnums( stn_t *pstnType )
00190 {
00191
00192 valn_t *pvalnRun, *pvalnDelList;
00193
00194 pvalnRun = pstnType->u.tfi.pvalnEnums;
00195 while ( pvalnRun ) {
00196 (void)kapi_pstnDelete( kapi_pknobsCurrent, pvalnRun->val.pch );
00197
00198
00199 pvalnRun = pvalnRun->pvalnNext;
00200 }
00201
00202 pvalnDelList = pstnType->u.tfi.pvalnEnums;
00203 pstnType->u.tfi.pvalnEnums = NULL;
00204
00205 return( pvalnDelList );
00206 }
00207
00208 int
00209 fInEnumList( char *pch, valn_t *pvalnEnums )
00210 {
00211 valn_t *pvalnRun;
00212
00213 #ifdef TRACE_REDEF
00214 fprintf( stderr, "\t searching %s\n", pch );
00215 #endif
00216 pvalnRun = pvalnEnums;
00217 while ( pvalnRun ) {
00218 #ifdef TRACE_REDEF
00219 fprintf( stderr, "\t\tchecking %s\n", pvalnRun->val.pch );
00220 #endif
00221 if ( ! strcmp( pvalnRun->val.pch, pch ) ) {
00222 return( 1 );
00223 }
00224 pvalnRun = pvalnRun->pvalnNext;
00225 }
00226
00227 return( 0 );
00228 }
00229
00230 static void
00231 RedefineVariable_scalar( stn_t *pstnType, stn_t *pstnVar )
00232 {
00233 vfi_t *pvfi;
00234 valn_t *pvaln;
00235
00236
00237
00238
00239
00240 #ifdef TRACE_REDEF
00241 fprintf( stderr, "Variable %s being examined for redefine\n",
00242 pstnVar->pchName );
00243 fprintf( stderr, "\tMatched type - scalar variable\n" );
00244 #endif
00245
00246
00247
00248 pvfi = &( pstnVar->u.vfi );
00249 if ( pvfi->pedList == NULL ) {
00250 return;
00251 }
00252
00253
00254 pvaln = pvfi->pedList->valhdrValue.pvalnList;
00255 if ( ! fInEnumList( pvaln->val.pch, pvfi->ptfi->pvalnEnums ) ) {
00256 #ifdef TRACE_REDEF
00257 fprintf( stderr, "\tValue %s undefined\n", pvaln->val.pch );
00258 #endif
00259 pvfi->pedList->valhdrValue.pvalnList = NULL;
00260 pvfi->pedList->valhdrValue.vals = valsUNSET;
00261 }
00262 }
00263
00264 void
00265 RedefineBitmask( valhdr_t *pvalhdr, tfi_t *ptfiBitmaskBaseType )
00266 {
00267 valn_t *pvaln, *pvalnPrev;
00268
00269
00270 pvaln = pvalhdr->pvalnList->pvalnNext;
00271 pvalnPrev = pvalhdr->pvalnList;
00272 while ( pvaln ) {
00273 if ( ! fInEnumList( pvaln->val.pch,
00274 ptfiBitmaskBaseType->pvalnEnums ) ) {
00275 #ifdef TRACE_REDEF
00276 fprintf( stderr, "\tBit %s (%x) turned off\n", pvaln->val.pch, (int)pvaln );
00277 #endif
00278 pvalnPrev->pvalnNext = pvaln->pvalnNext;
00279 pvaln = pvaln->pvalnNext;
00280 } else {
00281 pvalnPrev = pvaln;
00282 pvaln = pvaln->pvalnNext;
00283 }
00284 }
00285
00286
00287 pvaln = pvalhdr->pvalnList;
00288 if ( ! fInEnumList( pvaln->val.pch,
00289 ptfiBitmaskBaseType->pvalnEnums ) ) {
00290 #ifdef TRACE_REDEF
00291 fprintf( stderr, "\tBit %s turned off (1st)\n", pvaln->val.pch );
00292 #endif
00293 pvalhdr->pvalnList = pvalhdr->pvalnList->pvalnNext;
00294 pvalhdr->vals = valsUNSET;
00295 }
00296 }
00297
00298 static void
00299 RedefineVariable_scalar_bitmask( stn_t *pstnType, stn_t *pstnVar )
00300 {
00301 vfi_t *pvfi;
00302 valhdr_t *pvalhdr;
00303 valn_t *pvaln, *pvalnPrev;
00304
00305
00306
00307 #ifdef TRACE_REDEF
00308 fprintf( stderr, "Variable %s being examined for redefine\n",
00309 pstnVar->pchName );
00310 fprintf( stderr, "\tMatched - bitmask base type - scalar\n" );
00311 #endif
00312
00313
00314
00315 pvfi = &( pstnVar->u.vfi );
00316 if ( pvfi->pedList == NULL ) {
00317 return;
00318 }
00319
00320 assert( pvfi->ptfi->tty == ttyBITMASK );
00321 pvalhdr = &( pvfi->pedList->valhdrValue );
00322
00323
00324
00325
00326
00327
00328 RedefineBitmask( pvalhdr, pvfi->ptfi->ptfiBitmaskBaseType );
00329
00330
00331 pvaln = pvalhdr->pvalnList->pvalnNext;
00332 pvalnPrev = pvalhdr->pvalnList;
00333 while ( pvaln ) {
00334 if ( ! fInEnumList( pvaln->val.pch,
00335 pvfi->ptfi->ptfiBitmaskBaseType->pvalnEnums ) ) {
00336 #ifdef TRACE_REDEF
00337 fprintf( stderr, "\tBit %s (%x) turned off\n", pvaln->val.pch, (int)pvaln );
00338 #endif
00339 pvalnPrev->pvalnNext = pvaln->pvalnNext;
00340 pvaln = pvaln->pvalnNext;
00341 KDebug_printval( stderr, pvfi->ptfi, pvfi->pedList, 4 );
00342 } else {
00343 pvalnPrev = pvaln;
00344 pvaln = pvaln->pvalnNext;
00345 }
00346 }
00347
00348
00349 pvaln = pvalhdr->pvalnList;
00350 if ( ! fInEnumList( pvaln->val.pch,
00351 pvfi->ptfi->ptfiBitmaskBaseType->pvalnEnums ) ) {
00352 #ifdef TRACE_REDEF
00353 fprintf( stderr, "\tBit %s turned off (1st)\n", pvaln->val.pch );
00354 #endif
00355 pvalhdr->pvalnList = pvalhdr->pvalnList->pvalnNext;
00356 pvalhdr->vals = valsUNSET;
00357 }
00358 }
00359
00360 static void
00361 RedefineVariable_array_elt( stn_t *pstnType, stn_t *pstnVar )
00362 {
00363 ed_t *pedRun, *pedRunPrev;
00364 vfi_t *pvfi;
00365
00366
00367
00368
00369
00370
00371
00372 #ifdef TRACE_REDEF
00373 fprintf( stderr, "Variable %s being examined for redefine\n",
00374 pstnVar->pchName );
00375 fprintf( stderr, "\tMatched elt type - array variable\n" );
00376 #endif
00377
00378
00379
00380 pvfi = &( pstnVar->u.vfi );
00381 if ( pvfi->pedList == NULL ) {
00382 return;
00383 }
00384
00385 assert( pvfi->ptfi->tty == ttyARRAY );
00386
00387
00388
00389
00390
00391 pedRun = pvfi->pedList->pedNext;
00392 pedRunPrev = pvfi->pedList;
00393 while ( pedRun ) {
00394 if ( ! fInEnumList( pedRun->valhdrValue.pvalnList->val.pch,
00395 pvfi->ptfi->ptfiArrayEltType->pvalnEnums ) ) {
00396 #ifdef TRACE_REDEF
00397 fprintf( stderr, "\tElt (%s) at idx (%s) removed\n",
00398 pedRun->valhdrValue.pvalnList->val.pch,
00399 pedRun->pchIndexName );
00400 #endif
00401 pedRunPrev->pedNext = pedRun->pedNext;
00402 pedRun = pedRun->pedNext;
00403 } else {
00404 pedRunPrev = pedRun;
00405 pedRun = pedRun->pedNext;
00406 }
00407 }
00408
00409
00410 pedRun = pvfi->pedList;
00411 if ( ! fInEnumList( pedRun->valhdrValue.pvalnList->val.pch,
00412 pvfi->ptfi->ptfiArrayEltType->pvalnEnums ) ) {
00413 #ifdef TRACE_REDEF
00414 fprintf( stderr, "\tElt (%s) at idx (%s) removed\n",
00415 pedRun->valhdrValue.pvalnList->val.pch,
00416 pedRun->pchIndexName );
00417 #endif
00418 pvfi->pedList = pvfi->pedList->pedNext;
00419 }
00420 }
00421
00422 static void
00423 RedefineVariable_array_idx( stn_t *pstnType, stn_t *pstnVar )
00424 {
00425 int fIndexAll;
00426 vfi_t *pvfi;
00427 ed_t *pedRun, *pedRunPrev;
00428
00429
00430
00431
00432
00433
00434
00435 #ifdef TRACE_REDEF
00436 fprintf( stderr, "Variable %s being examined for redefine\n",
00437 pstnVar->pchName );
00438 fprintf( stderr, "\tMatched idx type - array variable\n" );
00439 #endif
00440
00441
00442
00443 pvfi = &( pstnVar->u.vfi );
00444 if ( pvfi->pedList == NULL ) {
00445 return;
00446 }
00447
00448 assert( pvfi->ptfi->tty == ttyARRAY );
00449
00450
00451
00452
00453
00454
00455 pedRun = pvfi->pedList->pedNext;
00456 pedRunPrev = pvfi->pedList;
00457 while ( pedRun ) {
00458
00459 fIndexAll = ! strcmp( pedRun->pchIndexName, "*" );
00460
00461 if ( !fIndexAll && ! fInEnumList( pedRun->pchIndexName,
00462 pvfi->ptfi->ptfiArrayIndexType->pvalnEnums ) ) {
00463 #ifdef TRACE_REDEF
00464 fprintf( stderr, "\tIdx (%s) with elt ( ",
00465 pedRun->pchIndexName,
00466 pedRun->valhdrValue.pvalnList->val.pch );
00467 KDebug_printval( stderr, pvfi->ptfi->ptfiArrayEltType, pedRun, 0 );
00468 fprintf( stderr, " ) removed\n" );
00469 #endif
00470 pedRunPrev->pedNext = pedRun->pedNext;
00471 pedRun = pedRun->pedNext;
00472 } else {
00473 pedRunPrev = pedRun;
00474 pedRun = pedRun->pedNext;
00475 }
00476 }
00477
00478
00479 pedRun = pvfi->pedList;
00480 fIndexAll = ! strcmp( pedRun->pchIndexName, "*" );
00481 if ( !fIndexAll && ! fInEnumList( pedRun->pchIndexName,
00482 pvfi->ptfi->ptfiArrayIndexType->pvalnEnums ) ) {
00483 #ifdef TRACE_REDEF
00484 fprintf( stderr, "\tIdx (%s) with elt (%s) removed\n",
00485 pedRun->pchIndexName,
00486 pedRun->valhdrValue.pvalnList->val.pch );
00487 #endif
00488 pvfi->pedList = pvfi->pedList->pedNext;
00489 }
00490
00491 }
00492
00493 static void
00494 RedefineVariable_array_elt_bitmask( stn_t *pstnType, stn_t *pstnVar )
00495 {
00496 ed_t *pedRun;
00497 vfi_t *pvfi;
00498
00499
00500
00501
00502
00503
00504 #ifdef TRACE_REDEF
00505 fprintf( stderr, "Variable %s being examined for redefine\n",
00506 pstnVar->pchName );
00507 fprintf( stderr, "\tMatched bitmask base type of elt - array variable\n" );
00508 #endif
00509
00510
00511
00512 pvfi = &( pstnVar->u.vfi );
00513 if ( pvfi->pedList == NULL ) {
00514 return;
00515 }
00516
00517 assert( pvfi->ptfi->tty == ttyARRAY );
00518
00519
00520
00521
00522
00523 pedRun = pvfi->pedList;
00524 while ( pedRun ) {
00525 #ifdef TRACE_REDEF
00526 fprintf( stderr, "\tElt at idx (%s) being checked\n",
00527 pedRun->pchIndexName );
00528 #endif
00529 RedefineBitmask( &(pedRun->valhdrValue),
00530 pvfi->ptfi->ptfiArrayEltType->ptfiBitmaskBaseType );
00531 pedRun = pedRun->pedNext;
00532 }
00533 }
00534
00535 static void
00536 RedefineVariable( stn_t *pstnType, valn_t *pvalnVar )
00537 {
00538 stn_t *pstnVar;
00539 tfi_t *ptfiTmp;
00540
00541
00542 pstnVar = kapi_pstnLookup( kapi_pknobsCurrent, pvalnVar->val.pch );
00543 assert( pstnVar->ity == ityVARNAME );
00544
00545 ptfiTmp = pstnVar->u.vfi.ptfi;
00546
00547 switch ( pstnVar->u.vfi.ptfi->tty ) {
00548 case ttyARRAY: {
00549 tfi_t *ptfiTmpElt, *ptfiTmpIdx;
00550
00551 ptfiTmpElt = ptfiTmp->ptfiArrayEltType;
00552 ptfiTmpIdx = ptfiTmp->ptfiArrayIndexType;
00553
00554 if ( ptfiTmpElt->pstnIdent == pstnType ) {
00555 RedefineVariable_array_elt( pstnType, pstnVar );
00556 }
00557 if ( ptfiTmpIdx->pstnIdent == pstnType ) {
00558 RedefineVariable_array_idx( pstnType, pstnVar );
00559 }
00560 if ( ptfiTmpElt->tty == ttyBITMASK
00561 && ptfiTmpElt->ptfiBitmaskBaseType->pstnIdent == pstnType ) {
00562 RedefineVariable_array_elt_bitmask( pstnType, pstnVar );
00563 }
00564 break;
00565 }
00566 case ttyBITMASK: {
00567 if ( ptfiTmp->ptfiBitmaskBaseType->pstnIdent == pstnType ) {
00568 RedefineVariable_scalar_bitmask( pstnType, pstnVar );
00569 }
00570 break;
00571 }
00572 default: {
00573 if ( ptfiTmp->pstnIdent == pstnType ) {
00574 RedefineVariable_scalar( pstnType, pstnVar );
00575 }
00576 }
00577 }
00578
00579 }
00580
00581
00582 static void
00583 RedefineType( stn_t *pstnType, valn_t *pvalnIdents, limp_t *plimpList )
00584 {
00585 valn_t *pvalnVar;
00586
00587
00588 pstnType->u.tfi.pvalnPreviousEnums = pvalnRemoveEnums( pstnType );
00589 pstnType->u.tfi.nEnumConst = 0;
00590 pstnType->u.tfi.tredefStatus = tredefSTATUS_ALREADY_REDEFINED;
00591
00592
00593 AddEnums( pstnType, pvalnIdents, 1 );
00594
00595
00596
00597
00598
00599
00600
00601 pvalnVar = kapi_pknobsCurrent->pvalnVarList;
00602 while ( pvalnVar ) {
00603 RedefineVariable( pstnType, pvalnVar );
00604 pvalnVar = pvalnVar->pvalnNext;
00605 }
00606 }
00607
00608 static int
00609 fIdenticalEnumTypeDefinition( stn_t *pstnType, valhdr_t *pvalhdrIdents )
00610 {
00611 return( fMatch_valn_list( pstnType->u.tfi.pvalnEnums, pvalhdrIdents->pvalnList,
00612 ttySTRING ) );
00613 }
00614
00615
00616
00617 void kapi_ProcessAppendDecl( stn_t *pstnType, valhdr_t *pvalhdrIdents)
00618 {
00619 valn_t *pvalnIdents;
00620 pvalnIdents = pvalhdrIdents->pvalnList;
00621
00622
00623 if ( (pstnType->ity != ityTYPENAME) ||
00624 ( pstnType->ity == ityTYPENAME && pstnType->fExpected ) ) {
00625 kapi_Error_pch1( kapi_cLine, 0, "Cannot append to undefined type '%s'.", pstnType->pchName );
00626 return;
00627 }
00628 AppendEnums( pstnType, pvalnIdents, 0 );
00629 return;
00630 }
00631
00632
00633 void kapi_ProcessTypeDecl( stn_t *pstnType, valhdr_t *pvalhdrIdents, limp_t *plimpList )
00634 {
00635 valn_t *pvalnIdents;
00636
00637 valn_t *pvalnType;
00638
00639
00640 pvalnIdents = pvalhdrIdents->pvalnList;
00641
00642
00643 if ( pstnType->ity == ityUNKNOWN ||
00644 ( pstnType->ity == ityTYPENAME && pstnType->fExpected ) ) {
00645
00646
00647 DefineType( pstnType, pvalnIdents, plimpList );
00648
00649
00650 pvalnType = pvalnMakeIdent( pstnType->pchName );
00651
00652 pvalnType->pvalnNext = kapi_pknobsCurrent->pvalnTypeList;
00653 kapi_pknobsCurrent->pvalnTypeList = pvalnType;
00654
00655
00656 } else if ( pstnType->ity == ityTYPENAME ) {
00657 int fOk;
00658
00659 fOk = fIdenticalEnumTypeDefinition( pstnType, pvalhdrIdents );
00660
00661
00662
00663
00664
00665
00666
00667 switch ( pstnType->u.tfi.tredefStatus ) {
00668 case tredefSTATUS_OK: {
00669 RedefineType( pstnType, pvalnIdents, plimpList );
00670 break;
00671 }
00672 case tredefSTATUS_MARKED_NOREDEFINE: {
00673 if ( !fOk ) {
00674 kapi_Error_pch1( kapi_cLine, 0,
00675 "Type %s marked as noredefine earlier, cannot define here",
00676 pstnType->pchName );
00677 }
00678 break;
00679 }
00680 case tredefSTATUS_ALREADY_REDEFINED: {
00681 if ( !fOk ) {
00682 kapi_Error_pch1( kapi_cLine, 0,
00683 "Type %s cannot be redefined due to earlier redefinition",
00684 pstnType->pchName );
00685 }
00686 break;
00687 }
00688 case tredefSTATUS_USED_IN_LIMIT: {
00689 if ( !fOk ) {
00690 kapi_Error_pch1( kapi_cLine, 0,
00691 "Type %s cannot be redefined -- its components were used in a limit statement earlier",
00692 pstnType->pchName );
00693 }
00694 break;
00695 }
00696 default: {
00697 assert( 0 );
00698 }
00699 }
00700
00701
00702 } else {
00703 kapi_Error_pch1( kapi_cLine, 0, "Identifier '%s' already defined, cannot reuse as typename", pstnType->pchName );
00704 }
00705
00706
00707
00708
00709
00710 if ( 0 == strcmp( pstnType->pchName, "port_t" ) ) {
00711 kapi_Warning(0,0,"kapi 2.x port_t compatability not supported!");
00712 }
00713 }
00714
00715 int
00716 pstnEnum2idx( stn_t *pstnEnum )
00717 {
00718 tfi_t *ptfiBaseType;
00719 valn_t *pvalnRun;
00720 int cnt;
00721
00722 if ( pstnEnum == NULL || pstnEnum->pchName == NULL ) {
00723 return( -1 );
00724 }
00725
00726 ptfiBaseType = pstnEnum->u.efi.ptfiBaseType;
00727 assert( ptfiBaseType->tty == ttyENUM );
00728
00729 cnt = 0;
00730 pvalnRun = ptfiBaseType->pvalnEnums;
00731 while ( pvalnRun && strcmp( pstnEnum->pchName, pvalnRun->val.pch ) ) {
00732 cnt++;
00733 pvalnRun = pvalnRun->pvalnNext;
00734 }
00735 assert( pvalnRun );
00736 return( cnt );
00737 }
00738
00739
00740
00741 void
00742 kapi_ProcessAttrDecl( stn_t *pstnAttr, char *pchAttr )
00743 {
00744 valn_t *pvalnAttr;
00745
00746
00747 if ( pstnAttr->ity == ityUNKNOWN ||
00748 ( pstnAttr->ity == ityATTRIBUTENAME && pstnAttr->fExpected ) ) {
00749 pstnAttr->ity = ityATTRIBUTENAME;
00750 pstnAttr->fExpected = 0;
00751 pstnAttr->u.afih.u.pafi = NULL;
00752 pstnAttr->u.afih.nAttr = 0;
00753 AddStringToAttr( pstnAttr, pchAttr );
00754
00755
00756 pvalnAttr = pvalnMakeIdent( pstnAttr->pchName );
00757 pvalnAttr->pvalnNext = kapi_pknobsCurrent->pvalnAttrList;
00758 kapi_pknobsCurrent->pvalnAttrList = pvalnAttr;
00759
00760 } else if ( pstnAttr->ity == ityATTRIBUTENAME ) {
00761 AddStringToAttr( pstnAttr, pchAttr );
00762
00763
00764 } else {
00765 kapi_Error_pch1( kapi_cLine, 0, "%s already defined", pstnAttr->pchName );
00766 }
00767 }
00768
00769 static int
00770 fEqual_val( val_t *pval1, val_t *pval2, tty_t tty )
00771 {
00772 switch( tty ) {
00773 case ttySTRING: {
00774 return( !strcmp( pval1->pch, pval2->pch ) );
00775 break;
00776 }
00777 case ttyINT: {
00778 return( pval1->i == pval2->i );
00779 break;
00780 }
00781 case ttyREAL: {
00782 return( pval1->r == pval2->r );
00783 break;
00784 }
00785 case ttyBITMASK: {
00786 return( fEqual_bv( &( pval1->bv ), &( pval2->bv ) ) );
00787 break;
00788 }
00789 default: {
00790 assert( 0 );
00791 }
00792 }
00793 return 0;
00794 }
00795
00796 static int
00797 fMatch_valn_list( valn_t *pvalnList1, valn_t *pvalnList2, tty_t tty )
00798 {
00799 valn_t *pvalnRun1, *pvalnRun2;
00800
00801 pvalnRun1 = pvalnList1;
00802 pvalnRun2 = pvalnList2;
00803 while ( pvalnRun1 != NULL && pvalnRun2 != NULL ) {
00804 if ( ! fEqual_val( &( pvalnRun1->val ), &( pvalnRun2->val ), tty ) ) {
00805 return( 0 );
00806 }
00807
00808 pvalnRun1 = pvalnRun1->pvalnNext;
00809 pvalnRun2 = pvalnRun2->pvalnNext;
00810 }
00811
00812
00813 return( pvalnRun1 == pvalnRun2 );
00814 }
00815
00816 static int
00817 fExactTypeMatch( tfi_t *ptfi1, tfi_t *ptfi2 )
00818 {
00819 #define RETURN_FAIL_IF( cond ) \
00820 if ( ( cond ) ) { \
00821 return( 0 ); \
00822 }
00823
00824 RETURN_FAIL_IF( ptfi1->tty != ptfi2->tty );
00825
00826 switch ( ptfi1->tty ) {
00827 case ttyENUM: {
00828 RETURN_FAIL_IF( ptfi1->nEnumConst != ptfi2->nEnumConst );
00829 return( fMatch_valn_list( ptfi1->pvalnEnums, ptfi2->pvalnEnums, ttySTRING ) );
00830 break;
00831 }
00832 case ttyARRAY: {
00833 int fOk;
00834
00835 RETURN_FAIL_IF( ptfi1->tty != ptfi2->tty );
00836 fOk = fExactTypeMatch( ptfi1->ptfiArrayEltType, ptfi2->ptfiArrayEltType );
00837 return( fOk
00838 && fExactTypeMatch( ptfi1->ptfiArrayIndexType,
00839 ptfi2->ptfiArrayIndexType ) );
00840 break;
00841 }
00842 case ttyBITMASK: {
00843 return( fExactTypeMatch( ptfi1->ptfiBitmaskBaseType,
00844 ptfi2->ptfiBitmaskBaseType ) );
00845 break;
00846 }
00847
00848 case ttyIDENT: {
00849 return( !strcmp( ptfi1->pstnIdent->pchName, ptfi2->pstnIdent->pchName ) );
00850 break;
00851 }
00852
00853 case ttyINT:
00854 case ttySTRING:
00855 case ttyREAL: {
00856 return( ptfi1->tty == ptfi2->tty );
00857 break;
00858 }
00859
00860 default: {
00861 assert( 0 );
00862 break;
00863 }
00864 }
00865 return 0;
00866 }
00867
00868 static int
00869 fIdenticalVarDecl( stn_t *pstnVar, tfi_t *ptfi )
00870 {
00871
00872 assert( pstnVar->ity == ityVARNAME );
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882 return ( fExactTypeMatch( ptfi, pstnVar->u.vfi.ptfi ) );
00883 }
00884
00885
00886 void
00887 kapi_ProcessVarDecl( stn_t *pstnVar, tfi_t *ptfi )
00888 {
00889 valn_t *pvalnVar;
00890
00891
00892 if (ptfi == NULL)
00893 {
00894 kapi_Error(kapi_cLine,1,"Bad variable declaration!");
00895 return;
00896 }
00897
00898
00899 if ( pstnVar->ity == ityUNKNOWN ||
00900 ( pstnVar->ity == ityVARNAME && pstnVar->fExpected == 1 ) ) {
00901
00902 pstnVar->ity = ityVARNAME;
00903 pstnVar->fExpected = 0;
00904 pstnVar->u.vfi.ptfi = ptfi;
00905
00906
00907 pvalnVar = pvalnMakeIdent( pstnVar->pchName );
00908 pvalnVar->pvalnNext = kapi_pknobsCurrent->pvalnVarList;
00909 kapi_pknobsCurrent->pvalnVarList = pvalnVar;
00910
00911
00912
00913 if ( ptfi->tty == ttyARRAY ) {
00914 assert( ptfi->ptfiArrayIndexType->pstnIdent->ity == ityTYPENAME );
00915 assert( ptfi->ptfiArrayIndexType->tty == ttyENUM ||
00916 ptfi->ptfiArrayIndexType->tty == ttySTRING );
00917 }
00918
00919 pstnVar->u.vfi.pedList = NULL;
00920
00921
00922 } else if ( pstnVar->ity == ityVARNAME ) {
00923 int fOk;
00924
00925 fOk = fIdenticalVarDecl( pstnVar, ptfi );
00926
00927
00928
00929
00930
00931
00932
00933 if ( !fOk ) {
00934 kapi_Error_pch1( kapi_cLine, 0, "Variable %s already defined",
00935 pstnVar->pchName );
00936 }
00937
00938
00939 } else {
00940 kapi_Error_pch1( kapi_cLine, 0, "Identifier '%s' already defined, cannot reuse as variable name", pstnVar->pchName );
00941 }
00942 }
00943
00944 void
00945 TurnOnNoRedefine( tfi_t *ptfiBase, tredef_t tredef )
00946 {
00947 if ( ptfiBase->tredefStatus == tredefSTATUS_OK ) {
00948 ptfiBase->tredefStatus = tredef;
00949 }
00950 }
00951
00952 static int
00953 iEnumUpperGetRange( valhdr_t *pvalhdr )
00954 {
00955 valn_t *pvalnLower, *pvalnUpper;
00956 stn_t *pstnUpper;
00957 int iUpper;
00958
00959 pvalnLower = pvalhdr->pvalnList;
00960 if ( pvalnLower == NULL || pvalnLower->pvalnNext == NULL ) {
00961 kapi_Error( kapi_cLine, 0, "Range specification bad" );
00962 }
00963 pvalnUpper = pvalnLower->pvalnNext;
00964
00965 pstnUpper = kapi_pstnLookup( kapi_pknobsCurrent, pvalnUpper->val.pch );
00966
00967 iUpper = pstnEnum2idx( pstnUpper );
00968
00969 return( iUpper );
00970 }
00971
00972 static int
00973 iEnumLowerGetRange( valhdr_t *pvalhdr )
00974 {
00975 valn_t *pvalnLower;
00976 stn_t *pstnLower;
00977 int iLower;
00978
00979 pvalnLower = pvalhdr->pvalnList;
00980 if ( pvalnLower == NULL || pvalnLower->pvalnNext == NULL ) {
00981 kapi_Error( kapi_cLine, 0, "Range specification bad" );
00982 }
00983
00984 pstnLower = kapi_pstnLookup( kapi_pknobsCurrent, pvalnLower->val.pch );
00985
00986 iLower = pstnEnum2idx( pstnLower );
00987
00988 return( iLower );
00989 }
00990
00991 static int
00992 iUpperGetRange( valhdr_t *pvalhdr )
00993 {
00994 valn_t *pvalnLower, *pvalnUpper;
00995
00996
00997 pvalnLower = pvalhdr->pvalnList;
00998 if ( pvalnLower == NULL || pvalnLower->pvalnNext == NULL ) {
00999 kapi_Error( kapi_cLine, 0, "Range specification bad" );
01000 }
01001 pvalnUpper = pvalnLower->pvalnNext;
01002
01003 return( pvalnUpper->val.i );
01004 }
01005
01006 static int
01007 iLowerGetRange( valhdr_t *pvalhdr )
01008 {
01009 valn_t *pvalnLower;
01010
01011
01012 pvalnLower = pvalhdr->pvalnList;
01013 if ( pvalnLower == NULL || pvalnLower->pvalnNext == NULL ) {
01014 kapi_Error( kapi_cLine, 0, "Range specification bad" );
01015 }
01016
01017 return( pvalnLower->val.i );
01018 }
01019
01020 void
01021 ProcessNewLimits( stn_t *pstnLHSVar, limp_t *plimpNew )
01022 {
01023 tfi_t *ptfiBase;
01024 vfi_t *pvfiLHS;
01025 int fFailSublimit;
01026
01027
01028 pvfiLHS = &( pstnLHSVar->u.vfi );
01029
01030
01031 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01032 ptfiBase = pvfiLHS->ptfi->ptfiArrayEltType;
01033 } else {
01034 ptfiBase = pvfiLHS->ptfi;
01035 }
01036
01037
01038
01039
01040
01041 if ( plimpNew->valhdrValues.tty == ttyIDENT ) {
01042 switch ( plimpNew->valhdrValues.vals ) {
01043 case valsLIST: {
01044 int fError;
01045 valn_t *pvalnRun;
01046
01047 pvalnRun = plimpNew->valhdrValues.pvalnList;
01048 fError = 0;
01049 while ( pvalnRun ) {
01050 stn_t *pstnTmp;
01051
01052 pstnTmp = kapi_pstnLookup_noadd( kapi_pknobsCurrent, pvalnRun->val.pch );
01053 if ( (!pstnTmp) || pstnTmp->ity != ityENUMCONST ) {
01054 fError = 1;
01055 } else {
01056 if ( pstnTmp->u.efi.ptfiBaseType != ptfiBase ) {
01057 fError = 1;
01058 }
01059 }
01060 pvalnRun = pvalnRun->pvalnNext;
01061 }
01062
01063 if ( !fError ) {
01064 plimpNew->valhdrValues.tty = ttyENUM;
01065 } else {
01066 kapi_Error( kapi_cLine, 0, "Limit value expression not correct" );
01067 }
01068 break;
01069 }
01070 case valsRANGE: {
01071 int iUpper, iLower;
01072
01073 iLower = iEnumLowerGetRange( &( plimpNew->valhdrValues) );
01074 iUpper = iEnumUpperGetRange( &( plimpNew->valhdrValues) );
01075
01076 if ( iLower > iUpper ) {
01077 kapi_Error( kapi_cLine, 0, "Invalid range specification" );
01078 }
01079 plimpNew->valhdrValues.tty = ttyENUM;
01080
01081 break;
01082 }
01083 case valsNOREDEFINE:
01084 break;
01085 case valsSCALAR:
01086 break;
01087 default:
01088 assert( 0 );
01089 }
01090 } else if ( plimpNew->valhdrValues.tty == ttyINT
01091 && plimpNew->valhdrValues.vals == valsRANGE ) {
01092 valn_t *pvalnLower, *pvalnUpper;
01093
01094
01095 pvalnLower = plimpNew->valhdrValues.pvalnList;
01096 if ( pvalnLower == NULL || pvalnLower->pvalnNext == NULL ) {
01097 kapi_Error( kapi_cLine, 0, "Range specification bad" );
01098 }
01099 pvalnUpper = pvalnLower->pvalnNext;
01100
01101 if ( pvalnLower->val.i > pvalnUpper->val.i ) {
01102 kapi_Error( kapi_cLine, 0, "Invalid range specification" );
01103 }
01104 }
01105
01106
01107 if ( ptfiBase->tty == ttyBITMASK && ! plimpNew->valhdrValues.fNoRedefine ) {
01108 kapi_Error_pch1( kapi_cLine, 0,
01109 "Cannot value-limit variables (%s) of type bitmask or array of bitmask",
01110 pstnLHSVar->pchName );
01111 } else {
01112
01113
01114
01115
01116 TurnOnNoRedefine( ptfiBase, tredefSTATUS_USED_IN_LIMIT );
01117 }
01118
01119
01120 if ( plimpNew->valhdrValues.tty != ptfiBase->tty
01121 && plimpNew->valhdrValues.vals != valsNOREDEFINE ) {
01122 kapi_Error_pch1( kapi_cLine, 0,
01123 "Types in limit statment of '%s' do not match variable type",
01124 pstnLHSVar->pchName );
01125 }
01126
01127
01128
01129
01130
01131
01132 if ( pvfiLHS->pedList ) {
01133
01134
01135
01136
01137
01138
01139
01140
01141 fFailSublimit = 0;
01142 if ( plimpNew->valhdrValues.vals == valsLIST ) {
01143 valn_t *pvalnRun;
01144
01145 pvalnRun = plimpNew->valhdrValues.pvalnList;
01146 while ( (!fFailSublimit) && pvalnRun ) {
01147 fFailSublimit = fFailCheckLimitValue2( pvalnRun,
01148 &(pvfiLHS->pedList->valhdrLimit));
01149 pvalnRun = pvalnRun->pvalnNext;
01150 }
01151
01152 } else if ( plimpNew->valhdrValues.vals == valsRANGE ) {
01153 int ival, iLower, iUpper;
01154 valn_t valnTmp;
01155
01156 if ( plimpNew->valhdrValues.tty == ttyINT ) {
01157 iLower = iLowerGetRange( &(plimpNew->valhdrValues ) );
01158 iUpper = iUpperGetRange( &(plimpNew->valhdrValues ) );
01159 } else if ( plimpNew->valhdrValues.tty == ttyENUM) {
01160 iLower = iEnumLowerGetRange( &(plimpNew->valhdrValues ) );
01161 iUpper = iEnumUpperGetRange( &(plimpNew->valhdrValues ) );
01162 } else {
01163 assert( 0 );
01164 }
01165
01166 valnTmp.pvalnNext = NULL;
01167 for ( ival=iLower; ival<=iUpper && !fFailSublimit; ival++ ) {
01168 valnTmp.val.i = ival;
01169 fFailSublimit = fFailCheckLimitValue2( &(valnTmp),
01170 &(pvfiLHS->pedList->valhdrLimit));
01171 }
01172 }
01173
01174 if ( fFailSublimit ) {
01175 kapi_Error_pch1( kapi_cLine, 0,
01176 "Limits on variable '%s' must be a subset of previous limits",
01177 pstnLHSVar->pchName );
01178 }
01179 }
01180 }
01181
01182 void
01183 CheckTypeConformance( vfi_t *pvfiLHS, char *pchIndex, int fIndexAll, valhdr_t *pvalhdrRHS )
01184 {
01185 tfi_t *ptfiLHS;
01186
01187 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01188 stn_t *pstnIndex;
01189
01190 ptfiLHS = pvfiLHS->ptfi->ptfiArrayEltType;
01191 if ( pchIndex != NULL && !fIndexAll ) {
01192 if ( pchIndex[ 0 ] != '%' ) {
01193 pstnIndex = kapi_pstnLookup_noadd( kapi_pknobsCurrent, pchIndex );
01194
01195 if ( pstnIndex == NULL || pstnIndex->ity != ityENUMCONST ) {
01196 kapi_Error_pch1( kapi_cLine, 0,
01197 "Array index '%s' is not an enumerated type constant",
01198 pchIndex );
01199 } else {
01200 if ( pstnIndex->u.efi.ptfiBaseType != pvfiLHS->ptfi->ptfiArrayIndexType ) {
01201 kapi_Error_pch1( kapi_cLine, 0,
01202 "Array index '%s' is not the right type of enumeration constant",
01203 pchIndex );
01204 }
01205 }
01206 }
01207 }
01208 } else {
01209 ptfiLHS = pvfiLHS->ptfi;
01210 }
01211
01212
01213 if ( pvalhdrRHS->tty != ptfiLHS->tty ) {
01214 kapi_Error( kapi_cLine, 0,
01215 "LHS and RHS of assignment not type compatible" );
01216 return;
01217 }
01218 }
01219
01220 void
01221 ProcessArrayAssign( vfi_t *pvfiLHS, stn_t *pstnLHSVar, char *pchIndex,
01222 int fIndexAll, valhdr_t *pvalhdrRHS,
01223 limp_t *plimpNew, int fIdenticalVal )
01224 {
01225 if ( pchIndex == NULL ) {
01226 kapi_Error_pch1( kapi_cLine, 0,
01227 "Identifier %s declared as an array, but not indexed",
01228 pstnLHSVar->pchName );
01229 return;
01230 }
01231
01232 assert( pvfiLHS->ptfi->ptfiArrayIndexType->tty == ttyENUM ||
01233 pvfiLHS->ptfi->ptfiArrayIndexType->tty == ttySTRING );
01234
01235 if ( !fIdenticalVal ) {
01236 if ( fIndexAll ) {
01237 ed_t *pedRun;
01238 ed_t *pedGlobal;
01239
01240
01241 pedRun = pvfiLHS->pedList;
01242 while ( pedRun ) {
01243 if ( pedRun->valhdrLimit.fNoRedefine ) {
01244
01245 tfi_t *ptfi;
01246
01247 if ( !fIdenticalVal ) {
01248 ptfi = pvfiLHS->ptfi->ptfiArrayIndexType;
01249 kapi_Warning_pch2( kapi_cLine, 0,
01250 "%s[ %s ] cannot be redefined",
01251 pstnLHSVar->pchName, pedRun->pchIndexName );
01252 }
01253 } else {
01254
01255 pvalhdrCopy( &(pedRun->valhdrValue), pvalhdrRHS );
01256 SetVariableValueLimit( &(pedRun->valhdrLimit), plimpNew );
01257 }
01258 pedRun = pedRun->pedNext;
01259 }
01260
01261 pedGlobal = pedLookup4ped( pvfiLHS->pedList, "*" );
01262
01263
01264 if ( pedGlobal == NULL ) {
01265 pedGlobal = pedMake( "*", pvfiLHS->ptfi->ptfiArrayEltType );
01266 pedGlobal->pedNext = pvfiLHS->pedList;
01267 pvfiLHS->pedList = pedGlobal;
01268 }
01269
01270 pvalhdrCopy( &(pedGlobal->valhdrValue), pvalhdrRHS );
01271
01272 } else {
01273 ed_t *ped;
01274
01275
01276 ped = pedLookup4pstn( pstnLHSVar, pchIndex );
01277 if ( ped == NULL ) {
01278 ped = pedMake( pchIndex,
01279 pvfiLHS->ptfi->ptfiArrayEltType );
01280 ped->pedNext = pstnLHSVar->u.vfi.pedList;
01281 pstnLHSVar->u.vfi.pedList = ped;
01282
01283 }
01284
01285 if ( ped->valhdrLimit.fNoRedefine ) {
01286
01287 tfi_t *ptfi;
01288
01289 ptfi = pvfiLHS->ptfi->ptfiArrayIndexType;
01290 kapi_Error_pch2( kapi_cLine, 0,
01291 "%s[ %s ] cannot be redefined",
01292 pstnLHSVar->pchName, pchIndex );
01293 } else {
01294 pvalhdrCopy( &(ped->valhdrValue), pvalhdrRHS );
01295 SetVariableValueLimit( &(ped->valhdrLimit), plimpNew );
01296 }
01297 }
01298 }
01299
01300
01301 if ( 0 == strcmp( pstnLHSVar->pchName, "PortTypes" ) ) {
01302 kapi_Warning(0,0,"kapi 2.x port_t compatability not supported!");
01303
01304
01305
01306
01307
01308
01309 }
01310 }
01311
01312
01313
01314
01315
01316 static void
01317 KAPI2X_update_cluster0Cutports( knobs_t *pknobs, stn_t *pstnType )
01318 {
01319 valn_t *pvalnRun;
01320 kapi_ut_t ut,utPrev;
01321 int iport;
01322 int mpnmaxcutport[ kapi_nUT ];
01323
01324
01325 pknobs->mpclrTable[ 0 ].ncports = 0;
01326 for ( ut=0;ut<kapi_nUT;ut++ ) {
01327 mpnmaxcutport[ ut ] = 0;
01328 pknobs->mpclrTable[ 0 ].mpncutport[ ut ] = 0;
01329 }
01330
01331
01332 pvalnRun = pstnType->u.tfi.pvalnEnums;
01333 utPrev=-1;
01334 while ( pvalnRun ) {
01335 ut = utInterpretPortName( pvalnRun->val.pch, &iport );
01336 if (ut<utPrev)
01337 {
01338 kapi_Warning_pch1(kapi_cLine, 0,
01339 "KAPI 2.x declaration of port_t for enum %s does not follow ut_t order!",
01340 pvalnRun->val.pch );
01341 } else
01342 utPrev=ut;
01343
01344 if ( ut == -1 ) {
01345 kapi_Error_pch1( kapi_cLine, 0,
01346 "Cannot translate KAPI 2.x declaration of port_t for enum %s",
01347 pvalnRun->val.pch );
01348 } else {
01349 (pknobs->mpclrTable[ 0 ].mpncutport[ ut ])++;
01350 if ( mpnmaxcutport[ ut ] < iport ) {
01351 mpnmaxcutport[ ut ] = iport;
01352 }
01353 }
01354 pvalnRun = pvalnRun->pvalnNext;
01355 }
01356
01357 for ( ut=0;ut<kapi_nUT;ut++ ) {
01358
01359 if ( mpnmaxcutport[ ut ]+1 != pknobs->mpclrTable[ 0 ].mpncutport[ ut ] ) {
01360 kapi_Error( kapi_cLine, 0,
01361 "Cannot translate KAPI 2.x declaration of port_t due to missing port" );
01362
01363 }
01364 }
01365 }
01366
01367
01368
01369
01370 static void
01371 KAPI3X_update_cluster0Cutports( knobs_t *pknobs, stn_t *pstnArray,
01372 char *pchIndex, valhdr_t *pvalhdrRHS )
01373 {
01374 kapi_ut_t ut;
01375 int ntmp;
01376 kapi_cutport_t cutport;
01377
01378 ut = KAPI_EnumIndex( pknobs, "ut_t", pchIndex );
01379
01380 if ( ut == -1 ) {
01381 kapi_Error_pch1( kapi_cLine, 0,
01382 "cluster0Cutports must be indexed by type ut_t. Found %s",
01383 pchIndex );
01384 }
01385
01386 if ( pvalhdrRHS->tty != ttyINT ) {
01387 kapi_Error_pch1( kapi_cLine, 0,
01388 "cluster0Cutports[ %s ] requires integer values",
01389 pchIndex );
01390 }
01391
01392 ntmp = pvalhdrRHS->pvalnList->val.i;
01393 pknobs->mpclrTable[ 0 ].mpncutport[ ut ] = ntmp;
01394
01395 for ( cutport=0; cutport<ntmp; cutport++ ) {
01396 cportinfo_t *pcportinfo;
01397
01398 pcportinfo = &(pknobs->mpclrTable[ 0 ].dmppcportinfoTable[ ut ][ cutport ]);
01399 if ( BYTE_LENGTHbv( &(pcportinfo->bvfuAllowed ) ) == 0) {
01400 bvResize( &(pcportinfo->bvfuAllowed), 256, 0 );
01401 ZERO_bv( &(pcportinfo->bvfuAllowed) );
01402 }
01403 }
01404 }
01405
01406
01407 static void
01408 KAPI2X_checkPortTypes( knobs_t *pknobs, stn_t *pstnArray,
01409 char *pchIndex, valhdr_t *pvalhdrRHS )
01410 {
01411 kapi_ut_t utIndex, utRHS;
01412 int iport;
01413
01414 if ( pvalhdrRHS->tty != ttyENUM ) {
01415 printf("ERROR -- RHS of PortTypes assignment not an Enum\n");
01416 }
01417 utRHS = KAPI_EnumIndex( pknobs, "ut_t", pvalhdrRHS->pvalnList->val.pch );
01418 utIndex = utInterpretPortName( pchIndex, &iport );
01419
01420 if ( utRHS != utIndex ) {
01421 kapi_Error_pch1( kapi_cLine, 0,
01422 "Error translating KAPI2x PortTypes[ %s ] assignment",
01423 pchIndex );
01424 }
01425 }
01426
01427
01428 void
01429 ProcessScalarAssign( vfi_t *pvfiLHS, stn_t *pstnLHSVar, char *pchIndex,
01430 int fIndexAll, valhdr_t *pvalhdrRHS, limp_t *plimpNew,
01431 int fIdenticalVal )
01432 {
01433 if ( pchIndex != NULL && pvfiLHS->ptfi->tty != ttyARRAY ) {
01434 kapi_Error_pch1( kapi_cLine, 0, "Identifier %s used as an array, but not declared as one", pstnLHSVar->pchName );
01435 return;
01436 }
01437
01438 if ( !fIdenticalVal ) {
01439 if ( pvfiLHS->pedList == NULL ) {
01440 pvfiLHS->pedList = pedMake( "", pvfiLHS->ptfi );
01441 }
01442
01443 if ( pvfiLHS->pedList
01444 && pvfiLHS->pedList->valhdrLimit.fNoRedefine ) {
01445 kapi_Error_pch1( kapi_cLine, 0,
01446 "%s cannot be redefined",
01447 pstnLHSVar->pchName );
01448 } else {
01449 pvalhdrCopy( &(pvfiLHS->pedList->valhdrValue), pvalhdrRHS );
01450 SetVariableValueLimit( &(pvfiLHS->pedList->valhdrLimit), plimpNew );
01451 }
01452 }
01453 }
01454
01455 static int
01456 fIdenticalValues( stn_t *pstnLHSVar, char *pchIndex, int fIndexAll, valhdr_t *pvalhdrRHS )
01457 {
01458 int fIdentical;
01459 vfi_t *pvfiLHS;
01460
01461 pvfiLHS = &(pstnLHSVar->u.vfi);
01462 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01463 if ( fIndexAll ) {
01464 ed_t *pedRun;
01465
01466 pedRun = pvfiLHS->pedList;
01467
01468 fIdentical = 1;
01469 while ( pedRun && fIdentical ) {
01470 fIdentical = fCheckIdenticalVal( pvalhdrRHS, pedRun );
01471 pedRun = pedRun->pedNext;
01472 }
01473
01474
01475
01476
01477
01478 if ( pvfiLHS->pedList == NULL ) {
01479 fIdentical = 0;
01480 }
01481 } else {
01482 ed_t *ped;
01483
01484 ped = pedLookup4pstn( pstnLHSVar, pchIndex );
01485 fIdentical = fCheckIdenticalVal( pvalhdrRHS, ped );
01486 }
01487 } else {
01488 fIdentical = fCheckIdenticalVal( pvalhdrRHS, pvfiLHS->pedList );
01489 }
01490
01491 return( fIdentical );
01492 }
01493
01494
01495
01496
01497
01498
01499
01500
01501 void kapi_ProcessArithmeticAssignment( stn_t *pstnLHSVar, char *pchIndex,
01502 valhdr_t *pvalhdrRHS)
01503 {
01504 int iVal=0;
01505 valn_t *pvalnExpression;
01506 arithmetic_op_t op;
01507 valhdr_t valhdrResult;
01508
01509 assert(pvalhdrRHS!=NULL);
01510 assert(pstnLHSVar!=NULL);
01511
01512 assert (pvalhdrRHS->tty==ttyEXPRESSION);
01513 assert (pvalhdrRHS->vals==valsLIST);
01514
01515
01516 pvalnExpression=pvalhdrRHS->pvalnList;
01517
01518 pvalnExpression=kapi_pvalnReverseTmp(pvalnExpression);
01519
01520 iVal=pvalnExpression->val.i;
01521
01522
01523
01524 while ((pvalnExpression=pvalnExpression->pvalnNext)!=NULL)
01525 {
01526
01527 op=pvalnExpression->val.enu;
01528 pvalnExpression=pvalnExpression->pvalnNext;
01529 switch (op)
01530 {
01531 case opPLUS:
01532 iVal+=pvalnExpression->val.i;
01533 break;
01534 case opDIV:
01535 iVal/=pvalnExpression->val.i;
01536 break;
01537 default:
01538 kapi_Error_pch1( kapi_cLine, 0,
01539 "Arithmetic expression error evaluating '%s' (unidentified operand)",
01540 pstnLHSVar->pchName );
01541 break;
01542 }
01543 }
01544
01545
01546 valhdrResult.tty=ttyINT;
01547 valhdrResult.vals=valsSCALAR;
01548 valhdrResult.pvalnList=pvalnMakeInt(iVal);
01549 kapi_ProcessAssignment(pstnLHSVar,pchIndex,&valhdrResult,NULL);
01550
01551 }
01552
01553
01554 void
01555 kapi_ProcessAssignment( stn_t *pstnLHSVar, char *pchIndex,
01556 valhdr_t *pvalhdrRHS, limp_t *plimpNewList )
01557 {
01558 vfi_t *pvfiLHS;
01559 limp_t *plimpNew;
01560 valn_t *pvalnVar;
01561 int fIndexAll, fIdentical;
01562
01563
01564
01565 fIndexAll = pchIndex && ( ! strcmp( pchIndex, "*" ) );
01566
01567 pvfiLHS = &( pstnLHSVar->u.vfi );
01568
01569 if ( pstnLHSVar->ity == ityUNKNOWN
01570 && kapi_pknobsCurrent->fImplicitNone ) {
01571 kapi_Error_pch1( kapi_cLine, 0,
01572 "Undeclared variable used in assignment LHS '%s'",
01573 pstnLHSVar->pchName );
01574 return;
01575 }
01576
01577
01578
01579 if ( pstnLHSVar->ity == ityUNKNOWN ||
01580 ( pstnLHSVar->ity == ityVARNAME && pstnLHSVar->fExpected ) ) {
01581 pstnLHSVar->ity = ityVARNAME;
01582 pstnLHSVar->fExpected = 0;
01583
01584 if ( pvalhdrRHS->tty == ttyINT
01585 || pvalhdrRHS->tty == ttyREAL
01586 || pvalhdrRHS->tty == ttySTRING
01587 || pvalhdrRHS->tty == ttyENUM ) {
01588
01589 if ( pvalhdrRHS->tty == ttyENUM ) {
01590 stn_t *pstn;
01591 pstn = kapi_pstnLookup( kapi_pknobsCurrent,
01592 pvalhdrRHS->pvalnList->val.pch );
01593 if ( pstn->ity == ityENUMCONST ) {
01594 pvfiLHS->ptfi = pstn->u.efi.ptfiBaseType;
01595 } else {
01596 kapi_Error_pch1( kapi_cLine, 0,
01597 "RHS enumerated value '%s' does not match LHS",
01598 pstn->pchName );
01599 }
01600 } else {
01601 pvfiLHS->ptfi = kapi_ptfiLookup( pvalhdrRHS->tty, NULL );
01602 }
01603 pvfiLHS->pedList = NULL;
01604
01605
01606 pvalnVar = pvalnMakeIdent( pstnLHSVar->pchName );
01607 pvalnVar->pvalnNext = kapi_pknobsCurrent->pvalnVarList;
01608 kapi_pknobsCurrent->pvalnVarList = pvalnVar;
01609 } else {
01610 kapi_Error_pch1( kapi_cLine, 0,
01611 "Identifier %s not declared ",
01612 pstnLHSVar->pchName );
01613 return;
01614 }
01615 }
01616
01617
01618 if ( pstnLHSVar->ity != ityVARNAME ) {
01619 kapi_Error_pch1( kapi_cLine, 0,
01620 "Identifier '%s' already defined, cannot reuse as variable name",
01621 pstnLHSVar->pchName );
01622 return;
01623 }
01624
01625
01626
01627
01628 CheckTypeConformance( pvfiLHS, pchIndex, fIndexAll, pvalhdrRHS );
01629
01630 fIdentical = fIdenticalValues( pstnLHSVar, pchIndex, fIndexAll, pvalhdrRHS );
01631
01632
01633
01634
01635 if ( !fIdentical ) {
01636
01637
01638 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01639 if ( fIndexAll ) {
01640 ed_t *pedRun;
01641
01642 pedRun = pvfiLHS->pedList;
01643 while ( pedRun ) {
01644 (void)fFailCheck( pvalhdrRHS, pedRun, pstnLHSVar, pedRun->pchIndexName );
01645 pedRun = pedRun->pedNext;
01646 }
01647 } else {
01648 ed_t *ped;
01649
01650 ped = pedLookup4pstn( pstnLHSVar, pchIndex );
01651 if ((NULL!=ped) && (ped->valhdrValue.fRHS))
01652 kapi_Warning_pch2( kapi_cLine, 0, "Variable '%s[%s]' was already used in an expression!\n", pstnLHSVar->pchName,pchIndex);
01653 (void)fFailCheck( pvalhdrRHS, ped, pstnLHSVar, pchIndex );
01654 }
01655 } else {
01656 if (pstnLHSVar->fRHS)
01657 kapi_Warning_pch1( kapi_cLine, 0, "Variable '%s' was already used in an expression!\n", pstnLHSVar->pchName);
01658 (void)fFailCheck( pvalhdrRHS, pvfiLHS->pedList, pstnLHSVar, "" );
01659 }
01660 }
01661
01662
01663
01664
01665 plimpNew = plimpLookup( plimpNewList, kapi_pknobsCurrent->pchToolname );
01666 if ( plimpNew ) {
01667 ProcessNewLimits( pstnLHSVar, plimpNew );
01668 }
01669
01670
01671
01672
01673 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01674 ProcessArrayAssign( pvfiLHS, pstnLHSVar, pchIndex, fIndexAll,
01675 pvalhdrRHS, plimpNew, fIdentical );
01676 } else {
01677 ProcessScalarAssign( pvfiLHS, pstnLHSVar, pchIndex, fIndexAll,
01678 pvalhdrRHS, plimpNew, fIdentical );
01679 }
01680 }
01681
01682 static int
01683 fCheckIdenticalVal( valhdr_t *pvalhdrRHS, ed_t *pedLHSVal )
01684 {
01685
01686
01687 if ( pedLHSVal == NULL ) {
01688 return( 0 );
01689 }
01690
01691 if ( pedLHSVal->valhdrValue.vals == valsSCALAR ) {
01692 tty_t ttyCheck;
01693
01694 ttyCheck = pedLHSVal->valhdrValue.tty;
01695
01696
01697
01698
01699 if ( ttyCheck == ttyENUM ) {
01700 ttyCheck = ttySTRING;
01701 }
01702 if ( ttyCheck == ttyBITMASK ) {
01703 return( fMatch_valn_list( pedLHSVal->valhdrValue.pvalnList,
01704 pvalhdrRHS->pvalnList,
01705 ttySTRING ) );
01706 } else {
01707 return( fEqual_val( &(pedLHSVal->valhdrValue.pvalnList->val),
01708 &(pvalhdrRHS->pvalnList->val),
01709 ttyCheck ) );
01710 }
01711 } else if ( pedLHSVal->valhdrValue.vals == valsUNSET ) {
01712 return( 0 );
01713 } else {
01714 assert( 0 );
01715 }
01716 assert( 0 );
01717 return 0;
01718 }
01719
01720 static int
01721 fFailCheck( valhdr_t *pvalhdrRHS, ed_t *pedLHSVal, stn_t *pstnLHSVar, char *pchIndex )
01722 {
01723 int fFail;
01724 vfi_t *pvfiLHS;
01725
01726
01727 if ( pedLHSVal == NULL ) {
01728 return( 0 );
01729 }
01730 pvfiLHS = &(pstnLHSVar->u.vfi);
01731
01732
01733 fFail = fFailCheckLimitValue( pvalhdrRHS, pedLHSVal );
01734 if ( fFail ) {
01735 char *pchError;
01736
01737 switch( fFail ) {
01738 case 1:
01739 pchError = "cannot be redefined";
01740 break;
01741 case 2:
01742 pchError = "redefined to unallowable value";
01743 break;
01744 default:
01745 assert( 0 );
01746 }
01747 if ( pvfiLHS->ptfi->tty == ttyARRAY ) {
01748
01749 tfi_t *ptfi;
01750
01751 ptfi = pvfiLHS->ptfi->ptfiArrayIndexType;
01752 kapi_Error_pch3( kapi_cLine, 0,
01753 "%s[ %s ] %s",
01754 pstnLHSVar->pchName, pchIndex, pchError );
01755 } else {
01756 kapi_Error_pch2( kapi_cLine, 0,
01757 "%s %s",
01758 pstnLHSVar->pchName, pchError );
01759 }
01760 }
01761 return( fFail );
01762 }
01763
01764 char *
01765 ity2pchname( ity_t ity )
01766 {
01767 char *pchity;
01768
01769 switch ( ity ) {
01770 case ityTYPENAME:
01771 pchity = "type name";
01772 break;
01773 case ityVARNAME:
01774 pchity = "variable name";
01775 break;
01776 case ityENUMCONST:
01777 pchity = "enumerated constant";
01778 break;
01779 case ityATTRIBUTENAME:
01780 pchity = "attribute name";
01781 break;
01782 default:
01783 assert( 0 );
01784 }
01785 return( pchity );
01786 }
01787
01788 void
01789 kapi_ProcessExpect( valhdr_t *pvalhdr, int typeexpect )
01790 {
01791 stn_t *pstn;
01792 valn_t *pvalnRun;
01793 ity_t ityNew;
01794
01795 switch ( typeexpect ) {
01796 case 0:
01797 ityNew = ityTYPENAME;
01798 break;
01799 case 1:
01800 ityNew = ityVARNAME;
01801 break;
01802 case 2:
01803 ityNew = ityENUMCONST;
01804 break;
01805 case 3:
01806 ityNew = ityATTRIBUTENAME;
01807 break;
01808 default:
01809 assert( 0 );
01810 }
01811
01812 pvalnRun = pvalhdr->pvalnList;
01813 while ( pvalnRun ) {
01814 pstn = kapi_pstnLookup( kapi_pknobsCurrent, pvalnRun->val.pch );
01815 if ( pstn->ity == ityUNKNOWN ) {
01816 pstn->fExpected = 1;
01817 pstn->ity = ityNew;
01818 } else if ( pstn->ity != ityNew ) {
01819 if ( pstn->fExpected ) {
01820 kapi_Error_pch2( kapi_cLine, 1,
01821 "Identifier %s expected to be a %s",
01822 pstn->pchName, ity2pchname( pstn->ity ) );
01823 } else {
01824 kapi_Error_pch2( kapi_cLine, 1,
01825 "Identifier %s previously declared to be a %s",
01826 pstn->pchName, ity2pchname( pstn->ity ) );
01827 }
01828 }
01829
01830 pvalnRun = pvalnRun->pvalnNext;
01831 }
01832 }
01833
01834 int
01835 kapi_ProcessIndex( stn_t *pstnIndex )
01836 {
01837 if ( pstnIndex->ity != ityENUMCONST ) {
01838 kapi_Error_pch1( kapi_cLine, 0,
01839 "Index value %s must be an enumerated constant or '*'",
01840 pstnIndex->pchName );
01841 return( -1 );
01842 }
01843
01844 return( pstnEnum2idx( pstnIndex ) );
01845 }
01846
01847 tfi_t *
01848 kapi_ptfiConstructArray( tfi_t *ptfiIndexType, tfi_t *ptfiElt )
01849 {
01850 tfi_t *ptfiTemp;
01851
01852 ptfiTemp = (tfi_t *)malloc( sizeof( tfi_t ) );
01853
01854 ptfiTemp->tty = ttyARRAY;
01855
01856 ptfiTemp->ptfiArrayEltType = ptfiElt;
01857 ptfiTemp->ptfiArrayIndexType = ptfiIndexType;
01858
01859 return( ptfiTemp );
01860 }
01861
01862 tfi_t *
01863 kapi_ptfiConstructBitmask( tfi_t *ptfiBaseType )
01864 {
01865 tfi_t *ptfiTemp;
01866
01867 ptfiTemp = (tfi_t *)malloc( sizeof( tfi_t ) );
01868
01869 ptfiTemp->tty = ttyBITMASK;
01870 ptfiTemp->ptfiBitmaskBaseType = ptfiBaseType;
01871
01872 return( ptfiTemp );
01873 }
01874
01875 tfi_t *
01876 kapi_ptfiCheckDeclaredType( stn_t *pstnName )
01877 {
01878 if ( pstnName->ity == ityUNKNOWN ) {
01879 kapi_Error_pch1( kapi_cLine, 0, "Typename %s not declared", pstnName->pchName );
01880 return( NULL );
01881 }
01882
01883 if ( pstnName->ity != ityTYPENAME ) {
01884 kapi_Error_pch1( kapi_cLine, 0, "Expected typename, found %s", pstnName->pchName );
01885 return( NULL );
01886 }
01887
01888 return( &(pstnName->u.tfi) );
01889 }
01890
01891 tfi_t *
01892 kapi_ptfiLookup( tty_t tty, void *pvoid )
01893 {
01894 stn_t *pstn;
01895 char *pchTypeName;
01896
01897 switch( tty ) {
01898 case ttyINT:
01899 pchTypeName = "int";
01900 break;
01901 case ttyREAL:
01902 pchTypeName = "real";
01903 break;
01904 case ttySTRING:
01905 pchTypeName = "string";
01906 break;
01907 case ttyIDENT:
01908 pchTypeName = ((stn_t *)pvoid)->pchName;
01909 break;
01910 default:
01911 assert( 0 );
01912 }
01913 pstn = kapi_pstnLookup( kapi_pknobsCurrent, pchTypeName );
01914 assert( pstn );
01915
01916 switch ( pstn->ity ) {
01917 case ityTYPENAME:
01918 return( &(pstn->u.tfi) );
01919 case ityVARNAME:
01920 return( pstn->u.vfi.ptfi );
01921 case ityENUMCONST:
01922 return( pstn->u.efi.ptfiBaseType );
01923 case ityRESERVED:
01924 case ityATTRIBUTENAME:
01925 case ityUNKNOWN:
01926 default:
01927 assert( 0 );
01928 }
01929 return 0;
01930 }
01931
01932 void
01933 kapi_LookUpVariable_valhdr( stn_t *pstn, valhdr_t *pvalhdr, int iPos )
01934 {
01935 ed_t *ped;
01936
01937 assert( pstn->ity == ityVARNAME );
01938
01939 if ( pstn->u.vfi.ptfi->tty == ttyARRAY ) {
01940
01941 ped = pedGetIth( pstn, iPos );
01942 if ( ped ) {
01943 *pvalhdr = ped->valhdrValue;
01944 } else {
01945 ped = pedLookup4pstn( pstn, "*" );
01946 if ( ped ) {
01947 *pvalhdr = ped->valhdrValue;
01948 } else {
01949 pvalhdr->vals = valsUNSET;
01950 }
01951 }
01952 } else {
01953 if ( pstn->u.vfi.pedList ) {
01954 *pvalhdr = pstn->u.vfi.pedList->valhdrValue;
01955 } else {
01956 ped = pedLookup4pstn( pstn, "*" );
01957 if ( ped ) {
01958 *pvalhdr = ped->valhdrValue;
01959 } else {
01960 pvalhdr->vals = valsUNSET;
01961 }
01962 }
01963 }
01964 }
01965
01966 void
01967 kapi_LookUpIdent_valhdr( stn_t *pstn, valhdr_t *pvalhdr, int iPos )
01968 {
01969 switch( pstn->ity ) {
01970 case ityVARNAME:
01971 if ( pstn->u.vfi.ptfi->tty == ttyARRAY ) {
01972 ed_t *ped;
01973
01974 ped = pedGetIth( pstn, iPos );
01975 if ( ped ) {
01976 *pvalhdr = ped->valhdrValue;
01977 } else {
01978 pvalhdr->vals = valsUNSET;
01979 }
01980 } else {
01981 if ( pstn->u.vfi.pedList ) {
01982 *pvalhdr = pstn->u.vfi.pedList->valhdrValue;
01983 } else {
01984 pvalhdr->vals = valsUNSET;
01985 }
01986 }
01987 break;
01988 case ityENUMCONST:
01989 pvalhdr->vals = valsSCALAR;
01990 pvalhdr->tty = ttyENUM;
01991 pvalhdr->pvalnList = pvalnMakeEnum( pstn->pchName );
01992 break;
01993 default:
01994 assert( 0 );
01995 }
01996 }
01997
01998 valn_t *
01999 kapi_pvalnReverseTmp( valn_t *pvalnList )
02000 {
02001 valn_t *pvalnTempList = NULL;
02002 valn_t *pvalnTemp = NULL;
02003
02004 while ( pvalnList ) {
02005 pvalnTemp = pvalnList;
02006 pvalnList = pvalnList->pvalnNext;
02007
02008 pvalnTemp->pvalnNext = pvalnTempList;
02009 pvalnTempList = pvalnTemp;
02010 }
02011 pvalnList = pvalnTempList;
02012
02013 return( pvalnList );
02014 }
02015
02016 stn_t *
02017 kapi_pstnReverseTmp( stn_t *pstnList )
02018 {
02019 stn_t *pstnTempList = NULL;
02020 stn_t *pstnTemp = NULL;
02021
02022 pstnTempList = NULL;
02023 pstnTemp = NULL;
02024
02025 while ( pstnList ) {
02026 pstnTemp = pstnList;
02027 pstnList = pstnList->pstnTempNext;
02028
02029 pstnTemp->pstnTempNext = pstnTempList;
02030 pstnTempList = pstnTemp;
02031 }
02032 pstnList = pstnTempList;
02033
02034 return( pstnList );
02035 }
02036
02037
02038
02039
02040
02041 static void
02042 AddStringToAttr( stn_t *pstnAttr, char *pch )
02043 {
02044 afi_t *pafiNew;
02045
02046 pafiNew = (afi_t *)malloc( sizeof( afi_t ) );
02047 assert( pafiNew );
02048
02049 pafiNew->pafiNext = pstnAttr->u.afih.u.pafi;
02050 pafiNew->pchAttrVal = kapi_pchCopy( pch );
02051 pstnAttr->u.afih.u.pafi = pafiNew;
02052 pstnAttr->u.afih.nAttr++;
02053 }
02054
02055 void
02056 ProcessBitmaskExpr( valhdr_t *pvalhdrBitmask, valhdr_t *pvalhdrBits )
02057 {
02058 valn_t *pvalnRun;
02059 stn_t *pstnEnum;
02060 tfi_t *ptfiBitmaskBaseType;
02061 int fFirst;
02062
02063 fFirst = 1;
02064 pvalhdrBitmask->tty = ttyBITMASK;
02065 pvalhdrBitmask->vals = valsSCALAR;
02066 if (pvalhdrBits)
02067 pvalhdrBitmask->pvalnList = pvalhdrBits->pvalnList;
02068 else
02069 pvalhdrBitmask->pvalnList = NULL;
02070
02071
02072
02073
02074
02075 if ( pvalhdrBits && pvalhdrBits->tty != ttyIDENT ) {
02076 kapi_Error( kapi_cLine, 1, "List of enumeration constants expected in bitmask" );
02077 }
02078 pvalnRun = pvalhdrBitmask->pvalnList;
02079 while ( pvalnRun ) {
02080 pstnEnum = kapi_pstnLookup_noadd( kapi_pknobsCurrent, pvalnRun->val.pch );
02081 if ( pstnEnum == NULL ) {
02082 kapi_Error_pch1( kapi_cLine, 1, "Undeclared identifier '%s' in bitmask",
02083 pvalnRun->val.pch );
02084 } else if ( pstnEnum->ity != ityENUMCONST ) {
02085 kapi_Error_pch1( kapi_cLine, 1,
02086 "Identifier '%s' is not an enumeration constant",
02087 pstnEnum->pchName );
02088 } else {
02089 if ( fFirst ) {
02090 fFirst = 0;
02091 ptfiBitmaskBaseType = pstnEnum->u.efi.ptfiBaseType;
02092 } else if ( ptfiBitmaskBaseType != pstnEnum->u.efi.ptfiBaseType ) {
02093 kapi_Error_pch2( kapi_cLine, 1,
02094 "Enumeration constant '%s' in bitmask must %s",
02095 pstnEnum->pchName,
02096 "be of same base type as other enumeration constants" );
02097 }
02098 }
02099 pvalnRun = pvalnRun->pvalnNext;
02100 }
02101 }
02102
02103 valn_t *
02104 pvalnCopyList( valn_t *pvalnList )
02105 {
02106 valn_t *pvalnTmp;
02107
02108 if ( pvalnList ) {
02109 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02110
02111
02112 pvalnTmp->val = pvalnList->val;
02113 pvalnTmp->pvalnNext = pvalnCopyList( pvalnList->pvalnNext );
02114 return( pvalnTmp );
02115 } else {
02116 return( NULL );
02117 }
02118 }
02119
02120
02121 valn_t *
02122 pvalnMakeEnum( char *pch )
02123 {
02124 valn_t *pvalnTmp;
02125
02126 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02127 memset( pvalnTmp, 0, sizeof( valn_t ) );
02128 pvalnTmp->val.pch = kapi_pchCopy( pch );
02129 pvalnTmp->pvalnNext = NULL;
02130
02131 return( pvalnTmp );
02132 }
02133
02134 valn_t *
02135 pvalnMakeString( char *pch )
02136 {
02137 valn_t *pvalnTmp;
02138
02139 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02140 memset( pvalnTmp, 0, sizeof( valn_t ) );
02141 pvalnTmp->val.pch = kapi_pchCopy( pch );
02142 pvalnTmp->pvalnNext = NULL;
02143
02144 return( pvalnTmp );
02145 }
02146
02147 valn_t *
02148 pvalnMakeInt( int i )
02149 {
02150 valn_t *pvalnTmp;
02151
02152 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02153 memset( pvalnTmp, 0, sizeof( valn_t ) );
02154 pvalnTmp->val.i = i;
02155 pvalnTmp->pvalnNext = NULL;
02156
02157 return( pvalnTmp );
02158 }
02159
02160 valn_t *
02161 pvalnMakeBitmask( void )
02162 {
02163 valn_t *pvalnTmp;
02164
02165 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02166 memset( pvalnTmp, 0, sizeof( valn_t ) );
02167 pvalnTmp->pvalnNext = NULL;
02168
02169 return( pvalnTmp );
02170 }
02171
02172 valn_t *
02173 pvalnMakeReal( double d )
02174 {
02175 valn_t *pvalnTmp;
02176
02177 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02178 memset( pvalnTmp, 0, sizeof( valn_t ) );
02179 pvalnTmp->val.r = d;
02180 pvalnTmp->pvalnNext = NULL;
02181
02182 return( pvalnTmp );
02183 }
02184
02185
02186 valn_t *
02187
02188 pvalnMakeArithmeticOp( char *pch )
02189 {
02190 valn_t *pvalnTmp;
02191 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02192 memset( pvalnTmp, 0, sizeof( valn_t ) );
02193 switch (*pch)
02194 {
02195 case '+':
02196 pvalnTmp->val.enu = opPLUS;
02197 break;
02198 case '/':
02199 pvalnTmp->val.enu = opDIV;
02200 break;
02201 default:
02202 pvalnTmp->val.enu = opNONE;
02203 break;
02204 }
02205 pvalnTmp->pvalnNext = NULL;
02206 return( pvalnTmp );
02207
02208 }
02209
02210
02211
02212
02213 valhdr_t *
02214 pvalhdrMake( tty_t tty, vals_t vals, valn_t *pvalnList )
02215 {
02216 valhdr_t *pvalhdrTmp;
02217
02218 pvalhdrTmp = (valhdr_t *)malloc( sizeof( valhdr_t ) );
02219 pvalhdrTmp->tty = tty;
02220 pvalhdrTmp->vals = vals;
02221 pvalhdrTmp->fNoRedefine = 0;
02222 pvalhdrTmp->fRHS = 0;
02223 if ( vals == valsNOREDEFINE ) {
02224 pvalhdrTmp->fNoRedefine = 1;
02225 }
02226 pvalhdrTmp->pvalnList = pvalnList;
02227
02228 return( pvalhdrTmp );
02229 }
02230
02231
02232 valn_t *
02233 pvalnMakeIdent( char *pch )
02234 {
02235 valn_t *pvalnTmp;
02236
02237 pvalnTmp = (valn_t *)malloc( sizeof( valn_t ) );
02238 pvalnTmp->val.pch = kapi_pchCopy( pch );
02239 pvalnTmp->pvalnNext = NULL;
02240
02241 return( pvalnTmp );
02242 }
02243
02244 limp_t *
02245 plimpProcessLimitVariable( valhdr_t *pvalhdrTools, valhdr_t *pvalhdrValue )
02246 {
02247 limp_t *plimpTmp;
02248
02249 plimpTmp = (limp_t *)malloc( sizeof( limp_t ) );
02250
02251 if ( pvalhdrTools == NULL ) {
02252 plimpTmp->pvalnNameList = NULL;
02253 } else {
02254 plimpTmp->pvalnNameList = pvalhdrTools->pvalnList;
02255 }
02256
02257 plimpTmp->valhdrValues = *pvalhdrValue;
02258 plimpTmp->plimpNext = NULL;
02259
02260 return( plimpTmp );
02261 }
02262
02263 limp_t *
02264 plimpProcessLimitType( valhdr_t *pvalhdrToolList )
02265 {
02266 limp_t *plimpTmp;
02267
02268 plimpTmp = (limp_t *)malloc( sizeof( limp_t ) );
02269
02270 if ( pvalhdrToolList == NULL ) {
02271 plimpTmp->pvalnNameList = NULL;
02272 } else {
02273 plimpTmp->pvalnNameList = pvalhdrToolList->pvalnList;
02274 }
02275
02276 plimpTmp->valhdrValues.tty = ttyUNKNOWN;
02277 plimpTmp->valhdrValues.vals = valsNOREDEFINE;
02278 plimpTmp->valhdrValues.pvalnList = NULL;
02279 plimpTmp->plimpNext = NULL;
02280
02281 return( plimpTmp );
02282 }
02283
02284
02285 tfi_t *
02286 ptfiProcessArrayTypeSpec( stn_t *pstnIndexType, tfi_t *ptfi )
02287 {
02288 if ( pstnIndexType->ity == ityTYPENAME ) {
02289 return( kapi_ptfiConstructArray( &(pstnIndexType->u.tfi), ptfi ) );
02290 } else {
02291 kapi_Error_pch1( kapi_cLine, 1, "Index type (%s) specification bad",
02292 pstnIndexType->pchName );
02293 return( NULL );
02294 }
02295 }
02296
02297 limp_t *
02298 plimpLookup( limp_t *plimpList, char *pchToolname )
02299 {
02300 limp_t *plimpRun, *plimpNull;
02301 valn_t *pvalnRun;
02302 int fNullFound;
02303
02304 plimpRun = plimpList;
02305 fNullFound = 0;
02306 while ( plimpRun ) {
02307 pvalnRun = plimpRun->pvalnNameList;
02308
02309 if ( pvalnRun == NULL ) {
02310
02311
02312
02313
02314 fNullFound = 1;
02315 plimpNull = plimpRun;
02316 } else {
02317 while ( pvalnRun ) {
02318 if ( pchToolname == NULL
02319 || !strcmp( pchToolname, pvalnRun->val.pch ) ) {
02320 return( plimpRun );
02321 }
02322 pvalnRun = pvalnRun->pvalnNext;
02323 }
02324 }
02325 plimpRun = plimpRun->plimpNext;
02326 }
02327
02328 if ( fNullFound ) {
02329 return( plimpNull );
02330 }
02331 return( NULL );
02332 }
02333
02334 void
02335 pvalhdrCopy( valhdr_t *pvalhdrTarget, valhdr_t *pvalhdrSource )
02336 {
02337 pvalhdrTarget->vals = pvalhdrSource->vals;
02338 pvalhdrTarget->tty = pvalhdrSource->tty;
02339 pvalhdrTarget->pvalnList = pvalnCopyList( pvalhdrSource->pvalnList );
02340 }
02341
02342 int
02343 fFailCheckLimitValue2( valn_t *pvalnCheck, valhdr_t *pvalhdrLimit )
02344 {
02345 int fFail;
02346
02347
02348
02349
02350 fFail = 0;
02351 switch ( pvalhdrLimit->vals ) {
02352 case valsUNSET: {
02353 fFail = 0;
02354 break;
02355 }
02356 case valsNOREDEFINE: {
02357 fFail = 1;
02358 break;
02359 }
02360 case valsRANGE: {
02361 int iUpper, iLower, iValue;
02362
02363 switch ( pvalhdrLimit->tty ) {
02364 case ttyENUM: {
02365
02366
02367 iValue = pvalnCheck->val.enu;
02368 iUpper = iEnumUpperGetRange( pvalhdrLimit );
02369 iLower = iEnumLowerGetRange( pvalhdrLimit );
02370 break;
02371 }
02372 case ttyINT: {
02373 iValue = pvalnCheck->val.i;
02374 iUpper = iUpperGetRange( pvalhdrLimit );
02375 iLower = iLowerGetRange( pvalhdrLimit );
02376 break;
02377 }
02378 default: {
02379 assert( 0 );
02380 }
02381 }
02382 if ( iValue < iLower || iValue > iUpper ) {
02383 fFail = 2;
02384 }
02385
02386 break;
02387 }
02388 case valsLIST: {
02389 int iListValue, iValue;
02390 valn_t *pvalnRun;
02391 char *pchValue, *pchListValue;
02392 double rValue, rListValue;
02393
02394 fFail = 2;
02395 switch ( pvalhdrLimit->tty ) {
02396 case ttyENUM: {
02397 stn_t *pstnValue;
02398
02399 pstnValue = kapi_pstnLookup( kapi_pknobsCurrent,
02400 pvalnCheck->val.pch );
02401 iValue = pstnEnum2idx( pstnValue );
02402 break;
02403 }
02404 case ttyINT: {
02405 iValue = pvalnCheck->val.i;
02406 break;
02407 }
02408 case ttySTRING: {
02409 pchValue = pvalnCheck->val.pch;
02410 break;
02411 }
02412 case ttyREAL: {
02413 rValue = pvalnCheck->val.r;
02414 break;
02415 }
02416 default: {
02417 assert( 0 );
02418 }
02419 }
02420
02421 pvalnRun = pvalhdrLimit->pvalnList;
02422 while ( pvalnRun ) {
02423 switch ( pvalhdrLimit->tty ) {
02424 case ttyENUM: {
02425 stn_t *pstnListValue;
02426
02427 pstnListValue = kapi_pstnLookup( kapi_pknobsCurrent,
02428 pvalnRun->val.pch );
02429 iListValue = pstnEnum2idx( pstnListValue );
02430
02431 if ( iValue == iListValue ) {
02432 fFail = 0;
02433 }
02434 break;
02435 }
02436 case ttyINT: {
02437 iListValue = pvalnRun->val.i;
02438 if ( iValue == iListValue ) {
02439 fFail = 0;
02440 }
02441 break;
02442 }
02443 case ttySTRING: {
02444 pchListValue = pvalnRun->val.pch;
02445 if ( !strcmp( pchListValue, pchValue ) ) {
02446 fFail = 0;
02447 }
02448 break;
02449 }
02450 case ttyREAL: {
02451 rListValue = pvalnRun->val.r;
02452 if ( rListValue == rValue ) {
02453 fFail = 0;
02454 }
02455 break;
02456 }
02457 default: {
02458 assert( 0 );
02459 }
02460 }
02461 pvalnRun = pvalnRun->pvalnNext;
02462 }
02463 break;
02464 }
02465 case valsSCALAR:
02466 default: {
02467 assert( 0 );
02468 }
02469 }
02470
02471 return( fFail );
02472 }
02473
02474 int
02475 fFailCheckLimitValue( valhdr_t *pvalhdrNew, ed_t *pedIn )
02476 {
02477 int fFail;
02478
02479
02480
02481
02482 if ( pedIn->valhdrLimit.fNoRedefine ) {
02483 return( 1 );
02484 }
02485
02486 fFail = 0;
02487 switch ( pedIn->valhdrLimit.vals ) {
02488 case valsUNSET: {
02489 fFail = 0;
02490 break;
02491 }
02492 case valsNOREDEFINE: {
02493 fFail = 1;
02494 break;
02495 }
02496 case valsRANGE: {
02497 int iUpper, iLower, iValue;
02498 valn_t *pvalnLower, *pvalnUpper;
02499
02500 pvalnLower = pedIn->valhdrLimit.pvalnList;
02501 pvalnUpper = pedIn->valhdrLimit.pvalnList->pvalnNext;
02502 switch ( pedIn->valhdrValue.tty ) {
02503 case ttyENUM: {
02504 stn_t *pstnUpper, *pstnLower;
02505
02506 iValue = pvalhdrNew->pvalnList->val.enu;
02507 pstnUpper = kapi_pstnLookup( kapi_pknobsCurrent, pvalnUpper->val.pch );
02508 pstnLower = kapi_pstnLookup( kapi_pknobsCurrent, pvalnLower->val.pch );
02509 iUpper = pstnEnum2idx( pstnUpper );
02510 iLower = pstnEnum2idx( pstnLower );
02511 break;
02512 }
02513 case ttyINT: {
02514 iValue = pvalhdrNew->pvalnList->val.i;
02515 iUpper = pvalnUpper->val.i;
02516 iLower = pvalnLower->val.i;
02517 break;
02518 }
02519 default: {
02520 assert( 0 );
02521 }
02522 }
02523 if ( iValue < iLower || iValue > iUpper ) {
02524 fFail = 2;
02525 }
02526
02527 break;
02528 }
02529 case valsLIST: {
02530 int iListValue, iValue;
02531 valn_t *pvalnRun;
02532 char *pchValue, *pchListValue;
02533 double rValue, rListValue;
02534
02535 fFail = 2;
02536 switch ( pedIn->valhdrValue.tty ) {
02537 case ttyENUM: {
02538 stn_t *pstnValue;
02539
02540 pstnValue = kapi_pstnLookup( kapi_pknobsCurrent,
02541 pvalhdrNew->pvalnList->val.pch );
02542 iValue = pstnEnum2idx( pstnValue );
02543 break;
02544 }
02545 case ttyINT: {
02546 iValue = pvalhdrNew->pvalnList->val.i;
02547 break;
02548 }
02549 case ttySTRING: {
02550 pchValue = pvalhdrNew->pvalnList->val.pch;
02551 break;
02552 }
02553 case ttyREAL: {
02554 rValue = pvalhdrNew->pvalnList->val.r;
02555 break;
02556 }
02557 default: {
02558 assert( 0 );
02559 }
02560 }
02561
02562 pvalnRun = pedIn->valhdrLimit.pvalnList;
02563 while ( pvalnRun ) {
02564 switch ( pedIn->valhdrValue.tty ) {
02565 case ttyENUM: {
02566 stn_t *pstnListValue;
02567
02568 pstnListValue = kapi_pstnLookup( kapi_pknobsCurrent,
02569 pvalnRun->val.pch );
02570 iListValue = pstnEnum2idx( pstnListValue );
02571
02572 if ( iValue == iListValue ) {
02573 fFail = 0;
02574 }
02575 break;
02576 }
02577 case ttyINT: {
02578 iListValue = pvalnRun->val.i;
02579 if ( iValue == iListValue ) {
02580 fFail = 0;
02581 }
02582 break;
02583 }
02584 case ttySTRING: {
02585 pchListValue = pvalnRun->val.pch;
02586 if ( !strcmp( pchListValue, pchValue ) ) {
02587 fFail = 0;
02588 }
02589 break;
02590 }
02591 case ttyREAL: {
02592 rListValue = pvalnRun->val.r;
02593 if ( rListValue == rValue ) {
02594 fFail = 0;
02595 }
02596 break;
02597 }
02598 default: {
02599 assert( 0 );
02600 }
02601 }
02602 pvalnRun = pvalnRun->pvalnNext;
02603 }
02604 break;
02605 }
02606 case valsSCALAR:
02607 default: {
02608 assert( 0 );
02609 }
02610 }
02611
02612 return( fFail );
02613 }
02614
02615 void
02616 SetVariableValueLimit( valhdr_t *pvalhdr, limp_t *plimNew )
02617 {
02618
02619 if ( plimNew == NULL ) {
02620 return;
02621 }
02622
02623
02624
02625
02626
02627
02628
02629 if ( pvalhdr->fNoRedefine ) {
02630 return;
02631 }
02632
02633 *pvalhdr = plimNew->valhdrValues;
02634 }
02635
02636 bv_t *
02637 pbvBuild4valhdr( stn_t *pstnVar, valhdr_t *pvalhdr )
02638 {
02639 int length, pos;
02640 bv_t *pbv;
02641 tfi_t *ptfiVar;
02642 valn_t *pvalnRun, *pvalnEnumList;
02643
02644 ptfiVar = pstnVar->u.vfi.ptfi;
02645
02646 if ( ptfiVar->tty == ttyBITMASK ) {
02647 length = ptfiVar->ptfiBitmaskBaseType->nEnumConst;
02648 pvalnEnumList = ptfiVar->ptfiBitmaskBaseType->pvalnEnums;
02649 } else if ( ptfiVar->tty == ttyARRAY &&
02650 ptfiVar->ptfiArrayEltType->tty == ttyBITMASK ) {
02651 tfi_t *ptfiBitmaskBaseType;
02652
02653 ptfiBitmaskBaseType = ptfiVar->ptfiArrayEltType->ptfiBitmaskBaseType;
02654
02655 length = ptfiBitmaskBaseType->nEnumConst;
02656 pvalnEnumList = ptfiBitmaskBaseType->pvalnEnums;
02657
02658 } else {
02659 assert( 0 );
02660 }
02661
02662 pbv = pbvMake( length, 0 );
02663
02664 pvalnRun = pvalhdr->pvalnList;
02665 while ( pvalnRun ) {
02666
02667 pos = posInEnumList( pvalnRun->val.pch, pvalnEnumList );
02668 assert( pos != -1 );
02669 SETBIT_bv( pbv, pos );
02670
02671 pvalnRun = pvalnRun->pvalnNext;
02672 }
02673
02674 return( pbv );
02675 }
02676
02677 static int
02678 posInEnumList( char *pch, valn_t *pvalnEnums )
02679 {
02680 valn_t *pvalnRun;
02681 int cnt;
02682
02683 cnt = 0;
02684 pvalnRun = pvalnEnums;
02685 while ( pvalnRun ) {
02686 if ( ! strcmp( pvalnRun->val.pch, pch ) ) {
02687 return( cnt );
02688 }
02689 cnt++;
02690 pvalnRun = pvalnRun->pvalnNext;
02691 }
02692
02693 return( -1 );
02694 }
02695
02696
02697 valn_t *
02698 pvalnGetIth( valn_t *pvalnIn, int iIndex )
02699 {
02700 valn_t *pvalnRun;
02701 int i;
02702
02703
02704 pvalnRun = pvalnIn;
02705 for ( i=0; i<iIndex; i++ ) {
02706 pvalnRun = pvalnRun->pvalnNext;
02707 }
02708
02709 return( pvalnRun );
02710 }
02711
02712 ed_t *
02713 pedLookup4pstn( stn_t *pstnLHSVar, char *pchIndex )
02714 {
02715
02716 ed_t *pedRun;
02717
02718 assert( pstnLHSVar->u.vfi.ptfi->tty == ttyARRAY );
02719
02720 pedRun = pstnLHSVar->u.vfi.pedList;
02721 while ( pedRun ) {
02722 if ( ! strcmp( pedRun->pchIndexName, pchIndex ) ) {
02723 return( pedRun );
02724 }
02725 pedRun = pedRun->pedNext;
02726 }
02727
02728 return( NULL ) ;
02729 }
02730
02731 int
02732 idxped4pstn( stn_t *pstnLHSVar, char *pchIndex )
02733 {
02734
02735 ed_t *pedRun;
02736 int iPos;
02737
02738 assert( pstnLHSVar->u.vfi.ptfi->tty == ttyARRAY );
02739
02740 iPos = 0;
02741 pedRun = pstnLHSVar->u.vfi.pedList;
02742 while ( pedRun ) {
02743 if ( ! strcmp( pedRun->pchIndexName, pchIndex ) ) {
02744 return( iPos );
02745 }
02746 iPos++;
02747 pedRun = pedRun->pedNext;
02748 }
02749
02750 return( -1 ) ;
02751 }
02752
02753
02754 ed_t *
02755 pedLookup4ped( ed_t *pedList, char *pchIndex )
02756 {
02757
02758 ed_t *pedRun;
02759
02760 pedRun = pedList;
02761 while ( pedRun ) {
02762 if ( ! strcmp( pedRun->pchIndexName, pchIndex ) ) {
02763 return( pedRun );
02764 }
02765 pedRun = pedRun->pedNext;
02766 }
02767
02768 return( NULL ) ;
02769 }
02770
02771
02772 ed_t *
02773 pedGetIth( stn_t *pstnLHSVar, int iIndex )
02774 {
02775 valn_t *pvalnRun;
02776 ed_t *pedRun;
02777
02778 assert( pstnLHSVar->u.vfi.ptfi->tty == ttyARRAY );
02779
02780 if ( pstnLHSVar->u.vfi.ptfi->ptfiArrayIndexType->tty != ttySTRING ) {
02781 pvalnRun = pvalnGetIth(
02782 pstnLHSVar->u.vfi.ptfi->ptfiArrayIndexType->pvalnEnums,
02783 iIndex );
02784 assert( pvalnRun );
02785
02786
02787
02788
02789
02790 pedRun = pstnLHSVar->u.vfi.pedList;
02791 while ( pedRun ) {
02792 if ( ! strcmp( pedRun->pchIndexName, pvalnRun->val.pch ) ) {
02793 return( pedRun );
02794 }
02795 pedRun = pedRun->pedNext;
02796 }
02797 } else {
02798 pedRun = pstnLHSVar->u.vfi.pedList;
02799 while ( iIndex > 0 && pedRun) {
02800 iIndex--;
02801 pedRun = pedRun->pedNext;
02802 }
02803 return( pedRun );
02804 }
02805
02806 return( NULL ) ;
02807 }
02808
02809 ed_t *
02810 pedMake( char *pchIndexName, tfi_t *ptfi )
02811 {
02812 ed_t *pedTmp;
02813
02814 pedTmp = (ed_t *)malloc( sizeof(ed_t) );
02815 memset( pedTmp, 0, sizeof( ed_t ) );
02816
02817 pedTmp->ptfi = ptfi;
02818 pedTmp->pedNext = NULL;
02819 pedTmp->pchIndexName = pchIndexName;
02820 pedTmp->valhdrLimit.vals = valsUNSET;
02821 pedTmp->valhdrLimit.fNoRedefine = 0;
02822 pedTmp->valhdrValue.vals = valsUNSET;
02823
02824 return( pedTmp );
02825 }
02826
02827 kapi_cluster_t
02828 clusterInterpretpchclr( char *pchClr )
02829 {
02830 char ch;
02831
02832 assert( pchClr );
02833 if ( strncmp( pchClr, "cluster", 7 ) ) {
02834 return( -1 );
02835 }
02836 ch = pchClr[ 7 ];
02837 if ( ch > '9' || ch < '0' ) {
02838 return( -1 );
02839 }
02840 return( ch - '0' );
02841 }
02842
02843 kapi_ut_t
02844 utInterpretCportName( char *pchPort, int *pn )
02845 {
02846 if ( pchPort == NULL ) {
02847 return( -1 );
02848 }
02849 return( utInterpretPortName( pchPort+1, pn ) );
02850 }
02851
02852 kapi_ut_t
02853 utInterpretPortName( char *pchPort, int *pn )
02854 {
02855 char *pch;
02856 kapi_ut_t ut;
02857
02858 if ( strncmp( pchPort, "port", 4 ) ) {
02859 return( -1 );
02860 }
02861
02862 pch = &(pchPort[ 4 ]);
02863
02864 switch (pch[ 0 ]) {
02865 case 'M':
02866 ut = kapi_utM;
02867 break;
02868 case 'I':
02869 ut = kapi_utI;
02870 break;
02871 case 'B':
02872 ut = kapi_utB;
02873 break;
02874 case 'F':
02875 ut = kapi_utF;
02876 break;
02877 default:
02878 return( -1 );
02879 break;
02880 }
02881
02882
02883 pch = &(pchPort[ 5 ]);
02884 if ( pch[0] > '9' || pch[0] < '0' ) {
02885 return( -1 );
02886 }
02887
02888 pch = &(pchPort[ 6 ]);
02889 if ( pch[0] != '\0' ) {
02890 return( -1 );
02891 }
02892
02893
02894 *pn = pchPort[5] - '0';
02895
02896 return( ut );
02897 }
02898
02899
02900
02901
02902
02903 void
02904 Declare_cluster0CportMask( stn_t *pstn )
02905 {
02906 tfi_t *ptfiEltType, *ptfiType;
02907 stn_t *pstnString, *pstnfu_t;
02908
02909
02910 pstnString = kapi_pstnLookup( kapi_pknobsCurrent, "string" );
02911 pstnfu_t = kapi_pstnLookup( kapi_pknobsCurrent, "fu_t" );
02912
02913 if ( pstnfu_t->ity == ityTYPENAME
02914 && pstnfu_t->u.tfi.tty == ttyENUM ) {
02915 ptfiEltType = kapi_ptfiConstructBitmask( &(pstnfu_t->u.tfi) );
02916 } else {
02917 kapi_Error_pch1( kapi_cLine, 1,
02918 "Base type (%s) of bitmask specification bad",
02919 pstn->pchName );
02920 return;
02921 }
02922
02923 ptfiType = ptfiProcessArrayTypeSpec( pstnString, ptfiEltType );
02924
02925 kapi_ProcessVarDecl( pstn, ptfiType );
02926 }