Overview
Comment: | Allow arguments to numeric arithmetic/bitwise macros to be directions and keys as well as numbers. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ee285414daaeb4d7703d5744fc9870a7 |
User & Date: | user on 2023-03-29 19:48:27 |
Other Links: | manifest | tags |
Context
2023-03-29
| ||
23:46 | Correct a memory leak in the recent change to the {edit} macro check-in: 54b97e96bb user: user tags: trunk | |
19:48 | Allow arguments to numeric arithmetic/bitwise macros to be directions and keys as well as numbers. check-in: ee285414da user: user tags: trunk | |
03:22 | Add the variant of the {edit} macro to edit an argument of a macro which is currently being expanded. check-in: 0548d34afe user: user tags: trunk | |
Changes
Modified class.c from [16b649f4e6] to [9cd1ad3346].
︙ | ︙ | |||
747 748 749 750 751 752 753 | begin_macro(macros[glohash[tokenv].id-0xC000]); goto again; case MAC_ADD: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; | | | | | | | | | | | | | | 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 | begin_macro(macros[glohash[tokenv].id-0xC000]); goto again; case MAC_ADD: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n+=tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_SUB: nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n=tokenv; nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n-=tokenv; nxttok(); if(tokent!=TF_MACRO+TF_CLOSE) ParseError("Too many macro arguments\n"); tokent=TF_INT; tokenv=n; break; case MAC_MUL: n=1; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n*=tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_DIV: nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n=tokenv; nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); if(!tokenv) ParseError("Division by zero\n"); n/=tokenv; nxttok(); if(tokent!=TF_MACRO+TF_CLOSE) ParseError("Too many macro arguments\n"); tokent=TF_INT; tokenv=n; break; case MAC_MOD: nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n=tokenv; nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); if(!tokenv) ParseError("Division by zero\n"); n%=tokenv; nxttok(); if(tokent!=TF_MACRO+TF_CLOSE) ParseError("Too many macro arguments\n"); tokent=TF_INT; tokenv=n; break; case MAC_BAND: n=-1; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n&=tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_BOR: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n|=tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_BXOR: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n^=tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_BNOT: nxttok(); if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); n=~tokenv; nxttok(); if(tokent!=TF_MACRO+TF_CLOSE) ParseError("Too many macro arguments\n"); tokent=TF_INT; tokenv=n; break; case MAC_CAT: |
︙ | ︙ | |||
873 874 875 876 877 878 879 | free(s); ReturnToken(TF_NAME|TF_ABNORMAL,OP_STRING); case MAC_BIT: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; | | | 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 | free(s); ReturnToken(TF_NAME|TF_ABNORMAL,OP_STRING); case MAC_BIT: n=0; for(;;) { nxttok(); if(tokent==TF_MACRO+TF_CLOSE) break; if(tokent!=TF_INT && tokent!=TF_NAME+TF_DIR && tokent!=TF_NAME+TF_KEY) ParseError("Number expected\n"); if(tokenv<32) n|=1<<tokenv; } tokent=TF_INT; tokenv=n; break; case MAC_MAKE: nxttok(); |
︙ | ︙ | |||
1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 | if(!macros) ParseError("Cannot edit nonexistent macro\n"); nxttok(); if(tokent==TF_INT) { if(!macstack) ParseError("Empty macro stack\n"); n=tokenv-1; nxttok(); if(n<0 || macstack->n<=n || !macstack->args[n]) ParseError("Cannot edit nonexistent argument %u\n",n+1); macstack->args[n]->t=tokent; macstack->args[n]->v=tokenv; macstack->args[n]->str=0; if(*tokenstr) { macstack->args[n]->str=strdup(tokenstr); if(!macstack->args[n]->str) fatal("Allocation failed\n"); } | > | 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 | if(!macros) ParseError("Cannot edit nonexistent macro\n"); nxttok(); if(tokent==TF_INT) { if(!macstack) ParseError("Empty macro stack\n"); n=tokenv-1; nxttok(); if(n<0 || macstack->n<=n || !macstack->args[n]) ParseError("Cannot edit nonexistent argument %u\n",n+1); if(macstack->args[n]->t&(TF_MACRO|TF_EOF)) ParseError("Invalid edit token\n"); macstack->args[n]->t=tokent; macstack->args[n]->v=tokenv; macstack->args[n]->str=0; if(*tokenstr) { macstack->args[n]->str=strdup(tokenstr); if(!macstack->args[n]->str) fatal("Allocation failed\n"); } |
︙ | ︙ |
Modified class.doc from [f144cf4bb5] to [33a36637f2].
︙ | ︙ | |||
207 208 209 210 211 212 213 214 215 216 217 218 219 220 | {mod <number> <number>} Modulo. {version <number>} Expands into nothing. The number must be zero, otherwise it is an error. Future versions of Free Hero Mesh may change this. It is possible to implement a tag system in this preprocessor, which makes it Turing complete. For example: {define "skip" {call \2}} {define "1" {skip \1|"3"|"3"|"2"|"1"|"H"}} {define "2" {skip \1|"3"|"3"|"1"}} | > > > | 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | {mod <number> <number>} Modulo. {version <number>} Expands into nothing. The number must be zero, otherwise it is an error. Future versions of Free Hero Mesh may change this. All arithmetic/bitwise macros also allow their arguments to be directions and keys, in which case they are treated as the corresponding numbers. It is possible to implement a tag system in this preprocessor, which makes it Turing complete. For example: {define "skip" {call \2}} {define "1" {skip \1|"3"|"3"|"2"|"1"|"H"}} {define "2" {skip \1|"3"|"3"|"1"}} |
︙ | ︙ |