From: uz Date: Sat, 12 Jan 2013 19:07:31 +0000 (+0000) Subject: Added a new feature "underline_in_numbers" requested by thefox. Using X-Git-Tag: V2.14~111 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9fce84c72222b1fec2a7f80c3059d3ee6e752971;p=cc65 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 --- diff --git a/doc/ca65.sgml b/doc/ca65.sgml index a5cf80a69..084693474 100644 --- a/doc/ca65.sgml +++ b/doc/ca65.sgml @@ -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 in your code, so be careful! + underline_in_numbers + + Allow underlines within numeric constants. These may be used for grouping + the digits of numbers for easier reading. + Example: + + .feature underline_in_numbers + .word %1100001110100101 + .word %1100_0011_1010_0101 ; Identical but easier to read + + It is also possible to specify features on the command line using the diff --git a/src/ca65/feature.c b/src/ca65/feature.c index f0ba4c578..0a45ded86 100644 --- a/src/ca65/feature.c +++ b/src/ca65/feature.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 2000-2012, Ullrich von Bassewitz */ +/* (C) 2000-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -62,6 +62,7 @@ static const char* FeatureKeys[FEAT_COUNT] = { "ubiquitous_idents", "c_comments", "force_range", + "underline_in_numbers", }; @@ -117,6 +118,7 @@ feature_t SetFeature (const StrBuf* Key) case FEAT_UBIQUITOUS_IDENTS: UbiquitousIdents = 1; break; case FEAT_C_COMMENTS: CComments = 1; break; case FEAT_FORCE_RANGE: ForceRange = 1; break; + case FEAT_UNDERLINE_IN_NUMBERS: UnderlineInNumbers= 1; break; default: /* Keep gcc silent */ break; } diff --git a/src/ca65/feature.h b/src/ca65/feature.h index cf2f3ade8..a56fc57f0 100644 --- a/src/ca65/feature.h +++ b/src/ca65/feature.h @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 2000-2012, Ullrich von Bassewitz */ +/* (C) 2000-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -64,6 +64,7 @@ typedef enum { FEAT_UBIQUITOUS_IDENTS, FEAT_C_COMMENTS, FEAT_FORCE_RANGE, + FEAT_UNDERLINE_IN_NUMBERS, /* Special value: Number of features available */ FEAT_COUNT diff --git a/src/ca65/global.c b/src/ca65/global.c index 90f6c43c7..cc6835562 100644 --- a/src/ca65/global.c +++ b/src/ca65/global.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2012, Ullrich von Bassewitz */ +/* (C) 1998-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* 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 CComments = 0; /* Allow C like comments */ unsigned char ForceRange = 0; /* Force values into expected range */ - +unsigned char UnderlineInNumbers = 0; /* Allow underlines in numbers */ + /* Misc stuff */ const char Copyright[] = "(C) Copyright 1998-2011 Ullrich von Bassewitz"; diff --git a/src/ca65/global.h b/src/ca65/global.h index 8d03c01a7..5e660055a 100644 --- a/src/ca65/global.h +++ b/src/ca65/global.h @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2012, Ullrich von Bassewitz */ +/* (C) 1998-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* 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 CComments; /* Allow C like comments */ extern unsigned char ForceRange; /* Force values into expected range */ +extern unsigned char UnderlineInNumbers; /* Allow underlines in numbers */ /* Misc stuff */ extern const char Copyright[]; /* Copyright string */ diff --git a/src/ca65/scanner.c b/src/ca65/scanner.c index 1ce48fa8a..d36df2d06 100644 --- a/src/ca65/scanner.c +++ b/src/ca65/scanner.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2012, Ullrich von Bassewitz */ +/* (C) 1998-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -862,7 +862,7 @@ Again: if (!IsXDigit (C)) { if (DollarIsPC) { CurTok.Tok = TOK_PC; - return; + return; } else { Error ("Hexadecimal digit expected"); } @@ -870,14 +870,26 @@ Again: /* Read the number */ CurTok.IVal = 0; - while (IsXDigit (C)) { - if (CurTok.IVal & 0xF0000000) { - Error ("Overflow in hexadecimal number"); - CurTok.IVal = 0; - } - CurTok.IVal = (CurTok.IVal << 4) + DigitVal (C); - NextChar (); - } + while (1) { + if (UnderlineInNumbers && C == '_') { + while (C == '_') { + NextChar (); + } + if (!IsXDigit (C)) { + 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 */ CurTok.Tok = TOK_INTCON; @@ -895,14 +907,26 @@ Again: /* Read the number */ CurTok.IVal = 0; - while (IsBDigit (C)) { - if (CurTok.IVal & 0x80000000) { - Error ("Overflow in binary number"); - CurTok.IVal = 0; - } - CurTok.IVal = (CurTok.IVal << 1) + DigitVal (C); - NextChar (); - } + while (1) { + if (UnderlineInNumbers && C == '_') { + while (C == '_') { + NextChar (); + } + if (!IsBDigit (C)) { + 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 */ CurTok.Tok = TOK_INTCON; @@ -926,17 +950,27 @@ Again: /* Read the number into Buf counting the digits */ Digits = 0; - while (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; + while (1) { + if (UnderlineInNumbers && C == '_') { + while (C == '_') { + NextChar (); + } + if (!IsXDigit (C)) { + Error ("Number may not end with underline"); + } + } + 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 */