.\"	-*-	mode: roff	-*-
.ig

common.roff

This file is part of groff, the GNU roff type-setting system.

Copyright (C) 2010 Free Software Foundation, Inc.
written by Joachim Walsdorff <Joachim.Walsdorff@urz.uni-heidelberg.de>.

groff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or
(at your option) any later version.

groff is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

..
.
.
.mso hdtbl.tmac\"			load table macros
.
.\"	******************************************************************
.\"	**	Some macros and the page setup used by the examples	**
.\"	******************************************************************
.
.\"	******************************************************************
.\"	**	some of the following macros use system commands	**
.\"	**	and are therefore `unsafe': they need the `-U' argument **
.\"	**	when calling groff/troff				**
.\"	******************************************************************
.
.\"	******************************************************************
.\"	**		Header macro for the examples			**
.\"	******************************************************************
.de H
.  nr *w* (17 * \w\\$* / 10 + 4n)
.  TBL border=1n \
       bc=yellow \
       bgc=red4 \
       fgc=yellow \
       csp=0 \
       fst=TB \
       "fsz=1.7 1.5" \
       hal=c \
       tal=c \
       "width=(\\n[*w*]+4n)<?\n[.l]"
.  TR .TD
.  t*P1 \\$*
.  ETB
.  SP
..
.
.
.\"	******************************************************************
.\"	**	Utility macro for the date, requires UNIX date.		**
.\"	**	after return string *date contains the date in the	**
.\"	**	standard form of the Unix date-command,			**
.\"	**	for example "Sun Dec  5 22:27:57     2004"		**
.\"	******************************************************************
.de date
.  pso sh -c "echo -n .ds *date\ ;date"
.  tm \\*[*date] ***
..
.
.
.\"	******************************************************************
.\"	**	Utility macro for time measurement, requires UNIX date	**
.\"	**	.time s[tart]|[end]					**
.\"	**		.time start:					**
.\"	**			reg *time gets the start-time (seconds) **
.\"	**		.time [end]:					**
.\"	**			reg *time gets the difference of the	**
.\"	**				end- and start-time (seconds)	**
.\"	******************************************************************
.de time
.  ds * \\$1\"
.  substring * 0 0
.  ie "\\*[*]"s" \
.    pso sh -c "echo -n .nr *time 0+;date +%s"
.  el \{\
.   pso sh -c "echo -n .nr *time -;date +%s"
.   nr *time 0-\\n[*time]
.   tm elapsed time: \\n[*time] seconds
.  \}
..
.
.
.\"	******************************************************************
.\"	**		Perform n-times all the arbitrary arguments	**
.\"	**		.PN n a2 a3 ...					**
.\"	**			PN is nestable				**
.\"	******************************************************************
.de PN
.  nr *pn +1
.  nr PN\\n[*pn] (\\$1 + 1) 1
.  shift
.
.  while \\n-[PN\\n[*pn]] \
.    t*P1 \\$@
.
.  nr *pn -1
..
.
.
.\"	Utility macro:	.d2x decimal_number [base [string_name]]
.\"
.\"		Convert `decimal_number' to another base `base' (in the
.\"		range 1..16) and store the result in string `string_name'.
.\"		If `base' is missing or empty, convert to a hexadecimal
.\"		number.  If `string_name' is missing or empty, return value
.\"		in string `hex#', otherwise return the value in both
.\"		`string_name' and `hex#'.
.\"
.\"		The base value 1 is handled specially: The returned
.\"		string contains the character `|' `decimal_number' times
.\"		(for example, input value 4 yields `||||').
.ds d2x-0 0\"
.ds d2x-1 1\"
.ds d2x-2 2\"
.ds d2x-3 3\"
.ds d2x-4 4\"
.ds d2x-5 5\"
.ds d2x-6 6\"
.ds d2x-7 7\"
.ds d2x-8 8\"
.ds d2x-9 9\"
.ds d2x-10 A\"
.ds d2x-11 B\"
.ds d2x-12 C\"
.ds d2x-13 D\"
.ds d2x-14 E\"
.ds d2x-15 F\"
.
.
.de d2x
.  if !\B\\$1 \{\
.    tm \\n[.F]:\\n[.c]: invalid or missing first argument
.    tm1 "     usage: `.d2x decimal_number [base [string_name]]'
.    return
.  \}
.
.  nr i# (-1) 1
.  nr j# 1
.  ds hex#
.  nr dec# (\\$1) 1
.
.  if !\\$1 \
.    nr dec# (-\\n[dec#])
.
.  ie !"\\$2"" \{\
.    ie !\B\\$2 \
.      tm \\n[.F]:\\n[.c]: invalid base `\\$2'
.    el \
.      ie ((\\$2 < 1) : (\\$2 > 16)) \
.        tm \\n[.F]:\\n[.c]: invalid base `\\$2'
.      el \
.        nr b# \\$2
.  \}\}
.  el \
.    nr b# 16
.
.  nr xb# 1
.
.  ie (\\n[b#] == 1) \{\
.    nr dec# +1
.    while \\n-[dec#] \
.      as hex# |\"
.  \}
.  el \{\
.    while (\\n[dec#] - \\n[xb#]) \{\
.      nr xb# (\\n[xb#] * \\n[b#])
.      nr j# +1
.    \}
.
.    while (\\n+[i#] < \\n[j#]) \{\
.      nr ** (\\n[dec#] / \\n[xb#])
.      as hex# \\*[d2x-\\n[**]]\"
.      nr dec# (\\n[dec#] - (\\n[xb#] * \\n[**]))
.      nr xb# (\\n[xb#] / \\n[b#])
.    \}
.  \}
.
.  \" strip leading zero, if any
.  ds * \\*[hex#]\"
.  substring * 0 0
.  if "\\*[*]"0" \
.    substring hex# 1 -1
.
.  if (\\$1 < 0) \
.    ds hex# -\\*[hex#]\"
.
.  if !"\\$3"" \{\
.    ie !\A\\$3 \
.      tm \\n[.F]:\\n[.c]: invalid string name `\\$3'
.    el \
.      ds \\$3 \\*[hex#]\"
.  \}
..
.
.
.\"	Utility macro:	.random#
.\"			.random-seed seed1 seed2
.\"
.\"		Return pseudo-random numbers in the range 0..0xFFFFFF,
.\"		represented as the concatenation of `#' and six
.\"		hexadecimal digits, in the string `#random'.  The
.\"		macro `random-seed' can be used to set seed values,
.\"		which should be integers in the range 1..2147483562 and
.\"		1..2147483398 for `seed1' and `seed2', respectively
.\"		(the macro applies a modulo operation to assure this
.\"		range).  If `random-seed' isn't called the registers
.\"		`seconds', `minutes', `hours', `dy', `mo', `year', and
.\"		`$$' are used to compute it.
.\"
.\"		The used generator is presented in L'Ecuyer's 1988 paper
.\"		`Efficient and Portable Combined Random Number
.\"		Generators', which combines two Multiplicative Linear
.\"		Congruential Generators (MLCGs) to achieve a period of
.\"		2.3*10^18.
.af hours 00
.af minutes 00
.af seconds 00
.af year 0000
.af mo 00
.af dy 00
.
.ds random-s1 \n[minutes]\n[seconds]\n[$$]\n[hours]\"
.\" prevent overflow
.substring random-s1 0 8
.
.nr random-s1 (\*[random-s1] % 2147483562)
.nr random-s2 \n[dy]\n[year]\n[mo]
.
.
.de random-seed
.  if !(\\n[.$] == 2) \{\
.    tm1 "random-seed: Invalid number of arguments.
.    tm1 "             usage: `.random-seed seed1 seed2'
.    return
.  \}
.
.  nr random-s1 (\\$1 % 2147483562)
.  nr random-s2 (\\$2 % 2147483398)
..
.
.
.de random#
.  nr * (\\n[random-s1] / 53668)
.  nr random-s1 (40014 * (\\n[random-s1] - (\\n[*] * 53668)) \
                - (\\n[*] * 12211))
.  if !\\n[random-s1] \
.    nr random-s1 +2147483563
.
.  nr * (\\n[random-s2] / 52774)
.  nr random-s2 (40692 * (\\n[random-s2] - (\\n[*] * 52774)) \
                - (\\n[*] * 3791))
.  if !\\n[random-s2] \
.    nr random-s2 +2147483399
.
.  nr * (\\n[random-s1] - \\n[random-s2])
.  if (\\n[*] < 1) \
.    nr * +2147483562
.
.  \" reduce the result to the leftmost 24 bits
.  nr * (\\n[*] / 128)
.
.  d2x \\n[*]
.  ds hex# 000000\\*[hex#]\"
.  substring hex# -6
.  ds #random #\\*[hex#]\"
..
.
.
.\"	******************************************************************
.\"	**			minimal Page setup			**
.\"	******************************************************************
.
.nr s \n[.ps]
.nr v \n[.v]
.nr p \n[.p]
.nr o \n[.o]
.pv 1.2 1.2 "" X
.nr l 6.6i				\"	set text width
.ll \n[t*l]u
.nr o 2c				\"	set offset
.po \n[o]u
.nr p 29.7c				\"	set paper length (A4)
.pl \n[p]u
.nr tH 1i				\"	set top margin
.sp |\n[tH]u
.
.ds t*HM //arbitrary text for page header, except on the first page//\"
.ds t*BM //arbitrary text for page footer, except on the last page/\\n[%]/\"
.
.ev 99
.lt \n[t*l]u
.ev
.
.
.de HM
.  sp |.5i				\"	print header in top margin
.  tl \\*[t*HM]
.  sp |\\n[tH]u
.  ev
..
.
.
.de BM
.  ev 99
.  sp |(\\n[p]u - .5i)			\"	print footer in bottom margin
.  tl \\*[t*BM]
.  bp
..
.
.
.de EM
.  rm BM			\"	no page number at bottom of last page
.  t*EM
..
.
.
.wh 0 HM
.wh 0-1.5i BM
.em EM
.
.\" Some packages (-mm) define their own .SP macro.
.\" Use ours if another one isn't already available.
.if !d SP .als SP t*SP
.
.if "\n[.m]"" \
.  gcolor black
.if "\n[.M]"" \
.  fcolor white
.
.\" EOF
