Fossil SCM
Bug fixes in the pikchr.c tokenizer.
Commit
367654037435909b701f695afd2fd0753e8b66cf763bdfe36b96bfe73bb075b0
Parent
449ab5d6003c78e…
1 file changed
+16
-12
+16
-12
| --- src/pikchr.c | ||
| +++ src/pikchr.c | ||
| @@ -376,11 +376,11 @@ | ||
| 376 | 376 | char isLine; /* True if a line class */ |
| 377 | 377 | char eJust; /* Use box-style text justification */ |
| 378 | 378 | void (*xInit)(Pik*,PElem*); /* Initializer */ |
| 379 | 379 | void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */ |
| 380 | 380 | void (*xCheck)(Pik*,PElem*); /* Checks to after parsing */ |
| 381 | - PPoint (*xChop)(PElem*,PPoint*); /* Chopper */ | |
| 381 | + PPoint (*xChop)(Pik*,PElem*,PPoint*); /* Chopper */ | |
| 382 | 382 | PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from .c to edge point */ |
| 383 | 383 | void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */ |
| 384 | 384 | void (*xRender)(Pik*,PElem*); /* Render */ |
| 385 | 385 | }; |
| 386 | 386 | |
| @@ -3586,11 +3586,11 @@ | ||
| 3586 | 3586 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3587 | 3587 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3588 | 3588 | } |
| 3589 | 3589 | return pt; |
| 3590 | 3590 | } |
| 3591 | -static PPoint boxChop(PElem *pElem, PPoint *pPt){ | |
| 3591 | +static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){ | |
| 3592 | 3592 | PNum dx, dy; |
| 3593 | 3593 | int cp = CP_C; |
| 3594 | 3594 | PPoint chop = pElem->ptAt; |
| 3595 | 3595 | if( pElem->w<=0.0 ) return chop; |
| 3596 | 3596 | if( pElem->h<=0.0 ) return chop; |
| @@ -3619,11 +3619,11 @@ | ||
| 3619 | 3619 | cp = CP_SW; |
| 3620 | 3620 | }else{ |
| 3621 | 3621 | cp = CP_S; |
| 3622 | 3622 | } |
| 3623 | 3623 | } |
| 3624 | - chop = pElem->type->xOffset(0,pElem,cp); | |
| 3624 | + chop = pElem->type->xOffset(p,pElem,cp); | |
| 3625 | 3625 | chop.x += pElem->ptAt.x; |
| 3626 | 3626 | chop.y += pElem->ptAt.y; |
| 3627 | 3627 | return chop; |
| 3628 | 3628 | } |
| 3629 | 3629 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| @@ -3705,11 +3705,11 @@ | ||
| 3705 | 3705 | pElem->w = pElem->h; |
| 3706 | 3706 | pElem->rad = 0.5*pElem->w; |
| 3707 | 3707 | break; |
| 3708 | 3708 | } |
| 3709 | 3709 | } |
| 3710 | -static PPoint circleChop(PElem *pElem, PPoint *pPt){ | |
| 3710 | +static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){ | |
| 3711 | 3711 | PPoint chop; |
| 3712 | 3712 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3713 | 3713 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3714 | 3714 | PNum dist = hypot(dx,dy); |
| 3715 | 3715 | if( dist<pElem->rad ) return pElem->ptAt; |
| @@ -3830,11 +3830,11 @@ | ||
| 3830 | 3830 | /* Methods for the "ellipse" class */ |
| 3831 | 3831 | static void ellipseInit(Pik *p, PElem *pElem){ |
| 3832 | 3832 | pElem->w = pik_value(p, "ellipsewid",10,0); |
| 3833 | 3833 | pElem->h = pik_value(p, "ellipseht",9,0); |
| 3834 | 3834 | } |
| 3835 | -static PPoint ellipseChop(PElem *pElem, PPoint *pPt){ | |
| 3835 | +static PPoint ellipseChop(Pik *p, PElem *pElem, PPoint *pPt){ | |
| 3836 | 3836 | PPoint chop; |
| 3837 | 3837 | PNum s, dq, dist; |
| 3838 | 3838 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3839 | 3839 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3840 | 3840 | if( pElem->w<=0.0 ) return pElem->ptAt; |
| @@ -5573,11 +5573,11 @@ | ||
| 5573 | 5573 | cnt++; |
| 5574 | 5574 | if( z[j]=='\\' && z[j+1]!='&' ){ |
| 5575 | 5575 | j++; |
| 5576 | 5576 | }else if( z[j]=='&' ){ |
| 5577 | 5577 | int k; |
| 5578 | - for(k=j+1; k<j+7 && z[k]!=';'; k++){} | |
| 5578 | + for(k=j+1; k<j+7 && z[k]!=0 && z[k]!=';'; k++){} | |
| 5579 | 5579 | if( z[k]==';' ) j = k; |
| 5580 | 5580 | } |
| 5581 | 5581 | } |
| 5582 | 5582 | return cnt; |
| 5583 | 5583 | } |
| @@ -6111,11 +6111,11 @@ | ||
| 6111 | 6111 | ** of pFrom. |
| 6112 | 6112 | */ |
| 6113 | 6113 | static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){ |
| 6114 | 6114 | PElem *pElem = pik_find_chopper(p->list, pTo); |
| 6115 | 6115 | if( pElem ){ |
| 6116 | - *pTo = pElem->type->xChop(pElem, pFrom); | |
| 6116 | + *pTo = pElem->type->xChop(p, pElem, pFrom); | |
| 6117 | 6117 | } |
| 6118 | 6118 | } |
| 6119 | 6119 | |
| 6120 | 6120 | /* This routine runs after all attributes have been received |
| 6121 | 6121 | ** on an element. |
| @@ -6591,11 +6591,15 @@ | ||
| 6591 | 6591 | pToken->eType = T_EOL; |
| 6592 | 6592 | return 1; |
| 6593 | 6593 | } |
| 6594 | 6594 | case '"': { |
| 6595 | 6595 | for(i=1; (c = z[i])!=0; i++){ |
| 6596 | - if( c=='\\' ){ i++; continue; } | |
| 6596 | + if( c=='\\' ){ | |
| 6597 | + if( z[i+1]==0 ) break; | |
| 6598 | + i++; | |
| 6599 | + continue; | |
| 6600 | + } | |
| 6597 | 6601 | if( c=='"' ){ |
| 6598 | 6602 | pToken->eType = T_STRING; |
| 6599 | 6603 | return i+1; |
| 6600 | 6604 | } |
| 6601 | 6605 | } |
| @@ -6718,11 +6722,11 @@ | ||
| 6718 | 6722 | pFound->eType==T_START || |
| 6719 | 6723 | pFound->eType==T_END ) |
| 6720 | 6724 | ){ |
| 6721 | 6725 | /* Dot followed by something that is a 2-D place value */ |
| 6722 | 6726 | pToken->eType = T_DOT_E; |
| 6723 | - }else if( pFound->eType==T_X || pFound->eType==T_Y ){ | |
| 6727 | + }else if( pFound && (pFound->eType==T_X || pFound->eType==T_Y) ){ | |
| 6724 | 6728 | /* Dot followed by "x" or "y" */ |
| 6725 | 6729 | pToken->eType = T_DOT_XY; |
| 6726 | 6730 | }else{ |
| 6727 | 6731 | /* Any other "dot" */ |
| 6728 | 6732 | pToken->eType = T_DOT_L; |
| @@ -6745,11 +6749,11 @@ | ||
| 6745 | 6749 | int isInt = 1; |
| 6746 | 6750 | if( c!='.' ){ |
| 6747 | 6751 | nDigit = 1; |
| 6748 | 6752 | for(i=1; (c = z[i])>='0' && c<='9'; i++){ nDigit++; } |
| 6749 | 6753 | if( i==1 && (c=='x' || c=='X') ){ |
| 6750 | - for(i=3; (c = z[i])!=0 && isxdigit(c); i++){} | |
| 6754 | + for(i=2; (c = z[i])!=0 && isxdigit(c); i++){} | |
| 6751 | 6755 | pToken->eType = T_NUMBER; |
| 6752 | 6756 | return i; |
| 6753 | 6757 | } |
| 6754 | 6758 | }else{ |
| 6755 | 6759 | isInt = 0; |
| @@ -6777,11 +6781,11 @@ | ||
| 6777 | 6781 | i++; |
| 6778 | 6782 | isInt = 0; |
| 6779 | 6783 | while( (c = z[i])>=0 && c<='9' ){ i++; } |
| 6780 | 6784 | } |
| 6781 | 6785 | } |
| 6782 | - c2 = z[i+1]; | |
| 6786 | + c2 = c ? z[i+1] : 0; | |
| 6783 | 6787 | if( isInt ){ |
| 6784 | 6788 | if( (c=='t' && c2=='h') |
| 6785 | 6789 | || (c=='r' && c2=='d') |
| 6786 | 6790 | || (c=='n' && c2=='d') |
| 6787 | 6791 | || (c=='s' && c2=='t') |
| @@ -7051,6 +7055,6 @@ | ||
| 7051 | 7055 | printf("</body></html>\n"); |
| 7052 | 7056 | return 0; |
| 7053 | 7057 | } |
| 7054 | 7058 | #endif /* PIKCHR_SHELL */ |
| 7055 | 7059 | |
| 7056 | -#line 7081 "pikchr.c" | |
| 7060 | +#line 7085 "pikchr.c" | |
| 7057 | 7061 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -376,11 +376,11 @@ | |
| 376 | char isLine; /* True if a line class */ |
| 377 | char eJust; /* Use box-style text justification */ |
| 378 | void (*xInit)(Pik*,PElem*); /* Initializer */ |
| 379 | void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */ |
| 380 | void (*xCheck)(Pik*,PElem*); /* Checks to after parsing */ |
| 381 | PPoint (*xChop)(PElem*,PPoint*); /* Chopper */ |
| 382 | PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from .c to edge point */ |
| 383 | void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */ |
| 384 | void (*xRender)(Pik*,PElem*); /* Render */ |
| 385 | }; |
| 386 | |
| @@ -3586,11 +3586,11 @@ | |
| 3586 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3587 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3588 | } |
| 3589 | return pt; |
| 3590 | } |
| 3591 | static PPoint boxChop(PElem *pElem, PPoint *pPt){ |
| 3592 | PNum dx, dy; |
| 3593 | int cp = CP_C; |
| 3594 | PPoint chop = pElem->ptAt; |
| 3595 | if( pElem->w<=0.0 ) return chop; |
| 3596 | if( pElem->h<=0.0 ) return chop; |
| @@ -3619,11 +3619,11 @@ | |
| 3619 | cp = CP_SW; |
| 3620 | }else{ |
| 3621 | cp = CP_S; |
| 3622 | } |
| 3623 | } |
| 3624 | chop = pElem->type->xOffset(0,pElem,cp); |
| 3625 | chop.x += pElem->ptAt.x; |
| 3626 | chop.y += pElem->ptAt.y; |
| 3627 | return chop; |
| 3628 | } |
| 3629 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| @@ -3705,11 +3705,11 @@ | |
| 3705 | pElem->w = pElem->h; |
| 3706 | pElem->rad = 0.5*pElem->w; |
| 3707 | break; |
| 3708 | } |
| 3709 | } |
| 3710 | static PPoint circleChop(PElem *pElem, PPoint *pPt){ |
| 3711 | PPoint chop; |
| 3712 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3713 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3714 | PNum dist = hypot(dx,dy); |
| 3715 | if( dist<pElem->rad ) return pElem->ptAt; |
| @@ -3830,11 +3830,11 @@ | |
| 3830 | /* Methods for the "ellipse" class */ |
| 3831 | static void ellipseInit(Pik *p, PElem *pElem){ |
| 3832 | pElem->w = pik_value(p, "ellipsewid",10,0); |
| 3833 | pElem->h = pik_value(p, "ellipseht",9,0); |
| 3834 | } |
| 3835 | static PPoint ellipseChop(PElem *pElem, PPoint *pPt){ |
| 3836 | PPoint chop; |
| 3837 | PNum s, dq, dist; |
| 3838 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3839 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3840 | if( pElem->w<=0.0 ) return pElem->ptAt; |
| @@ -5573,11 +5573,11 @@ | |
| 5573 | cnt++; |
| 5574 | if( z[j]=='\\' && z[j+1]!='&' ){ |
| 5575 | j++; |
| 5576 | }else if( z[j]=='&' ){ |
| 5577 | int k; |
| 5578 | for(k=j+1; k<j+7 && z[k]!=';'; k++){} |
| 5579 | if( z[k]==';' ) j = k; |
| 5580 | } |
| 5581 | } |
| 5582 | return cnt; |
| 5583 | } |
| @@ -6111,11 +6111,11 @@ | |
| 6111 | ** of pFrom. |
| 6112 | */ |
| 6113 | static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){ |
| 6114 | PElem *pElem = pik_find_chopper(p->list, pTo); |
| 6115 | if( pElem ){ |
| 6116 | *pTo = pElem->type->xChop(pElem, pFrom); |
| 6117 | } |
| 6118 | } |
| 6119 | |
| 6120 | /* This routine runs after all attributes have been received |
| 6121 | ** on an element. |
| @@ -6591,11 +6591,15 @@ | |
| 6591 | pToken->eType = T_EOL; |
| 6592 | return 1; |
| 6593 | } |
| 6594 | case '"': { |
| 6595 | for(i=1; (c = z[i])!=0; i++){ |
| 6596 | if( c=='\\' ){ i++; continue; } |
| 6597 | if( c=='"' ){ |
| 6598 | pToken->eType = T_STRING; |
| 6599 | return i+1; |
| 6600 | } |
| 6601 | } |
| @@ -6718,11 +6722,11 @@ | |
| 6718 | pFound->eType==T_START || |
| 6719 | pFound->eType==T_END ) |
| 6720 | ){ |
| 6721 | /* Dot followed by something that is a 2-D place value */ |
| 6722 | pToken->eType = T_DOT_E; |
| 6723 | }else if( pFound->eType==T_X || pFound->eType==T_Y ){ |
| 6724 | /* Dot followed by "x" or "y" */ |
| 6725 | pToken->eType = T_DOT_XY; |
| 6726 | }else{ |
| 6727 | /* Any other "dot" */ |
| 6728 | pToken->eType = T_DOT_L; |
| @@ -6745,11 +6749,11 @@ | |
| 6745 | int isInt = 1; |
| 6746 | if( c!='.' ){ |
| 6747 | nDigit = 1; |
| 6748 | for(i=1; (c = z[i])>='0' && c<='9'; i++){ nDigit++; } |
| 6749 | if( i==1 && (c=='x' || c=='X') ){ |
| 6750 | for(i=3; (c = z[i])!=0 && isxdigit(c); i++){} |
| 6751 | pToken->eType = T_NUMBER; |
| 6752 | return i; |
| 6753 | } |
| 6754 | }else{ |
| 6755 | isInt = 0; |
| @@ -6777,11 +6781,11 @@ | |
| 6777 | i++; |
| 6778 | isInt = 0; |
| 6779 | while( (c = z[i])>=0 && c<='9' ){ i++; } |
| 6780 | } |
| 6781 | } |
| 6782 | c2 = z[i+1]; |
| 6783 | if( isInt ){ |
| 6784 | if( (c=='t' && c2=='h') |
| 6785 | || (c=='r' && c2=='d') |
| 6786 | || (c=='n' && c2=='d') |
| 6787 | || (c=='s' && c2=='t') |
| @@ -7051,6 +7055,6 @@ | |
| 7051 | printf("</body></html>\n"); |
| 7052 | return 0; |
| 7053 | } |
| 7054 | #endif /* PIKCHR_SHELL */ |
| 7055 | |
| 7056 | #line 7081 "pikchr.c" |
| 7057 |
| --- src/pikchr.c | |
| +++ src/pikchr.c | |
| @@ -376,11 +376,11 @@ | |
| 376 | char isLine; /* True if a line class */ |
| 377 | char eJust; /* Use box-style text justification */ |
| 378 | void (*xInit)(Pik*,PElem*); /* Initializer */ |
| 379 | void (*xNumProp)(Pik*,PElem*,PToken*); /* Value change notification */ |
| 380 | void (*xCheck)(Pik*,PElem*); /* Checks to after parsing */ |
| 381 | PPoint (*xChop)(Pik*,PElem*,PPoint*); /* Chopper */ |
| 382 | PPoint (*xOffset)(Pik*,PElem*,int); /* Offset from .c to edge point */ |
| 383 | void (*xFit)(Pik*,PElem*,PNum w,PNum h); /* Size to fit text */ |
| 384 | void (*xRender)(Pik*,PElem*); /* Render */ |
| 385 | }; |
| 386 | |
| @@ -3586,11 +3586,11 @@ | |
| 3586 | case CP_W: pt.x = -w2; pt.y = 0.0; break; |
| 3587 | case CP_NW: pt.x = rx-w2; pt.y = h2-rx; break; |
| 3588 | } |
| 3589 | return pt; |
| 3590 | } |
| 3591 | static PPoint boxChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3592 | PNum dx, dy; |
| 3593 | int cp = CP_C; |
| 3594 | PPoint chop = pElem->ptAt; |
| 3595 | if( pElem->w<=0.0 ) return chop; |
| 3596 | if( pElem->h<=0.0 ) return chop; |
| @@ -3619,11 +3619,11 @@ | |
| 3619 | cp = CP_SW; |
| 3620 | }else{ |
| 3621 | cp = CP_S; |
| 3622 | } |
| 3623 | } |
| 3624 | chop = pElem->type->xOffset(p,pElem,cp); |
| 3625 | chop.x += pElem->ptAt.x; |
| 3626 | chop.y += pElem->ptAt.y; |
| 3627 | return chop; |
| 3628 | } |
| 3629 | static void boxFit(Pik *p, PElem *pElem, PNum w, PNum h){ |
| @@ -3705,11 +3705,11 @@ | |
| 3705 | pElem->w = pElem->h; |
| 3706 | pElem->rad = 0.5*pElem->w; |
| 3707 | break; |
| 3708 | } |
| 3709 | } |
| 3710 | static PPoint circleChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3711 | PPoint chop; |
| 3712 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3713 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3714 | PNum dist = hypot(dx,dy); |
| 3715 | if( dist<pElem->rad ) return pElem->ptAt; |
| @@ -3830,11 +3830,11 @@ | |
| 3830 | /* Methods for the "ellipse" class */ |
| 3831 | static void ellipseInit(Pik *p, PElem *pElem){ |
| 3832 | pElem->w = pik_value(p, "ellipsewid",10,0); |
| 3833 | pElem->h = pik_value(p, "ellipseht",9,0); |
| 3834 | } |
| 3835 | static PPoint ellipseChop(Pik *p, PElem *pElem, PPoint *pPt){ |
| 3836 | PPoint chop; |
| 3837 | PNum s, dq, dist; |
| 3838 | PNum dx = pPt->x - pElem->ptAt.x; |
| 3839 | PNum dy = pPt->y - pElem->ptAt.y; |
| 3840 | if( pElem->w<=0.0 ) return pElem->ptAt; |
| @@ -5573,11 +5573,11 @@ | |
| 5573 | cnt++; |
| 5574 | if( z[j]=='\\' && z[j+1]!='&' ){ |
| 5575 | j++; |
| 5576 | }else if( z[j]=='&' ){ |
| 5577 | int k; |
| 5578 | for(k=j+1; k<j+7 && z[k]!=0 && z[k]!=';'; k++){} |
| 5579 | if( z[k]==';' ) j = k; |
| 5580 | } |
| 5581 | } |
| 5582 | return cnt; |
| 5583 | } |
| @@ -6111,11 +6111,11 @@ | |
| 6111 | ** of pFrom. |
| 6112 | */ |
| 6113 | static void pik_autochop(Pik *p, PPoint *pFrom, PPoint *pTo){ |
| 6114 | PElem *pElem = pik_find_chopper(p->list, pTo); |
| 6115 | if( pElem ){ |
| 6116 | *pTo = pElem->type->xChop(p, pElem, pFrom); |
| 6117 | } |
| 6118 | } |
| 6119 | |
| 6120 | /* This routine runs after all attributes have been received |
| 6121 | ** on an element. |
| @@ -6591,11 +6591,15 @@ | |
| 6591 | pToken->eType = T_EOL; |
| 6592 | return 1; |
| 6593 | } |
| 6594 | case '"': { |
| 6595 | for(i=1; (c = z[i])!=0; i++){ |
| 6596 | if( c=='\\' ){ |
| 6597 | if( z[i+1]==0 ) break; |
| 6598 | i++; |
| 6599 | continue; |
| 6600 | } |
| 6601 | if( c=='"' ){ |
| 6602 | pToken->eType = T_STRING; |
| 6603 | return i+1; |
| 6604 | } |
| 6605 | } |
| @@ -6718,11 +6722,11 @@ | |
| 6722 | pFound->eType==T_START || |
| 6723 | pFound->eType==T_END ) |
| 6724 | ){ |
| 6725 | /* Dot followed by something that is a 2-D place value */ |
| 6726 | pToken->eType = T_DOT_E; |
| 6727 | }else if( pFound && (pFound->eType==T_X || pFound->eType==T_Y) ){ |
| 6728 | /* Dot followed by "x" or "y" */ |
| 6729 | pToken->eType = T_DOT_XY; |
| 6730 | }else{ |
| 6731 | /* Any other "dot" */ |
| 6732 | pToken->eType = T_DOT_L; |
| @@ -6745,11 +6749,11 @@ | |
| 6749 | int isInt = 1; |
| 6750 | if( c!='.' ){ |
| 6751 | nDigit = 1; |
| 6752 | for(i=1; (c = z[i])>='0' && c<='9'; i++){ nDigit++; } |
| 6753 | if( i==1 && (c=='x' || c=='X') ){ |
| 6754 | for(i=2; (c = z[i])!=0 && isxdigit(c); i++){} |
| 6755 | pToken->eType = T_NUMBER; |
| 6756 | return i; |
| 6757 | } |
| 6758 | }else{ |
| 6759 | isInt = 0; |
| @@ -6777,11 +6781,11 @@ | |
| 6781 | i++; |
| 6782 | isInt = 0; |
| 6783 | while( (c = z[i])>=0 && c<='9' ){ i++; } |
| 6784 | } |
| 6785 | } |
| 6786 | c2 = c ? z[i+1] : 0; |
| 6787 | if( isInt ){ |
| 6788 | if( (c=='t' && c2=='h') |
| 6789 | || (c=='r' && c2=='d') |
| 6790 | || (c=='n' && c2=='d') |
| 6791 | || (c=='s' && c2=='t') |
| @@ -7051,6 +7055,6 @@ | |
| 7055 | printf("</body></html>\n"); |
| 7056 | return 0; |
| 7057 | } |
| 7058 | #endif /* PIKCHR_SHELL */ |
| 7059 | |
| 7060 | #line 7085 "pikchr.c" |
| 7061 |