mirror of
https://github.com/cc65/cc65.git
synced 2024-09-29 17:56:21 +00:00
Added a new feature "underline_in_numbers" requested by thefox. Using
underlines it is possible to group the digits for easier reading. git-svn-id: svn://svn.cc65.org/cc65/trunk@5963 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
ee5216f69b
commit
9fce84c722
@ -2719,6 +2719,17 @@ Here's a list of all control commands and a description, what they do:
|
|||||||
same name. This does also make it possible to introduce hard to find errors
|
same name. This does also make it possible to introduce hard to find errors
|
||||||
in your code, so be careful!
|
in your code, so be careful!
|
||||||
|
|
||||||
|
<tag><tt>underline_in_numbers</tt><label id="underline_in_numbers"></tag>
|
||||||
|
|
||||||
|
Allow underlines within numeric constants. These may be used for grouping
|
||||||
|
the digits of numbers for easier reading.
|
||||||
|
Example:
|
||||||
|
<tscreen><verb>
|
||||||
|
.feature underline_in_numbers
|
||||||
|
.word %1100001110100101
|
||||||
|
.word %1100_0011_1010_0101 ; Identical but easier to read
|
||||||
|
</verb></tscreen>
|
||||||
|
|
||||||
</descrip>
|
</descrip>
|
||||||
|
|
||||||
It is also possible to specify features on the command line using the
|
It is also possible to specify features on the command line using the
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000-2012, Ullrich von Bassewitz */
|
/* (C) 2000-2013, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -62,6 +62,7 @@ static const char* FeatureKeys[FEAT_COUNT] = {
|
|||||||
"ubiquitous_idents",
|
"ubiquitous_idents",
|
||||||
"c_comments",
|
"c_comments",
|
||||||
"force_range",
|
"force_range",
|
||||||
|
"underline_in_numbers",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -117,6 +118,7 @@ feature_t SetFeature (const StrBuf* Key)
|
|||||||
case FEAT_UBIQUITOUS_IDENTS: UbiquitousIdents = 1; break;
|
case FEAT_UBIQUITOUS_IDENTS: UbiquitousIdents = 1; break;
|
||||||
case FEAT_C_COMMENTS: CComments = 1; break;
|
case FEAT_C_COMMENTS: CComments = 1; break;
|
||||||
case FEAT_FORCE_RANGE: ForceRange = 1; break;
|
case FEAT_FORCE_RANGE: ForceRange = 1; break;
|
||||||
|
case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break;
|
||||||
default: /* Keep gcc silent */ break;
|
default: /* Keep gcc silent */ break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000-2012, Ullrich von Bassewitz */
|
/* (C) 2000-2013, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -64,6 +64,7 @@ typedef enum {
|
|||||||
FEAT_UBIQUITOUS_IDENTS,
|
FEAT_UBIQUITOUS_IDENTS,
|
||||||
FEAT_C_COMMENTS,
|
FEAT_C_COMMENTS,
|
||||||
FEAT_FORCE_RANGE,
|
FEAT_FORCE_RANGE,
|
||||||
|
FEAT_UNDERLINE_IN_NUMBERS,
|
||||||
|
|
||||||
/* Special value: Number of features available */
|
/* Special value: Number of features available */
|
||||||
FEAT_COUNT
|
FEAT_COUNT
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2012, Ullrich von Bassewitz */
|
/* (C) 1998-2013, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -81,7 +81,8 @@ unsigned char UbiquitousIdents = 0; /* Allow ubiquitous identifiers */
|
|||||||
unsigned char OrgPerSeg = 0; /* Make .org local to current seg */
|
unsigned char OrgPerSeg = 0; /* Make .org local to current seg */
|
||||||
unsigned char CComments = 0; /* Allow C like comments */
|
unsigned char CComments = 0; /* Allow C like comments */
|
||||||
unsigned char ForceRange = 0; /* Force values into expected range */
|
unsigned char ForceRange = 0; /* Force values into expected range */
|
||||||
|
unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */
|
||||||
|
|
||||||
/* Misc stuff */
|
/* Misc stuff */
|
||||||
const char Copyright[] = "(C) Copyright 1998-2011 Ullrich von Bassewitz";
|
const char Copyright[] = "(C) Copyright 1998-2011 Ullrich von Bassewitz";
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2012, Ullrich von Bassewitz */
|
/* (C) 1998-2013, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -83,6 +83,7 @@ extern unsigned char UbiquitousIdents; /* Allow ubiquitous identifiers */
|
|||||||
extern unsigned char OrgPerSeg; /* Make .org local to current seg */
|
extern unsigned char OrgPerSeg; /* Make .org local to current seg */
|
||||||
extern unsigned char CComments; /* Allow C like comments */
|
extern unsigned char CComments; /* Allow C like comments */
|
||||||
extern unsigned char ForceRange; /* Force values into expected range */
|
extern unsigned char ForceRange; /* Force values into expected range */
|
||||||
|
extern unsigned char UnderlineInNumbers; /* Allow underlines in numbers */
|
||||||
|
|
||||||
/* Misc stuff */
|
/* Misc stuff */
|
||||||
extern const char Copyright[]; /* Copyright string */
|
extern const char Copyright[]; /* Copyright string */
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2012, Ullrich von Bassewitz */
|
/* (C) 1998-2013, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -862,7 +862,7 @@ Again:
|
|||||||
if (!IsXDigit (C)) {
|
if (!IsXDigit (C)) {
|
||||||
if (DollarIsPC) {
|
if (DollarIsPC) {
|
||||||
CurTok.Tok = TOK_PC;
|
CurTok.Tok = TOK_PC;
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Error ("Hexadecimal digit expected");
|
Error ("Hexadecimal digit expected");
|
||||||
}
|
}
|
||||||
@ -870,14 +870,26 @@ Again:
|
|||||||
|
|
||||||
/* Read the number */
|
/* Read the number */
|
||||||
CurTok.IVal = 0;
|
CurTok.IVal = 0;
|
||||||
while (IsXDigit (C)) {
|
while (1) {
|
||||||
if (CurTok.IVal & 0xF0000000) {
|
if (UnderlineInNumbers && C == '_') {
|
||||||
Error ("Overflow in hexadecimal number");
|
while (C == '_') {
|
||||||
CurTok.IVal = 0;
|
NextChar ();
|
||||||
}
|
}
|
||||||
CurTok.IVal = (CurTok.IVal << 4) + DigitVal (C);
|
if (!IsXDigit (C)) {
|
||||||
NextChar ();
|
Error ("Number may not end with underline");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (IsXDigit (C)) {
|
||||||
|
if (CurTok.IVal & 0xF0000000) {
|
||||||
|
Error ("Overflow in hexadecimal number");
|
||||||
|
CurTok.IVal = 0;
|
||||||
|
}
|
||||||
|
CurTok.IVal = (CurTok.IVal << 4) + DigitVal (C);
|
||||||
|
NextChar ();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* This is an integer constant */
|
/* This is an integer constant */
|
||||||
CurTok.Tok = TOK_INTCON;
|
CurTok.Tok = TOK_INTCON;
|
||||||
@ -895,14 +907,26 @@ Again:
|
|||||||
|
|
||||||
/* Read the number */
|
/* Read the number */
|
||||||
CurTok.IVal = 0;
|
CurTok.IVal = 0;
|
||||||
while (IsBDigit (C)) {
|
while (1) {
|
||||||
if (CurTok.IVal & 0x80000000) {
|
if (UnderlineInNumbers && C == '_') {
|
||||||
Error ("Overflow in binary number");
|
while (C == '_') {
|
||||||
CurTok.IVal = 0;
|
NextChar ();
|
||||||
}
|
}
|
||||||
CurTok.IVal = (CurTok.IVal << 1) + DigitVal (C);
|
if (!IsBDigit (C)) {
|
||||||
NextChar ();
|
Error ("Number may not end with underline");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (IsBDigit (C)) {
|
||||||
|
if (CurTok.IVal & 0x80000000) {
|
||||||
|
Error ("Overflow in binary number");
|
||||||
|
CurTok.IVal = 0;
|
||||||
|
}
|
||||||
|
CurTok.IVal = (CurTok.IVal << 1) + DigitVal (C);
|
||||||
|
NextChar ();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* This is an integer constant */
|
/* This is an integer constant */
|
||||||
CurTok.Tok = TOK_INTCON;
|
CurTok.Tok = TOK_INTCON;
|
||||||
@ -926,17 +950,27 @@ Again:
|
|||||||
|
|
||||||
/* Read the number into Buf counting the digits */
|
/* Read the number into Buf counting the digits */
|
||||||
Digits = 0;
|
Digits = 0;
|
||||||
while (IsXDigit (C)) {
|
while (1) {
|
||||||
|
if (UnderlineInNumbers && C == '_') {
|
||||||
/* Buf is big enough to allow any decimal and hex number to
|
while (C == '_') {
|
||||||
* overflow, so ignore excess digits here, they will be detected
|
NextChar ();
|
||||||
* when we convert the value.
|
}
|
||||||
*/
|
if (!IsXDigit (C)) {
|
||||||
if (Digits < sizeof (Buf)) {
|
Error ("Number may not end with underline");
|
||||||
Buf[Digits++] = C;
|
}
|
||||||
|
}
|
||||||
|
if (IsXDigit (C)) {
|
||||||
|
/* Buf is big enough to allow any decimal and hex number to
|
||||||
|
* overflow, so ignore excess digits here, they will be detected
|
||||||
|
* when we convert the value.
|
||||||
|
*/
|
||||||
|
if (Digits < sizeof (Buf)) {
|
||||||
|
Buf[Digits++] = C;
|
||||||
|
}
|
||||||
|
NextChar ();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextChar ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow zilog/intel style hex numbers with a 'h' suffix */
|
/* Allow zilog/intel style hex numbers with a 'h' suffix */
|
||||||
|
Loading…
Reference in New Issue
Block a user