Created
July 7, 2020 02:50
-
-
Save bubach/7be6907f903fdf51f74e814a83d0f4cd to your computer and use it in GitHub Desktop.
C-code showcasing macro DSL, it's old (-89), weird, but strangely awesome
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * Example structure definition | |
| */ | |
| Structure DTA_struct | |
| BeginStructure | |
| byte DOS_reserved[21]; | |
| bit_8 attribute; | |
| bit_16 time_stamp; | |
| bit_16 date_stamp; | |
| bit_32 file_size; | |
| byte filename[13]; | |
| byte filler[85]; | |
| EndStructure; | |
| /* | |
| * Typedefs for it ;) | |
| */ | |
| Type Structure DTA_struct DTA_type; | |
| Type DTA_type far *DTA_ptr; | |
| /* | |
| * A method dealing with the structure | |
| */ | |
| DTA_ptr get_DTA_address() | |
| BeginDeclarations | |
| DTA_ptr DTA_address; | |
| EndDeclarations | |
| BeginCode | |
| inregs.h.ah = 0x2F; /* Get DTA address */ | |
| intdosx(Addr(inregs), Addr(outregs), Addr(segregs)); | |
| DTA_address = (DTA_ptr) MakeFarPtr(segregs.es, outregs.x.bx); | |
| return(DTA_address); | |
| EndCode | |
| /* | |
| * A pattern matching loop example | |
| */ | |
| While len Exceeds 0 | |
| BeginWhile | |
| If *pattern Is '*' | |
| Then | |
| return(True); | |
| EndIf; | |
| If (*pattern IsNot '?') AndIf (*pattern IsNot *source) | |
| Then | |
| return(False); | |
| EndIf; | |
| source++; | |
| pattern++; | |
| EndWhile; | |
| return(True); | |
| /* | |
| * Small method example | |
| */ | |
| bit_16 order_expression() | |
| BeginDeclarations | |
| bit_16 left_operand; | |
| EndDeclarations | |
| BeginCode | |
| get_order_token(); | |
| left_operand = order_term(); | |
| While TokenIs(or_string) OrIf | |
| TokenIs(plus_string) OrIf | |
| TokenIs(bar_string) | |
| BeginWhile | |
| get_order_token(); | |
| left_operand |= order_term(); | |
| EndWhile; | |
| return(left_operand); | |
| EndCode |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* LANGEXT.H */ | |
| /* Fixup some C syntax I really don't like | |
| De gustibus non est desputandum | |
| (Concerning taste there is not argument -- or | |
| Only fools argue where taste is concerned) */ | |
| /* Block basic C commands */ | |
| #define If if ( | |
| #define Then ) { | |
| #define Else } else { | |
| #define ElseIf } else if ( | |
| #define EndIf } | |
| #define Using switch ( | |
| #define BeginCase ) { | |
| #define When case | |
| #define Otherwise default | |
| #define EndCase } | |
| #define Loop while(1) | |
| #define BeginLoop { | |
| #define EndLoop } | |
| #define ExitLoop break | |
| #define ContinueLoop continue | |
| #define ExitIf(cond) if (cond) break | |
| #define LoopIf(cond) if (cond) continue | |
| #define While while ( | |
| #define BeginWhile ) { | |
| #define EndWhile } | |
| #define Repeat do | |
| #define BeginRepeat { | |
| #define RepeatIf } while (( | |
| #define Until } while (!( | |
| #define EndRepeat )) | |
| #define For for ( | |
| #define BeginFor ) { | |
| #define EndFor } | |
| #define BeginDeclarations { | |
| #define EndDeclarations | |
| #define BeginCode | |
| #define EndCode } | |
| #define Type typedef | |
| #define Structure struct | |
| #define BeginStructure { | |
| #define EndStructure } | |
| #define Union union | |
| #define BeginUnion { | |
| #define EndUnion } | |
| #define Enumeration enum | |
| #define BeginEnumeration { | |
| #define EndEnumeration } | |
| /* Extended C commands */ | |
| /* Linked List commands */ | |
| #define ListTypeOf(exp) \ | |
| Structure exp##_list_struct \ | |
| BeginStructure \ | |
| exp##_ptr first; \ | |
| exp##_ptr last; \ | |
| EndStructure; \ | |
| Type Structure exp##_list_struct exp##_list | |
| Structure Generic_Element_struct | |
| BeginStructure | |
| Structure Generic_Element_struct far *next; | |
| EndStructure; | |
| Type Structure Generic_Element_struct Generic_Element_type; | |
| Type Generic_Element_type far *Generic_Element_ptr; | |
| ListTypeOf(Generic_Element); | |
| #define TraverseList(lst,elm) for(elm=lst.first; elm IsNotNull; Next(elm)) | |
| #define BeginTraverse { | |
| #define EndTraverse } | |
| #define Insert ListInsert((Generic_Element_ptr) | |
| #define After ,0,(Generic_Element_ptr) | |
| #define AtEnd ,1,Null | |
| #define AtBeginning ,2,Null | |
| #define InList ,(Generic_Element_list far *) &( | |
| #define EndInsert )) | |
| #define Delete ListDelete((Generic_Element_ptr) | |
| #define FromList ,(Generic_Element_list far *) &( | |
| #define EndDelete )) | |
| #define Push ListInsert((Generic_Element_ptr) | |
| #define OnTo ,2,Null,(Generic_Element_list far *) &( | |
| #define EndPush )) | |
| #define Pop ListPop((Generic_Element_list far *) &( | |
| #define InTo ),(Generic_Element_ptr *) &( | |
| #define EndPop )) | |
| #define LastInList(ptr) ((*ptr).next == NULL) | |
| #define Next(ptr) ptr = (*ptr).next | |
| #define First(list) list.first | |
| #define Last(list) list.last | |
| /* Make operations less cryptic */ | |
| /* Logical operators */ | |
| #define AndIf && | |
| #define OrIf || | |
| #define Not ! | |
| #define Is == | |
| #define IsNot != | |
| #define IsEqualTo == | |
| #define Equals == | |
| #define IsNotEqualTo != | |
| #define LessThan < | |
| #define NotLessThan >= | |
| #define LessThanOrEqualTo <= | |
| #define GreaterThan > | |
| #define Exceeds > | |
| #define Positive > 0 | |
| #define Negative < 0 | |
| #define IsZero == 0 | |
| #define IsNull == 0 | |
| #define IsNotNull != 0 | |
| #define IsEmpty == 0 | |
| #define IsNotEmpty != 0 | |
| #define IsNotZero != 0 | |
| #define IsTrue != 0 | |
| #define IsFalse == 0 | |
| #define NotGreaterThan <= | |
| #define GreaterThanOrEqualTo >= | |
| #define IsIdentifier(x) (((x>='A') && (x<='Z')) || \ | |
| ((x>='a') && (x<='z')) || \ | |
| (x=='_')) | |
| #define IsNumber(x) ((x>='0') && (x<='9')) | |
| /* Bitwise operators */ | |
| #define And & | |
| #define Or | | |
| #define Xor ^ | |
| #define Complement ~ | |
| /* Some other operators */ | |
| #define Addr(exp) &(exp) | |
| #define Mod % | |
| #define ShiftedLeft << | |
| #define ShiftedRight >> | |
| /* Some useful constants */ | |
| #define False 0 | |
| #define Null 0 | |
| #define True 1 | |
| /* Some helpful types */ | |
| Type unsigned char bit_8; | |
| Type unsigned int bit_16; | |
| Type unsigned long bit_32; | |
| Type unsigned char byte; | |
| Type byte far *byte_ptr; | |
| Type void far *far_ptr; | |
| Type signed char int_8; | |
| Type signed int int_16; | |
| Type signed long int_32; | |
| Type void /* near */ *near_ptr; | |
| Type char /* near */ *char_ptr; | |
| Structure string_struct | |
| BeginStructure | |
| bit_16 max_length; | |
| bit_16 length; | |
| byte text[1]; | |
| EndStructure; | |
| Type Structure string_struct string_type; | |
| Type string_type far *string_ptr; | |
| #define String(str) ((byte_ptr) ((*str).text)) | |
| #define Length(str) (*str).length | |
| #define MaxLength(str) (*str).max_length | |
| #define FirstCharIn(str) *String(str) | |
| #define LastCharIn(str) String(str)[Length(str)-1] | |
| /* Some helpful type casts */ | |
| #define Bit_8(exp) ((bit_8) (exp)) | |
| #define Bit_16(exp) ((bit_16) (exp)) | |
| #define Bit_32(exp) ((bit_32) (exp)) | |
| #define Int_8(exp) ((int_8) (exp)) | |
| #define Int_16(exp) ((int_16) (exp)) | |
| #define Int_32(exp) ((int_32) (exp)) | |
| #define CharPtr(exp) ((char *) (exp)) | |
| #define Byte(exp) ((byte) (exp)) | |
| #define BytePtr(exp) ((byte_ptr ) (exp)) | |
| #define NearPtr(exp) ((near_ptr) (exp)) | |
| #define FarPtr(exp) ((far_ptr) (exp)) | |
| #define StringPtr(exp) ((string_ptr) (exp)) | |
| #define Offset(exp) ((bit_16) (exp)) | |
| #define Segment(exp) ((bit_16) (((bit_32) (exp)) >> 16L)) | |
| #define Low(exp) ((bit_16) (exp)) | |
| #define High(exp) ((bit_16) (((bit_32) (exp)) >> 16L)) | |
| #define MakeFarPtr(seg,off) ((far_ptr) ((((bit_32) (seg)) << 16L)|(off))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment