Skip to content

Instantly share code, notes, and snippets.

@bubach
Created July 7, 2020 02:50
Show Gist options
  • Select an option

  • Save bubach/7be6907f903fdf51f74e814a83d0f4cd to your computer and use it in GitHub Desktop.

Select an option

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