dnl $FabBSD$ dnl $OpenBSD: MAKEDEV.sub,v 1.14 2005/02/07 06:14:18 david Exp $ dnl dnl Copyright (c) 2001-2004 Todd T. Fries dnl dnl Permission to use, copy, modify, and distribute this software for any dnl purpose with or without fee is hereby granted, provided that the above dnl copyright notice and this permission notice appear in all copies. dnl dnl THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES dnl WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR dnl ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES dnl WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN dnl ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF dnl OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. dnl dnl dnl This file is an m4 file dnl dnl Conventions: dnl dnl o First, a change of quote to make shell statements like: `command` dnl possible dnl changequote(`{-', `-}')dnl dnl dnl o Next, change the comment character to make shell parameter dnl substitution possible dnl changecom(`/*', `*/')dnl dnl dnl o version info must be stripped of $ so we can say 'generated from' below dnl dnl If we just use the version string how are we going to know what arch dnl 'MAKEDEV.md,v' came from? dnl dnl Thus, I have used the below to create a version string looking like dnl 'OpenBSD: etc.sparc/MAKEDEV.inc,v...' which works, although requires dnl some attention if ported to another Id string setup. dnl dnl dnl Initialize the stacks stored in _m4_* dnl undefine({-_m4_cvs_ver-})dnl pushdef({-_m4_cvs_ver-}, {-done-})dnl dnl undefine({-_m4_devs-})dnl pushdef({-_m4_devs-}, {-done-})dnl dnl undefine({-_m4_disks-})dnl undefine({-_m4_disks2-})dnl pushdef({-_m4_disks-}, {-done-})dnl pushdef({-_m4_disks2-}, {-done-})dnl dnl dnl define stack 'add to' functions, only unique names queued dnl define({-ver_q-}, {-ifelse(index($1_ver, y), 0, , {-pushdef({-_m4_cvs_ver-}, {-$2-})define({-$1_ver-}, {-y-})-})-})dnl ver_q dnl define({-dev_q-}, {-ifelse(index(_q_$1_dev, :), 0, {-errprint({-duplicated dev id: $1 at -}__file__{-:-}__line__ originally at _q_$1_dev)-}, {-pushdef({-_m4_devs-}, {-$1-})dnl define({-_q_$1_dev-}, {-:-}__file__{-:-}__line__)-})-})dnl dev_q dnl define({-disk_q-}, {-ifelse(index(_q_$1_disk, :), 0, {-errprint({-duplicated disk id: $1 at -}__file__{-:-}__line__ originally at _q_$1_disk)-}, {-pushdef({-_m4_disks-}, {-$1-})dnl pushdef({-_m4_disks2-}, {-$1-})dnl define({-_q_$1_disks-}, {-:-}__file__{-:-}__line__)-})-})dnl disk_q dnl dnl store a version string for 'this' file dnl dnl vers ( uniqueidstring, versionstring, subdir ) dnl dnl example1: vers(__file__, {-$OpenBSD: MAKEDEV.sub,v 1.14 2005/02/07 06:14:18 david Exp $-}) dnl example2: vers(__file__, {-$OpenBSD: MAKEDEV.sub,v 1.14 2005/02/07 06:14:18 david Exp $-}, etc.MACHINE) dnl dnl if subdir is defined, prepend it to the filename in the version string dnl define({-vers-}, {-ifelse({-$3-}, {--}, {-ver_q(hstcl({-$1-}), {-translit({-{-$2-}-}, {-$-}, {--})-})-}, {-ver_q(hstcl({-$1-}), {-_addsubdir({-{-$2-}-}, $3)-})-})-})dnl dnl dnl Version info for this file: dnl vers(__file__, {-$FabBSD$-})dnl dnl dnl define({-_addsubdir-}, {-patsubst({-$1-}, {-\$(FabBSD:) ([^\$]*)\$-}, {-\1 $2/\2-})-})dnl dnl dnl do the 'showing' of the version info dnl define({-do_vers-}, {-COMM $1-})dnl dnl dnl show version function, to be called at the place when all versions are dnl queued, and it is time to show all of them dnl define({-show_vers-}, {-ifelse(_m4_cvs_ver, {-done-}, {--}, {-do_vers(_m4_cvs_ver) popdef({-_m4_cvs_ver-})dnl show_vers()dnl -})-})dnl dnl dnl show the routines to generate devices define({-show_devs-}, {-ifelse(_m4_devs, {-done-}, {--}, {-_MKDEV(_m4_devs){--}dnl popdef({-_m4_devs-})dnl show_devs()dnl -})-})dnl dnl dnl routines to generate disks define({-show_disks-}, {-ifelse(_m4_disks, {-done-}, {--}, {-ifcase(_m4_disks, _m4_disks{--}*)dnl popdef({-_m4_disks-})dnl show_disks()dnl -})-})dnl dnl define({-show_disks2-}, {-ifelse(_m4_disks2, {-done-}, {--}, {-CasE(_m4_disks2)dnl popdef({-_m4_disks2-})dnl show_disks2()dnl -})-})dnl dnl dnl dnl Some m4 math functions: dnl dnl Add(a, b) - displays the result of a+b dnl Mult(a, b) - displays the result of a*b dnl trunc a b - displays the string a minus b removed from the RHS dnl hex a - displays the hex equivalent of 0-15 dnl unt a - s/[a-z]*([0-9]*).*/\1/ aka sd0a -> 0 dnl dnl Functions: dnl dnl --> Addition dnl define({-Add-}, {-$({-(-}$1+$2{-)-})-})dnl dnl dnl --> Multiplication dnl define({-Mult-}, {-$({-(-}$1*$2{-)-})-})dnl dnl dnl dnl TRUNC dnl define({-expr_trunc-}, {-$1trunc() $1{ $1 case {-$-}3 in $1 l) {-expr-} {-$-}1 : '\(.*\)'{-$-}2 ;; $1 r|*) {-expr-} ${--}1 : ${--}2'\(.*\)' ;; $1 esac $1}-})dnl dnl dnl define({-_SHELL-}, {-sh-})dnl define({-_this-}, {-{-$-}T-})dnl dnl define({-_recurse-}, {-_SHELL _this-})dnl define({-_recurse-}, {-R-})dnl dnl dnl _devitem(pattern, description) dnl define({-_devitem-}, {-{-#-} $1 {-$2-}-})dnl dnl dnl _devtitle(description) dnl define({-_devtitle-}, {-{-#-} $1:-})dnl dnl dnl _DEV(name, [character major], [block major]) dnl define({-_DEV-}, {-$1_dev{--}dnl dnl dnl _DEV 'ifelse' .. $2 - major_$1_c dnl ifelse($2, , , {-define(major_$1_c, $2)-})dnl dnl dnl _DEV 'ifelse' .. $3 - major_$1_b dnl ifelse($3, , , {-define(major_$1_b, $3)-})dnl dnl dnl _DEV 'ifelse' .. $4 - step_$1 dnl ifelse($4, , , {-define(step_$1, {-$4-})-})dnl dnl dnl Some magic here, defining a devitem also defines another dnl string so that later we can check if a particular devitem was dnl defined, and thus determine if the devices themselves are to dnl be built dnl define({-$1__DEV-}, {-Y-})dnl dnl dnl More magic, put device string name into a queue of script segments to dnl be shown later if it has been defined as a device in MAKEDEV.mi dnl ifdef({-$1_mkdev-}, {-__mkdev({-$1-})-})dnl dnl dnl -})dnl _DEV dnl dnl define({-ifdev-}, {-ifelse($1__DEV, Y, {-$2-})-})dnl dnl define({-_MKDEV-}, {-$1_mkdev-})dnl define({-_TITLE-}, {-$1_title-})dnl define({-__devitem-}, {-define($1_dev, {-_devitem($2, $3)-})-})dnl define({-__devtitle-}, {-define($1_title, {-_devtitle($2)-})-})dnl dnl dnl Beginning and ending of case entries, just incase we change in the dnl future, save chasing things down again dnl define({-_end-}, {- ;; -})dnl define({-_beg-}, {-{-)-} -})dnl dnl dnl create the script segment for making devices dnl $1 $2 $3 dnl _mkdev(shortname, devpatt, action)dnl define({-_mkdev-}, {-define($1_mkdev, {-$2{--}_beg{--}$3{--}_end-})-})dnl dnl dnl define a major character device dnl $1 $2 $3 $4 dnl _mcdev(shortname, devpatt, devbase, devmajor [, group [ owner ] ])dnl dnl define({-_mcdev-}, {-define($1_mkdev, {-{-$2-}_beg{--}M $3$U c $4 $U{--}dnl ifelse($6, , ifelse($5, , , {- -}$5), {- -}ifelse($5, , 600, $5){- -}$6){--}_end-})-})dnl dnl dnl $1 $2 $3 $4 $5 $6 dnl _cdev(shortname, devpatt, devmajor, devminor[, devmod, devgrp])dnl define({-_cdev-}, {-dnl define($1_mkdev, {-$2{--}_beg{--}M $2 c $3 $4 $5 $6{--}_end-}){--}-})dnl dnl dnl define({-__mkdev-}, {-dev_q($1)-})dnl dnl dnl for showing disks dnl define({-CasE-}, {-ifdev({-$1-}, {- $1*) dodisk $1 $U major_$1_b major_$1_c $U 0{--}ifstep($1);; -})-})dnl dnl dnl define({-ifcase-}, {-dnl ifelse(C_ase, Y, ifdev({-$1-}, {-|$2-}), {-ifdev({-$1-}, {-$2define({-C_ase-}, Y)-})-})-})dnl dnl dnl dnl device list .. list devices 'iff' they are defined dnl dnl input: dnl dnl _dl({-usb-}, {-usb0 usb1-}, {-urio-}, {-urio-}, ...) dnl dnl output: dnl dnl {-_recurse usb0 usb1 urio dnl _recurse uhid0 uhid2 uhid3-} dnl dnl wrap if more than 60 chars wide dnl dnl .. wrap it all up in an 'ifelse({-$1-}, , {- ... -})' for neatness ?? dnl define({-_dl-}, {-dnl ifdef({-_dt-}, , {-define({-_dt-})-})dnl ifdef({-_do-}, , {-_dt{--}_recurse{--}define({-_do-}, 0)dnl define({-_dt-}, {- -})-})dnl ifdef({-$1__DEV-}, {-define({-_di-}, {-$2-})-}, {-define({-_di-})-})dnl ifelse(eval(len(_di)+_do<60), 1, {-ifelse(eval(len(_di)>0), 1, {- _di{--}define({-_do-}, eval(1+_do+len(_di)))-})-}, {- _dt{--}_recurse _di{--}dnl define({-_do-}, len(_di))-})dnl ifelse({-$3-}, {--}, {-undefine({-_dt-}, {-_do-})-}, dnl <--- The END {-_dl(shift(shift($@)))-})-})dnl dnl dnl define({-_show_target-}, {-dnl ifdef({-$1__DEV-}, {-disp_dev({-$2-})-})dnl ifelse({-$3-}, {--}, {-_disp_dev_end()-}, dnl <--- The END {-_show_target(shift(shift($@)))-})-})dnl dnl define({-disp_dev-}, {-dnl ifdef({-_disp_dev_tab-}, , {-define({-_disp_dev_tab-})-})dnl ifdef({-_disp_dev_len-}, , {-dnl define({-_disp_dev_len-}, 0)dnl _disp_dev_tab{--}_recurse{--}dnl define({-_disp_dev_tab-}, {- -})-})dnl ifelse(eval(len($1)+_disp_dev_len<60), 1, {- $1{--}define({-_disp_dev_len-}, eval(1+_disp_dev_len+len($1)))-}, {- _disp_dev_tab{--}_recurse $1{--}dnl define({-_disp_dev_len-}, len($1))-})dnl -})dnl define({-_disp_dev_end-}, {-undefine({-_disp_dev_tab-}, {-_disp_dev_len-})-})dnl dnl dnl A word about the above: dnl dnl _dt -> 'tab' .. at first, defined to nothing, as the tab is already there dnl then define it to a tab every time through dnl undefine it at the end dnl dnl _do -> 'old' count .. stores the length of the old string already displayed dnl it is initialized to 0, added to the length plus 1 of '_di' each dnl iteration the line is less than 60 chars long dnl undefined at the end dnl _di -> 'iteration' string .. the string used in this iteration, is empty if dnl the device does not exist dnl dnl dnl ifstep(devstr) dnl .. if stepping is defined for the particular device, emit ' step', else dnl nothing define({-ifstep-}, {-ifdef({-step_$1-}, {- -}step_$1{--})-})dnl dnl dnl define({-target-}, {-twrget({-$1-}, {-$2-}, {-$2-}, shift(shift($@)))-})dnl dnl dnl twrget(target, devname, prefix, str1, str2, str3) dnl $1 $2 $3 $4 $5 $6 dnl define({-twrget-}, {-dnl dnl ifdef({-$1_target-}, , {-pushdef({-$1_target-}, {-done-})-})dnl dnl ifelse({-$4-}, , , {-dnl ifelse({-$4-}, {-_done-}, , {-dnl ifelse({-$5-}, , , {-dnl dnl errprint({-recurse: $1, $2, $3, $4, $5, $6, ...-})dnl twrget({-$1-}, {-$2-}, {-$3-}, shift(shift(shift(shift($@)))))dnl -})-})-})dnl dnl ifelse({-$4-}, {-_done-}, , {-dnl dnl errprint({-recurse: $1_$2_dev, $3$4, $3$4, _done-})dnl twrget({-$1_$2_dev-}, {-$3$4-}, {-$3$4-}, {-_done-})dnl -})dnl dnl ifdef({-$1$2target-}, , {-dnl pushdef({-$1_target-}, {-$2-})define({-$1$2target-})dnl -})dnl dnl -})dnl dnl dnl define({-show_target-}, {-dnl ifelse($1_target, {-done-}, {-_disp_dev_end()-}, {-dnl $1_target: show_dev($1, -}$1_target{-)dnl popdef({-$1_target-})dnl show_target({-$1-})dnl -})-})dnl dnl define({-show_dev-}, {-dnl ifdef({-$2__DEV-}, {-dnl ifelse($1_$2_dev_target, {-done-}, , {-dnl disp_dev({-$1_$2_dev_target-})dnl popdef({-$1_$2_dev_target-})dnl show_dev({-$1-}, {-$2-})-})dnl -})dnl -})dnl dnl