home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / alt / hackers / 1982 < prev    next >
Encoding:
Text File  |  1993-01-25  |  10.6 KB  |  154 lines

  1. Newsgroups: alt.hackers
  2. Path: sparky!uunet!paladin.american.edu!howland.reston.ans.net!zaphod.mps.ohio-state.edu!cs.utexas.edu!hermes.chpc.utexas.edu!news.utdallas.edu!shane
  3. From: shane@utdallas.edu (Shane Davis)
  4. Subject: Re: Stupid macro tricks...
  5. Message-ID: <C1FACG.Mzv@utdallas.edu>
  6. Sender: usenet@utdallas.edu
  7. Nntp-Posting-Host: corvette.utdallas.edu
  8. Reply-To: shane@utdallas.edu
  9. Organization: The Univ. of Texas at Dallas, ACC
  10. References: <C1DnqE.L3u@mentor.cc.purdue.edu> <C1E75L.7J9@csugrad.cs.vt.edu>
  11. Date: Mon, 25 Jan 1993 18:36:15 GMT
  12. Approved: shane@utdallas.edu
  13. Lines: 139
  14.  
  15. In article <C1E75L.7J9@csugrad.cs.vt.edu>, lkestel@csugrad.cs.vt.edu (Lawrence Kesteloot) writes:
  16. |> daffnelr@mentor.cc.purdue.edu (Throatwarbler Mangrove) writes:
  17. |> 
  18. |> 
  19. |> >  Hey.. anyone out there got really
  20. |> >ugly/complicated/elegant/interesting macros in any of their programs?
  21. |> 
  22. |> This isn't actually my own program, but it's ugly enough that I thought
  23. |> you might like to see it.  It's from BSD Net/2, from the kernel malloc
  24. |> source code:
  25. |> 
  26.  
  27. Here's an ugly macro...in fact, every macro written for S/370 is ugly. I
  28. include it for variety's sake on this group (always C & UNIX!).
  29.  
  30. --Shane
  31.  
  32.          MACRO                                                          GEN0001
  33. &LABEL   GENCMD &ABBR=,&NEXTBL=,&PRIV=,&ROUTINE=,&USERH=,&PARM=         GEN0002
  34. .*                                                                      GEN0003
  35. .********************************************************************** GEN0004
  36. .* GENCMD - generate command/function tables for use with UTDCMD      * GEN0005
  37. .* parsing routines. The command or function name is specified by the * GEN0006
  38. .* label of the macro.                                                * GEN0007
  39. .*                                                                    * GEN0008
  40. .*        ABBR=n     - minimum abbreviation for this keyword          * GEN0009
  41. .*        NEXTBL=v   - label of subfunction table to parse next       * GEN0010
  42. .*        PRIV=n     - privilege level necessary to use this function * GEN0011
  43. .*                     (not checked or used by UTDCMD)                * GEN0012
  44. .*        ROUTINE=v  - address of routine to process this command     * GEN0013
  45. .*                     (transfer of control NOT made by UTDCMD)       * GEN0014
  46. .*        USERH=x    - user halfword (e.g., parameter to ROUTINE)     * GEN0015
  47. .*        PARM=(list)- up to three parameters for the function, typed * GEN0016
  48. .*                     as: ANY - any characters; NUM - numeric only;  * GEN0017
  49. .*                     ANUM - alphanumeric; LINE - remainder of line  * GEN0018
  50. .*                     ALPHA - alhpabetic only; OPT+any-of-the-above  * GEN0019
  51. .*                     (i.e., OPTNUM) makes the parameter optional.   * GEN0020
  52. .*                                                                    * GEN0021
  53. .* NEXTBL and PARM are mutually exclusive. Register operands are not  * GEN0022
  54. .* permitted in any parameter to the macro. PRIV, USERH and ROUTINE   * GEN0023
  55. .* are for use by the program calling UTDCMD to process the commands  * GEN0024
  56. .* and are exclusively for that program's convenience.                * GEN0025
  57. .********************************************************************** GEN0026
  58. .*                                                                      GEN0027
  59.          LCLC  &TORP                                                    GEN0028
  60.          LCLA  &TAB                                                     GEN0029
  61.          LCLC  &TAD                                                     GEN0030
  62.          LCLC  &TCL                                                     GEN0031
  63.          LCLC  &TUH                                                     GEN0032
  64.          LCLA  &NPARM                                                   GEN0033
  65.          LCLA  &XPARM                                                   GEN0034
  66.          LCLA  &PARMASK                                                 GEN0035
  67.          LCLA  &PMULT                                                   GEN0036
  68.          LCLC  &PARTEMP                                                 GEN0037
  69. .*                                                                      GEN0038
  70.          AIF   ('&ABBR' NE '').GOTABBR                                  GEN0039
  71.          AIF   ('&ABBR' NE '').GOTABBR                                  GEN0039
  72. &TAB     SETA  K'&LABEL                                                 GEN0040
  73.          AGO   .ISUSERH                                                 GEN0041
  74. .GOTABBR ANOP                                                           GEN0042
  75. &TAB     SETA  &ABBR                                                    GEN0043
  76. .*                                                                      GEN0044
  77. .ISUSERH AIF   ('&USERH' EQ '').ISPARM                                  GEN0045
  78.          AIF   ('&NEXTBL' EQ '').ISPARM                                 GEN0046
  79.          MNOTE 8,'''USERH'' AND ''NEXTBL'' ARE MUTUALLY EXCLUSIVE'      GEN0047
  80.          MEXIT                                                          GEN0048
  81. .ISPARM  AIF   ('&PARM' EQ '').CHKTBL                                   GEN0049
  82. &NPARM   SETA  N'&PARM                                                  GEN0050
  83.          AIF   ('&NEXTBL' EQ '').CHKPARM                                GEN0051
  84.          MNOTE 8,'''PARM'' AND ''NEXTBL'' ARE MUTUALLY EXCLUSIVE'       GEN0052
  85.          MEXIT                                                          GEN0053
  86. .*                                                                      GEN0054
  87. .CHKPARM AIF   (N'&PARM LE 3).NPARMOK                                   GEN0055
  88.          MNOTE 3,'''PARM'' SUBLIST TOO LONG; FIRST 3 ACCEPTED'          GEN0056
  89. &NPARM   SETA  3                                                        GEN0057
  90. .*                                                                      GEN0058
  91. .NPARMOK ANOP                                                           GEN0059
  92. &XPARM   SETA  1                                                        GEN0060
  93. &PMULT   SETA  1                                                        GEN0061
  94. &PARMASK SETA  0                                                        GEN0062
  95. .*                                                                      GEN0063
  96. .PARMTOP ANOP                                                           GEN0064
  97. &PARTEMP SETC  '&PARM(&XPARM)'                                          GEN0065
  98.          AIF   ('&PARTEMP'(1,3) NE 'OPT').CHKALPH                       GEN0066
  99. &PARMASK SETA  16*&PMULT+&PARMASK                                       GEN0067
  100. &PARTEMP SETC  '&PARM(&XPARM)'(4,5)                                     GEN0068
  101. .CHKALPH AIF   ('&PARTEMP' NE 'ALPHA').CHKNUM                           GEN0069
  102. &PARMASK SETA  &PMULT+&PARMASK                                          GEN0070
  103.          AGO   .NXTPARM                                                 GEN0071
  104. .CHKNUM  AIF   ('&PARTEMP' NE 'NUM').CHKANUM                            GEN0072
  105. &PARMASK SETA  2*&PMULT+&PARMASK                                        GEN0073
  106.          AGO   .NXTPARM                                                 GEN0074
  107. .CHKANUM AIF   ('&PARTEMP' NE 'ANUM').CHKSPEC                           GEN0075
  108. &PARMASK SETA  3*&PMULT+&PARMASK                                        GEN0076
  109.          AGO   .NXTPARM                                                 GEN0077
  110. .CHKSPEC AIF   ('&PARTEMP' NE 'SPEC').CHKANY                            GEN0078
  111. &PARMASK SETA  4*&PMULT+&PARMASK                                        GEN0079
  112.          AGO   .NXTPARM                                                 GEN0080
  113. .CHKANY  AIF   ('&PARTEMP' NE 'ANY').CHKLINE                            GEN0081
  114. &PARMASK SETA  7*&PMULT+&PARMASK                                        GEN0082
  115.          AGO   .NXTPARM                                                 GEN0083
  116. .CHKLINE AIF   ('&PARTEMP' NE 'LINE').PARMBAD                           GEN0084
  117. &PARMASK SETA  8*&PMULT+&PARMASK                                        GEN0085
  118. .NXTPARM ANOP                                                           GEN0086
  119. &XPARM   SETA  &XPARM+1                                                 GEN0087
  120. &PMULT   SETA  &PMULT*256                                               GEN0088
  121.          AIF   (&XPARM LE &NPARM).PARMTOP                               GEN0089
  122. .*                                                                      GEN0090
  123. &TORP    SETC  'F''&PARMASK'''                                          GEN0091
  124.          AGO   .TBLOK                                                   GEN0092
  125. .*                                                                      GEN0093
  126. .PARMBAD MNOTE 4,'INVALID ''PARM'' SPECIFICATION - PARAMETER IGNORED'   GEN0094
  127. &TORP    SETC  'F''0'''                                                 GEN0095
  128.          AGO   .TBLOK                                                   GEN0096
  129. .*                                                                      GEN0097
  130. .CHKTBL  ANOP                                                           GEN0098
  131. &TORP    SETC  'AL4(&NEXTBL)'                                           GEN0099
  132.          AIF   ('&NEXTBL' NE '').TBLOK                                  GEN0100
  133. &TORP    SETC  'F''0'''                                                 GEN0101
  134. .*                                                                      GEN0102
  135. .TBLOK   ANOP                                                           GEN0103
  136. &TAD     SETC  'V(&ROUTINE)'                                            GEN0104
  137. &TCL     SETC  '&PRIV'                                                  GEN0105
  138. &TUH     SETC  '&USERH'                                                 GEN0106
  139.          AIF   ('&ROUTINE' NE '').ADDROK                                GEN0107
  140. &TAD     SETC  'F''0'''                                                 GEN0108
  141. .ADDROK  AIF   ('&PRIV' NE '').PRIVOK                                   GEN0109
  142. &TCL     SETC  '0'                                                      GEN0110
  143. .PRIVOK  AIF   ('&USERH' NE '').USERHOK                                 GEN0111
  144. &TUH     SETC  '0'                                                      GEN0112
  145. .*                                                                      GEN0113
  146. .USERHOK DC     CL8'&LABEL'                                             GEN0114
  147.          DC     &TORP                                                   GEN0115
  148.          DC     &TAD                                                    GEN0116
  149.          DC     X'&TAB'                                                 GEN0117
  150.          DC     X'&TCL'                                                 GEN0118
  151.          DC     H'&TUH'                                                 GEN0119
  152.          MEND                                                           GEN0120
  153.  
  154.