1
0
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:
uz 2013-01-12 19:07:31 +00:00
parent ee5216f69b
commit 9fce84c722
6 changed files with 83 additions and 33 deletions

View File

@ -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

View File

@ -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;
} }

View File

@ -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

View File

@ -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";

View File

@ -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 */

View File

@ -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 */