diff --git a/135oALYhkYyXB2aG0F-qrwA.jpeg b/135oALYhkYyXB2aG0F-qrwA.jpeg deleted file mode 100644 index afd7142..0000000 Binary files a/135oALYhkYyXB2aG0F-qrwA.jpeg and /dev/null differ diff --git a/LICRcyr2utf8.xdy b/LICRcyr2utf8.xdy deleted file mode 100644 index a9ca1c8..0000000 --- a/LICRcyr2utf8.xdy +++ /dev/null @@ -1,101 +0,0 @@ -;; -*- coding: utf-8; mode: Lisp; -*- -;; style file for xindy -;; filename: LICRcyr2utf8.xdy -;; description: style file for xindy which maps back LaTeX Internal -;; Character Representation of Cyrillic to utf-8 -;; usage: for use with pdflatex produced .idx files. -;; Contributed by the Sphinx team, July 2018. -(merge-rule "\IeC {\'\CYRG }" "Ѓ" :string) -(merge-rule "\IeC {\'\CYRK }" "Ќ" :string) -(merge-rule "\IeC {\'\cyrg }" "ѓ" :string) -(merge-rule "\IeC {\'\cyrk }" "ќ" :string) -(merge-rule "\IeC {\CYRA }" "А" :string) -(merge-rule "\IeC {\CYRB }" "Б" :string) -(merge-rule "\IeC {\CYRC }" "Ц" :string) -(merge-rule "\IeC {\CYRCH }" "Ч" :string) -(merge-rule "\IeC {\CYRD }" "Д" :string) -(merge-rule "\IeC {\CYRDJE }" "Ђ" :string) -(merge-rule "\IeC {\CYRDZE }" "Ѕ" :string) -(merge-rule "\IeC {\CYRDZHE }" "Џ" :string) -(merge-rule "\IeC {\CYRE }" "Е" :string) -(merge-rule "\IeC {\CYREREV }" "Э" :string) -(merge-rule "\IeC {\CYRERY }" "Ы" :string) -(merge-rule "\IeC {\CYRF }" "Ф" :string) -(merge-rule "\IeC {\CYRG }" "Г" :string) -(merge-rule "\IeC {\CYRGUP }" "Ґ" :string) -(merge-rule "\IeC {\CYRH }" "Х" :string) -(merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string) -(merge-rule "\IeC {\CYRI }" "И" :string) -(merge-rule "\IeC {\CYRIE }" "Є" :string) -(merge-rule "\IeC {\CYRII }" "І" :string) -(merge-rule "\IeC {\CYRISHRT }" "Й" :string) -(merge-rule "\IeC {\CYRJE }" "Ј" :string) -(merge-rule "\IeC {\CYRK }" "К" :string) -(merge-rule "\IeC {\CYRL }" "Л" :string) -(merge-rule "\IeC {\CYRLJE }" "Љ" :string) -(merge-rule "\IeC {\CYRM }" "М" :string) -(merge-rule "\IeC {\CYRN }" "Н" :string) -(merge-rule "\IeC {\CYRNJE }" "Њ" :string) -(merge-rule "\IeC {\CYRO }" "О" :string) -(merge-rule "\IeC {\CYRP }" "П" :string) -(merge-rule "\IeC {\CYRR }" "Р" :string) -(merge-rule "\IeC {\CYRS }" "С" :string) -(merge-rule "\IeC {\CYRSFTSN }" "Ь" :string) -(merge-rule "\IeC {\CYRSH }" "Ш" :string) -(merge-rule "\IeC {\CYRSHCH }" "Щ" :string) -(merge-rule "\IeC {\CYRT }" "Т" :string) -(merge-rule "\IeC {\CYRTSHE }" "Ћ" :string) -(merge-rule "\IeC {\CYRU }" "У" :string) -(merge-rule "\IeC {\CYRUSHRT }" "Ў" :string) -(merge-rule "\IeC {\CYRV }" "В" :string) -(merge-rule "\IeC {\CYRYA }" "Я" :string) -(merge-rule "\IeC {\CYRYI }" "Ї" :string) -(merge-rule "\IeC {\CYRYO }" "Ё" :string) -(merge-rule "\IeC {\CYRYU }" "Ю" :string) -(merge-rule "\IeC {\CYRZ }" "З" :string) -(merge-rule "\IeC {\CYRZH }" "Ж" :string) -(merge-rule "\IeC {\cyra }" "а" :string) -(merge-rule "\IeC {\cyrb }" "б" :string) -(merge-rule "\IeC {\cyrc }" "ц" :string) -(merge-rule "\IeC {\cyrch }" "ч" :string) -(merge-rule "\IeC {\cyrd }" "д" :string) -(merge-rule "\IeC {\cyrdje }" "ђ" :string) -(merge-rule "\IeC {\cyrdze }" "ѕ" :string) -(merge-rule "\IeC {\cyrdzhe }" "џ" :string) -(merge-rule "\IeC {\cyre }" "е" :string) -(merge-rule "\IeC {\cyrerev }" "э" :string) -(merge-rule "\IeC {\cyrery }" "ы" :string) -(merge-rule "\IeC {\cyrf }" "ф" :string) -(merge-rule "\IeC {\cyrg }" "г" :string) -(merge-rule "\IeC {\cyrgup }" "ґ" :string) -(merge-rule "\IeC {\cyrh }" "х" :string) -(merge-rule "\IeC {\cyrhrdsn }" "ъ" :string) -(merge-rule "\IeC {\cyri }" "и" :string) -(merge-rule "\IeC {\cyrie }" "є" :string) -(merge-rule "\IeC {\cyrii }" "і" :string) -(merge-rule "\IeC {\cyrishrt }" "й" :string) -(merge-rule "\IeC {\cyrje }" "ј" :string) -(merge-rule "\IeC {\cyrk }" "к" :string) -(merge-rule "\IeC {\cyrl }" "л" :string) -(merge-rule "\IeC {\cyrlje }" "љ" :string) -(merge-rule "\IeC {\cyrm }" "м" :string) -(merge-rule "\IeC {\cyrn }" "н" :string) -(merge-rule "\IeC {\cyrnje }" "њ" :string) -(merge-rule "\IeC {\cyro }" "о" :string) -(merge-rule "\IeC {\cyrp }" "п" :string) -(merge-rule "\IeC {\cyrr }" "р" :string) -(merge-rule "\IeC {\cyrs }" "с" :string) -(merge-rule "\IeC {\cyrsftsn }" "ь" :string) -(merge-rule "\IeC {\cyrsh }" "ш" :string) -(merge-rule "\IeC {\cyrshch }" "щ" :string) -(merge-rule "\IeC {\cyrt }" "т" :string) -(merge-rule "\IeC {\cyrtshe }" "ћ" :string) -(merge-rule "\IeC {\cyru }" "у" :string) -(merge-rule "\IeC {\cyrushrt }" "ў" :string) -(merge-rule "\IeC {\cyrv }" "в" :string) -(merge-rule "\IeC {\cyrya }" "я" :string) -(merge-rule "\IeC {\cyryi }" "ї" :string) -(merge-rule "\IeC {\cyryo }" "ё" :string) -(merge-rule "\IeC {\cyryu }" "ю" :string) -(merge-rule "\IeC {\cyrz }" "з" :string) -(merge-rule "\IeC {\cyrzh }" "ж" :string) diff --git a/LICRlatin2utf8.xdy b/LICRlatin2utf8.xdy deleted file mode 100644 index 1d76825..0000000 --- a/LICRlatin2utf8.xdy +++ /dev/null @@ -1,239 +0,0 @@ -;; style file for xindy -;; filename: LICRlatin2utf8.xdy -;; description: style file for xindy which maps back LaTeX Internal -;; Character Representation of letters (as arising in .idx index -;; file) to UTF-8 encoding for correct sorting by xindy. -;; usage: for use with the pdflatex engine, -;; *not* for use with xelatex or lualatex. -;; -;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy. -;; The modifications include: -;; -;; - Updates for compatibility with current LaTeX macro encoding. -;; -;; - Systematic usage of the \IeC {...} mark-up, because mark-up in -;; tex/inputenc/utf8.xdy was using it on seemingly random basis, and -;; Sphinx coercing of xindy usability for both Latin and Cyrillic scripts -;; with pdflatex requires its systematic presence here. -;; -;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ. -;; -;; Indeed Sphinx needs to support for pdflatex engine all Unicode letters -;; available in TeX T1 font encoding. The above letters are found in -;; that encoding but not in the Latin1, 2, 3 charsets which are those -;; covered by original tex/inputenc/utf8.xdy. -;; -;; - There is a problem that ȷ is not supported out-of-the box by LaTeX -;; with inputenc, one must add explicitly -;; \DeclareUnicodeCharacter{0237}{\j} -;; to preamble of LaTeX document. However this character is not supported -;; by the TeX "times" font used by default by Sphinx for pdflatex engine. -;; -;; **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and -;; \.{} need no extra user declaration anymore. -;; -;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up). -;; -;; - U+02DB (˛) and U+02D9 (˙) are also not supported by inputenc -;; out of the box and require -;; \DeclareUnicodeCharacter{02DB}{\k{}} -;; \DeclareUnicodeCharacter{02D9}{\.{}} -;; to be added to preamble. -;; -;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings. -;; -;; - Characters Ŋ and ŋ are not supported by TeX font "times" used by -;; default by Sphinx for pdflatex engine but they are supported by -;; some TeX fonts, in particular by the default LaTeX font for T1 -;; encoding. -;; -;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules. -;; -;; Contributed by the Sphinx team, July 2018. -;; -;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer. -(merge-rule "\IeC {\textonesuperior }" "¹" :string) -(merge-rule "\IeC {\texttwosuperior }" "²" :string) -(merge-rule "\IeC {\textthreesuperior }" "³" :string) -(merge-rule "\IeC {\'a}" "á" :string) -(merge-rule "\IeC {\'A}" "Á" :string) -(merge-rule "\IeC {\`a}" "à" :string) -(merge-rule "\IeC {\`A}" "À" :string) -(merge-rule "\IeC {\^a}" "â" :string) -(merge-rule "\IeC {\^A}" "Â" :string) -(merge-rule "\IeC {\~"a}" "ä" :string) -(merge-rule "\IeC {\~"A}" "Ä" :string) -(merge-rule "\IeC {\~~a}" "ã" :string) -(merge-rule "\IeC {\~~A}" "Ã" :string) -(merge-rule "\IeC {\c c}" "ç" :string) -(merge-rule "\IeC {\c C}" "Ç" :string) -(merge-rule "\IeC {\'c}" "ć" :string) -(merge-rule "\IeC {\'C}" "Ć" :string) -(merge-rule "\IeC {\^c}" "ĉ" :string) -(merge-rule "\IeC {\^C}" "Ĉ" :string) -(merge-rule "\IeC {\.c}" "ċ" :string) -(merge-rule "\IeC {\.C}" "Ċ" :string) -(merge-rule "\IeC {\c s}" "ş" :string) -(merge-rule "\IeC {\c S}" "Ş" :string) -(merge-rule "\IeC {\c t}" "ţ" :string) -(merge-rule "\IeC {\c T}" "Ţ" :string) -(merge-rule "\IeC {\-}" "­" :string); soft hyphen -(merge-rule "\IeC {\textdiv }" "÷" :string) -(merge-rule "\IeC {\'e}" "é" :string) -(merge-rule "\IeC {\'E}" "É" :string) -(merge-rule "\IeC {\`e}" "è" :string) -(merge-rule "\IeC {\`E}" "È" :string) -(merge-rule "\IeC {\^e}" "ê" :string) -(merge-rule "\IeC {\^E}" "Ê" :string) -(merge-rule "\IeC {\~"e}" "ë" :string) -(merge-rule "\IeC {\~"E}" "Ë" :string) -(merge-rule "\IeC {\^g}" "ĝ" :string) -(merge-rule "\IeC {\^G}" "Ĝ" :string) -(merge-rule "\IeC {\.g}" "ġ" :string) -(merge-rule "\IeC {\.G}" "Ġ" :string) -(merge-rule "\IeC {\^h}" "ĥ" :string) -(merge-rule "\IeC {\^H}" "Ĥ" :string) -(merge-rule "\IeC {\H o}" "ő" :string) -(merge-rule "\IeC {\H O}" "Ő" :string) -(merge-rule "\IeC {\textacutedbl }" "˝" :string) -(merge-rule "\IeC {\H u}" "ű" :string) -(merge-rule "\IeC {\H U}" "Ű" :string) -(merge-rule "\IeC {\ae }" "æ" :string) -(merge-rule "\IeC {\AE }" "Æ" :string) -(merge-rule "\IeC {\textcopyright }" "©" :string) -(merge-rule "\IeC {\c \ }" "¸" :string) -(merge-rule "\IeC {\dh }" "ð" :string) -(merge-rule "\IeC {\DH }" "Ð" :string) -(merge-rule "\IeC {\dj }" "đ" :string) -(merge-rule "\IeC {\DJ }" "Đ" :string) -(merge-rule "\IeC {\guillemotleft }" "«" :string) -(merge-rule "\IeC {\guillemotright }" "»" :string) -(merge-rule "\IeC {\'\i }" "í" :string) -(merge-rule "\IeC {\`\i }" "ì" :string) -(merge-rule "\IeC {\^\i }" "î" :string) -(merge-rule "\IeC {\~"\i }" "ï" :string) -(merge-rule "\IeC {\i }" "ı" :string) -(merge-rule "\IeC {\^\j }" "ĵ" :string) -(merge-rule "\IeC {\k {}}" "˛" :string) -(merge-rule "\IeC {\l }" "ł" :string) -(merge-rule "\IeC {\L }" "Ł" :string) -(merge-rule "\IeC {\nobreakspace }" " " :string) -(merge-rule "\IeC {\o }" "ø" :string) -(merge-rule "\IeC {\O }" "Ø" :string) -(merge-rule "\IeC {\textsterling }" "£" :string) -(merge-rule "\IeC {\textparagraph }" "¶" :string) -(merge-rule "\IeC {\ss }" "ß" :string) -(merge-rule "\IeC {\textsection }" "§" :string) -(merge-rule "\IeC {\textbrokenbar }" "¦" :string) -(merge-rule "\IeC {\textcent }" "¢" :string) -(merge-rule "\IeC {\textcurrency }" "¤" :string) -(merge-rule "\IeC {\textdegree }" "°" :string) -(merge-rule "\IeC {\textexclamdown }" "¡" :string) -(merge-rule "\IeC {\texthbar }" "ħ" :string) -(merge-rule "\IeC {\textHbar }" "Ħ" :string) -(merge-rule "\IeC {\textonehalf }" "½" :string) -(merge-rule "\IeC {\textonequarter }" "¼" :string) -(merge-rule "\IeC {\textordfeminine }" "ª" :string) -(merge-rule "\IeC {\textordmasculine }" "º" :string) -(merge-rule "\IeC {\textperiodcentered }" "·" :string) -(merge-rule "\IeC {\textquestiondown }" "¿" :string) -(merge-rule "\IeC {\textregistered }" "®" :string) -(merge-rule "\IeC {\textthreequarters }" "¾" :string) -(merge-rule "\IeC {\textyen }" "¥" :string) -(merge-rule "\IeC {\th }" "þ" :string) -(merge-rule "\IeC {\TH }" "Þ" :string) -(merge-rule "\IeC {\'I}" "Í" :string) -(merge-rule "\IeC {\`I}" "Ì" :string) -(merge-rule "\IeC {\^I}" "Î" :string) -(merge-rule "\IeC {\~"I}" "Ï" :string) -(merge-rule "\IeC {\.I}" "İ" :string) -(merge-rule "\IeC {\^J}" "Ĵ" :string) -(merge-rule "\IeC {\k a}" "ą" :string) -(merge-rule "\IeC {\k A}" "Ą" :string) -(merge-rule "\IeC {\k e}" "ę" :string) -(merge-rule "\IeC {\k E}" "Ę" :string) -(merge-rule "\IeC {\'l}" "ĺ" :string) -(merge-rule "\IeC {\'L}" "Ĺ" :string) -(merge-rule "\IeC {\textlnot }" "¬" :string) -(merge-rule "\IeC {\textmu }" "µ" :string) -(merge-rule "\IeC {\'n}" "ń" :string) -(merge-rule "\IeC {\'N}" "Ń" :string) -(merge-rule "\IeC {\~~n}" "ñ" :string) -(merge-rule "\IeC {\~~N}" "Ñ" :string) -(merge-rule "\IeC {\'o}" "ó" :string) -(merge-rule "\IeC {\'O}" "Ó" :string) -(merge-rule "\IeC {\`o}" "ò" :string) -(merge-rule "\IeC {\`O}" "Ò" :string) -(merge-rule "\IeC {\^o}" "ô" :string) -(merge-rule "\IeC {\^O}" "Ô" :string) -(merge-rule "\IeC {\~"o}" "ö" :string) -(merge-rule "\IeC {\~"O}" "Ö" :string) -(merge-rule "\IeC {\~~o}" "õ" :string) -(merge-rule "\IeC {\~~O}" "Õ" :string) -(merge-rule "\IeC {\textpm }" "±" :string) -(merge-rule "\IeC {\r a}" "å" :string) -(merge-rule "\IeC {\r A}" "Å" :string) -(merge-rule "\IeC {\'r}" "ŕ" :string) -(merge-rule "\IeC {\'R}" "Ŕ" :string) -(merge-rule "\IeC {\r u}" "ů" :string) -(merge-rule "\IeC {\r U}" "Ů" :string) -(merge-rule "\IeC {\'s}" "ś" :string) -(merge-rule "\IeC {\'S}" "Ś" :string) -(merge-rule "\IeC {\^s}" "ŝ" :string) -(merge-rule "\IeC {\^S}" "Ŝ" :string) -(merge-rule "\IeC {\textasciidieresis }" "¨" :string) -(merge-rule "\IeC {\textasciimacron }" "¯" :string) -(merge-rule "\IeC {\.{}}" "˙" :string) -(merge-rule "\IeC {\textasciiacute }" "´" :string) -(merge-rule "\IeC {\texttimes }" "×" :string) -(merge-rule "\IeC {\u a}" "ă" :string) -(merge-rule "\IeC {\u A}" "Ă" :string) -(merge-rule "\IeC {\u g}" "ğ" :string) -(merge-rule "\IeC {\u G}" "Ğ" :string) -(merge-rule "\IeC {\textasciibreve }" "˘" :string) -(merge-rule "\IeC {\'u}" "ú" :string) -(merge-rule "\IeC {\'U}" "Ú" :string) -(merge-rule "\IeC {\`u}" "ù" :string) -(merge-rule "\IeC {\`U}" "Ù" :string) -(merge-rule "\IeC {\^u}" "û" :string) -(merge-rule "\IeC {\^U}" "Û" :string) -(merge-rule "\IeC {\~"u}" "ü" :string) -(merge-rule "\IeC {\~"U}" "Ü" :string) -(merge-rule "\IeC {\u u}" "ŭ" :string) -(merge-rule "\IeC {\u U}" "Ŭ" :string) -(merge-rule "\IeC {\v c}" "č" :string) -(merge-rule "\IeC {\v C}" "Č" :string) -(merge-rule "\IeC {\v d}" "ď" :string) -(merge-rule "\IeC {\v D}" "Ď" :string) -(merge-rule "\IeC {\v e}" "ě" :string) -(merge-rule "\IeC {\v E}" "Ě" :string) -(merge-rule "\IeC {\v l}" "ľ" :string) -(merge-rule "\IeC {\v L}" "Ľ" :string) -(merge-rule "\IeC {\v n}" "ň" :string) -(merge-rule "\IeC {\v N}" "Ň" :string) -(merge-rule "\IeC {\v r}" "ř" :string) -(merge-rule "\IeC {\v R}" "Ř" :string) -(merge-rule "\IeC {\v s}" "š" :string) -(merge-rule "\IeC {\v S}" "Š" :string) -(merge-rule "\IeC {\textasciicaron }" "ˇ" :string) -(merge-rule "\IeC {\v t}" "ť" :string) -(merge-rule "\IeC {\v T}" "Ť" :string) -(merge-rule "\IeC {\v z}" "ž" :string) -(merge-rule "\IeC {\v Z}" "Ž" :string) -(merge-rule "\IeC {\'y}" "ý" :string) -(merge-rule "\IeC {\'Y}" "Ý" :string) -(merge-rule "\IeC {\~"y}" "ÿ" :string) -(merge-rule "\IeC {\'z}" "ź" :string) -(merge-rule "\IeC {\'Z}" "Ź" :string) -(merge-rule "\IeC {\.z}" "ż" :string) -(merge-rule "\IeC {\.Z}" "Ż" :string) -;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding -(merge-rule "\IeC {\~"Y}" "Ÿ" :string) -(merge-rule "\IeC {\NG }" "Ŋ" :string) -(merge-rule "\IeC {\ng }" "ŋ" :string) -(merge-rule "\IeC {\OE }" "Œ" :string) -(merge-rule "\IeC {\oe }" "œ" :string) -(merge-rule "\IeC {\IJ }" "IJ" :string) -(merge-rule "\IeC {\ij }" "ij" :string) -(merge-rule "\IeC {\j }" "ȷ" :string) -(merge-rule "\IeC {\SS }" "ẞ" :string) diff --git a/LatinRules.xdy b/LatinRules.xdy deleted file mode 100644 index 99f14a2..0000000 --- a/LatinRules.xdy +++ /dev/null @@ -1,607 +0,0 @@ -;; style file for xindy -;; filename: LatinRules.xdy -;; -;; It is based upon xindy's files lang/general/utf8.xdy and -;; lang/general/utf8-lang.xdy which implement -;; "a general sorting order for Western European languages" -;; -;; The aim for Sphinx is to be able to index in a Cyrillic document -;; also terms using the Latin alphabets, inclusive of letters -;; with diacritics. To this effect the xindy rules from lang/general -;; got manually re-coded to avoid collisions with the encoding -;; done by xindy for sorting words in Cyrillic languages, which was -;; observed not to use bytes with octal encoding 0o266 or higher. -;; -;; So here we use only 0o266 or higher bytes. -;; (Ŋ, ŋ, IJ, and ij are absent from -;; lang/general/utf8.xdy and not included here) -;; Contributed by the Sphinx team, 2018. - -(define-letter-group "A" :prefixes ("")) -(define-letter-group "B" :after "A" :prefixes ("")) -(define-letter-group "C" :after "B" :prefixes ("")) -(define-letter-group "D" :after "C" :prefixes ("")) -(define-letter-group "E" :after "D" :prefixes ("")) -(define-letter-group "F" :after "E" :prefixes ("")) -(define-letter-group "G" :after "F" :prefixes ("")) -(define-letter-group "H" :after "G" :prefixes ("")) -(define-letter-group "I" :after "H" :prefixes ("")) -(define-letter-group "J" :after "I" :prefixes ("")) -(define-letter-group "K" :after "J" :prefixes ("")) -(define-letter-group "L" :after "K" :prefixes ("")) -(define-letter-group "M" :after "L" :prefixes ("")) -(define-letter-group "N" :after "M" :prefixes ("")) -(define-letter-group "O" :after "N" :prefixes ("")) -(define-letter-group "P" :after "O" :prefixes ("")) -(define-letter-group "Q" :after "P" :prefixes ("")) -(define-letter-group "R" :after "Q" :prefixes ("")) -(define-letter-group "S" :after "R" :prefixes ("")) -(define-letter-group "T" :after "S" :prefixes ("")) -(define-letter-group "U" :after "T" :prefixes ("")) -(define-letter-group "V" :after "U" :prefixes ("")) -(define-letter-group "W" :after "V" :prefixes ("")) -(define-letter-group "X" :after "W" :prefixes ("")) -(define-letter-group "Y" :after "X" :prefixes ("")) -(define-letter-group "Z" :after "Y" :prefixes ("")) - -(define-rule-set "sphinx-xy-alphabetize" - - :rules (("À" "" :string) - ("Ă" "" :string) - ("â" "" :string) - ("Ä" "" :string) - ("à" "" :string) - ("Å" "" :string) - ("Ã" "" :string) - ("Á" "" :string) - ("á" "" :string) - ("ã" "" :string) - ("Â" "" :string) - ("ă" "" :string) - ("å" "" :string) - ("ą" "" :string) - ("ä" "" :string) - ("Ą" "" :string) - ("æ" "" :string) - ("Æ" "" :string) - ("ć" "" :string) - ("ĉ" "" :string) - ("ç" "" :string) - ("Č" "" :string) - ("č" "" :string) - ("Ĉ" "" :string) - ("Ç" "" :string) - ("Ć" "" :string) - ("ď" "" :string) - ("Đ" "" :string) - ("Ď" "" :string) - ("đ" "" :string) - ("ê" "" :string) - ("Ę" "" :string) - ("Ě" "" :string) - ("ë" "" :string) - ("ě" "" :string) - ("é" "" :string) - ("È" "" :string) - ("Ë" "" :string) - ("É" "" :string) - ("è" "" :string) - ("Ê" "" :string) - ("ę" "" :string) - ("ĝ" "" :string) - ("ğ" "" :string) - ("Ğ" "" :string) - ("Ĝ" "" :string) - ("ĥ" "" :string) - ("Ĥ" "" :string) - ("Ï" "" :string) - ("Í" "" :string) - ("ï" "" :string) - ("Î" "" :string) - ("î" "" :string) - ("ı" "" :string) - ("İ" "" :string) - ("í" "" :string) - ("Ì" "" :string) - ("ì" "" :string) - ("Ĵ" "" :string) - ("ĵ" "" :string) - ("ł" "" :string) - ("Ł" "" :string) - ("ľ" "" :string) - ("Ľ" "" :string) - ("ń" "" :string) - ("Ń" "" :string) - ("ñ" "" :string) - ("ň" "" :string) - ("Ñ" "" :string) - ("Ň" "" :string) - ("Õ" "" :string) - ("Ő" "" :string) - ("ó" "" :string) - ("ö" "" :string) - ("ô" "" :string) - ("ő" "" :string) - ("Ø" "" :string) - ("Ö" "" :string) - ("õ" "" :string) - ("Ô" "" :string) - ("ø" "" :string) - ("Ó" "" :string) - ("Ò" "" :string) - ("ò" "" :string) - ("œ" "ĺ" :string) - ("Œ" "ĺ" :string) - ("Ř" "" :string) - ("ř" "" :string) - ("Ŕ" "" :string) - ("ŕ" "" :string) - ("ŝ" "" :string) - ("Ś" "" :string) - ("ș" "" :string) - ("ş" "" :string) - ("Ŝ" "" :string) - ("ś" "" :string) - ("Ș" "" :string) - ("š" "" :string) - ("Ş" "" :string) - ("Š" "" :string) - ("ß" "" :string) - ("Ț" "" :string) - ("Ť" "" :string) - ("ț" "" :string) - ("ť" "" :string) - ("û" "" :string) - ("ŭ" "" :string) - ("ů" "" :string) - ("ű" "" :string) - ("ù" "" :string) - ("Ŭ" "" :string) - ("Ù" "" :string) - ("Ű" "" :string) - ("Ü" "" :string) - ("Ů" "" :string) - ("ú" "" :string) - ("Ú" "" :string) - ("Û" "" :string) - ("ü" "" :string) - ("ÿ" "" :string) - ("Ý" "" :string) - ("Ÿ" "" :string) - ("ý" "" :string) - ("Ż" "" :string) - ("Ž" "" :string) - ("Ź" "" :string) - ("ž" "" :string) - ("ż" "" :string) - ("ź" "" :string) - ("a" "" :string) - ("A" "" :string) - ("b" "" :string) - ("B" "" :string) - ("c" "" :string) - ("C" "" :string) - ("d" "" :string) - ("D" "" :string) - ("e" "" :string) - ("E" "" :string) - ("F" "" :string) - ("f" "" :string) - ("G" "" :string) - ("g" "" :string) - ("H" "" :string) - ("h" "" :string) - ("i" "" :string) - ("I" "" :string) - ("J" "" :string) - ("j" "" :string) - ("K" "" :string) - ("k" "" :string) - ("L" "" :string) - ("l" "" :string) - ("M" "" :string) - ("m" "" :string) - ("n" "" :string) - ("N" "" :string) - ("O" "" :string) - ("o" "" :string) - ("p" "" :string) - ("P" "" :string) - ("Q" "" :string) - ("q" "" :string) - ("r" "" :string) - ("R" "" :string) - ("S" "" :string) - ("s" "" :string) - ("t" "" :string) - ("T" "" :string) - ("u" "" :string) - ("U" "" :string) - ("v" "" :string) - ("V" "" :string) - ("W" "" :string) - ("w" "" :string) - ("x" "" :string) - ("X" "" :string) - ("Y" "" :string) - ("y" "" :string) - ("z" "" :string) - ("Z" "" :string) - )) - -(define-rule-set "sphinx-xy-resolve-diacritics" - - :rules (("Ĥ" "" :string) - ("ó" "" :string) - ("ľ" "" :string) - ("Ř" "" :string) - ("ĝ" "" :string) - ("ď" "" :string) - ("Ě" "" :string) - ("ĥ" "" :string) - ("Č" "" :string) - ("Ĵ" "" :string) - ("ě" "" :string) - ("ž" "" :string) - ("Ď" "" :string) - ("ř" "" :string) - ("Ž" "" :string) - ("ı" "" :string) - ("Ť" "" :string) - ("á" "" :string) - ("č" "" :string) - ("Á" "" :string) - ("ň" "" :string) - ("Š" "" :string) - ("Ň" "" :string) - ("ĵ" "" :string) - ("ť" "" :string) - ("Ó" "" :string) - ("ý" "" :string) - ("Ĝ" "" :string) - ("Ú" "" :string) - ("Ľ" "" :string) - ("š" "" :string) - ("Ý" "" :string) - ("ú" "" :string) - ("Ś" "" :string) - ("ć" "" :string) - ("Ł" "" :string) - ("ł" "" :string) - ("ń" "" :string) - ("À" "" :string) - ("Ź" "" :string) - ("à" "" :string) - ("Ń" "" :string) - ("Đ" "" :string) - ("ÿ" "" :string) - ("ś" "" :string) - ("Ğ" "" :string) - ("ğ" "" :string) - ("Ù" "" :string) - ("İ" "" :string) - ("đ" "" :string) - ("ù" "" :string) - ("Ț" "" :string) - ("é" "" :string) - ("ŕ" "" :string) - ("Ć" "" :string) - ("ț" "" :string) - ("ò" "" :string) - ("ź" "" :string) - ("Ò" "" :string) - ("Ÿ" "" :string) - ("Ŕ" "" :string) - ("É" "" :string) - ("ĉ" "" :string) - ("ô" "" :string) - ("Í" "" :string) - ("ŝ" "" :string) - ("Ż" "" :string) - ("Ă" "" :string) - ("Ŝ" "" :string) - ("ñ" "" :string) - ("ŭ" "" :string) - ("í" "" :string) - ("È" "" :string) - ("Ô" "" :string) - ("Ŭ" "" :string) - ("ż" "" :string) - ("Ñ" "" :string) - ("è" "" :string) - ("Ĉ" "" :string) - ("ă" "" :string) - ("â" "" :string) - ("û" "" :string) - ("ê" "" :string) - ("Õ" "" :string) - ("õ" "" :string) - ("ș" "" :string) - ("ç" "" :string) - ("Â" "" :string) - ("Ê" "" :string) - ("Û" "" :string) - ("Ç" "" :string) - ("ì" "" :string) - ("Ì" "" :string) - ("Ș" "" :string) - ("ö" "" :string) - ("Ö" "" :string) - ("ş" "" :string) - ("ů" "" :string) - ("ë" "" :string) - ("ã" "" :string) - ("î" "" :string) - ("Î" "" :string) - ("Ã" "" :string) - ("Ş" "" :string) - ("Ů" "" :string) - ("Ë" "" :string) - ("ï" "" :string) - ("Ő" "" :string) - ("Ï" "" :string) - ("Ę" "" :string) - ("ő" "" :string) - ("Ü" "" :string) - ("Å" "" :string) - ("ü" "" :string) - ("ę" "" :string) - ("å" "" :string) - ("Ä" "" :string) - ("ű" "" :string) - ("Ø" "" :string) - ("ø" "" :string) - ("Ű" "" :string) - ("ä" "" :string) - ("Ą" "" :string) - ("ą" "" :string) - ("œ" "" :string) - ("ß" "" :string) - ("Æ" "" :string) - ("Œ" "" :string) - ("æ" "" :string) - ("e" "" :string) - ("t" "" :string) - ("L" "" :string) - ("Y" "" :string) - ("J" "" :string) - ("a" "" :string) - ("p" "" :string) - ("u" "" :string) - ("j" "" :string) - ("b" "" :string) - ("G" "" :string) - ("U" "" :string) - ("F" "" :string) - ("H" "" :string) - ("i" "" :string) - ("z" "" :string) - ("c" "" :string) - ("l" "" :string) - ("A" "" :string) - ("Q" "" :string) - ("w" "" :string) - ("D" "" :string) - ("R" "" :string) - ("d" "" :string) - ("s" "" :string) - ("r" "" :string) - ("k" "" :string) - ("v" "" :string) - ("m" "" :string) - ("P" "" :string) - ("y" "" :string) - ("K" "" :string) - ("q" "" :string) - ("S" "" :string) - ("I" "" :string) - ("C" "" :string) - ("M" "" :string) - ("Z" "" :string) - ("T" "" :string) - ("W" "" :string) - ("B" "" :string) - ("h" "" :string) - ("x" "" :string) - ("X" "" :string) - ("f" "" :string) - ("E" "" :string) - ("V" "" :string) - ("N" "" :string) - ("O" "" :string) - ("o" "" :string) - ("g" "" :string) - ("n" "" :string) - )) - -(define-rule-set "sphinx-xy-resolve-case" - - :rules (("Ú" "8" :string) - ("Ÿ" "8" :string) - ("Ç" "8" :string) - ("Ĉ" "8" :string) - ("Ŕ" "8" :string) - ("Ľ" "8" :string) - ("Ů" "8" :string) - ("Ý" "8" :string) - ("É" "8" :string) - ("Ë" "8" :string) - ("Ș" "8" :string) - ("Ì" "8" :string) - ("Ê" "8" :string) - ("Ň" "8" :string) - ("Ą" "8" :string) - ("Š" "8" :string) - ("Û" "8" :string) - ("Ş" "8" :string) - ("Ć" "8" :string) - ("Ò" "8" :string) - ("Ĝ" "8" :string) - ("Ñ" "8" :string) - ("Ó" "8" :string) - ("Î" "8" :string) - ("Á" "8" :string) - ("Ã" "8" :string) - ("Ț" "8" :string) - ("Å" "8" :string) - ("Ğ" "8" :string) - ("Ü" "8" :string) - ("È" "8" :string) - ("Ô" "8" :string) - ("İ" "8" :string) - ("Ű" "8" :string) - ("Ù" "8" :string) - ("Ŭ" "8" :string) - ("Â" "8" :string) - ("Ť" "8" :string) - ("Ń" "8" :string) - ("Ď" "8" :string) - ("Ź" "8" :string) - ("Ž" "8" :string) - ("Đ" "8" :string) - ("Ŝ" "8" :string) - ("Č" "8" :string) - ("Ĵ" "8" :string) - ("Ö" "8" :string) - ("Ø" "8" :string) - ("Ż" "8" :string) - ("Ł" "8" :string) - ("Ă" "8" :string) - ("Ě" "8" :string) - ("Ő" "8" :string) - ("Õ" "8" :string) - ("Ę" "8" :string) - ("Ï" "8" :string) - ("À" "8" :string) - ("Ĥ" "8" :string) - ("Ä" "8" :string) - ("Ś" "8" :string) - ("Ř" "8" :string) - ("Í" "8" :string) - ("Œ" "89" :string) - ("Æ" "89" :string) - ("ì" "9" :string) - ("è" "9" :string) - ("ą" "9" :string) - ("š" "9" :string) - ("ú" "9" :string) - ("å" "9" :string) - ("ă" "9" :string) - ("ę" "9" :string) - ("ü" "9" :string) - ("ź" "9" :string) - ("ò" "9" :string) - ("ť" "9" :string) - ("ț" "9" :string) - ("ĵ" "9" :string) - ("ŕ" "9" :string) - ("ż" "9" :string) - ("ä" "9" :string) - ("ý" "9" :string) - ("ù" "9" :string) - ("á" "9" :string) - ("é" "9" :string) - ("č" "9" :string) - ("ň" "9" :string) - ("ś" "9" :string) - ("ø" "9" :string) - ("í" "9" :string) - ("đ" "9" :string) - ("ı" "9" :string) - ("ğ" "9" :string) - ("î" "9" :string) - ("ã" "9" :string) - ("à" "9" :string) - ("ř" "9" :string) - ("ő" "9" :string) - ("ů" "9" :string) - ("ș" "9" :string) - ("ÿ" "9" :string) - ("ë" "9" :string) - ("ŭ" "9" :string) - ("ç" "9" :string) - ("ű" "9" :string) - ("ñ" "9" :string) - ("õ" "9" :string) - ("ě" "9" :string) - ("ş" "9" :string) - ("ž" "9" :string) - ("ĝ" "9" :string) - ("ŝ" "9" :string) - ("ń" "9" :string) - ("û" "9" :string) - ("ł" "9" :string) - ("ď" "9" :string) - ("ĥ" "9" :string) - ("ê" "9" :string) - ("ô" "9" :string) - ("ĉ" "9" :string) - ("â" "9" :string) - ("ć" "9" :string) - ("ï" "9" :string) - ("ö" "9" :string) - ("ľ" "9" :string) - ("ó" "9" :string) - ("æ" "99" :string) - ("ß" "99" :string) - ("œ" "99" :string) - ("N" "8" :string) - ("V" "8" :string) - ("O" "8" :string) - ("X" "8" :string) - ("E" "8" :string) - ("P" "8" :string) - ("K" "8" :string) - ("T" "8" :string) - ("Z" "8" :string) - ("M" "8" :string) - ("C" "8" :string) - ("I" "8" :string) - ("S" "8" :string) - ("B" "8" :string) - ("W" "8" :string) - ("D" "8" :string) - ("R" "8" :string) - ("H" "8" :string) - ("F" "8" :string) - ("Q" "8" :string) - ("A" "8" :string) - ("G" "8" :string) - ("U" "8" :string) - ("J" "8" :string) - ("Y" "8" :string) - ("L" "8" :string) - ("o" "9" :string) - ("n" "9" :string) - ("g" "9" :string) - ("x" "9" :string) - ("f" "9" :string) - ("y" "9" :string) - ("q" "9" :string) - ("h" "9" :string) - ("w" "9" :string) - ("s" "9" :string) - ("d" "9" :string) - ("v" "9" :string) - ("k" "9" :string) - ("r" "9" :string) - ("m" "9" :string) - ("z" "9" :string) - ("c" "9" :string) - ("i" "9" :string) - ("l" "9" :string) - ("b" "9" :string) - ("j" "9" :string) - ("a" "9" :string) - ("p" "9" :string) - ("u" "9" :string) - ("t" "9" :string) - ("e" "9" :string) - )) - -(use-rule-set :run 0 - :rule-set ("sphinx-xy-alphabetize")) -(use-rule-set :run 1 - :rule-set ("sphinx-xy-resolve-diacritics")) -(use-rule-set :run 2 - :rule-set ("sphinx-xy-resolve-case")) diff --git a/MVC_pattern.png b/MVC_pattern.png deleted file mode 100644 index 408a4b6..0000000 Binary files a/MVC_pattern.png and /dev/null differ diff --git a/Makefile b/Makefile deleted file mode 100644 index f1f525a..0000000 --- a/Makefile +++ /dev/null @@ -1,81 +0,0 @@ -# Makefile for Sphinx LaTeX output - -ALLDOCS = $(basename $(wildcard *.tex)) -ALLPDF = $(addsuffix .pdf,$(ALLDOCS)) -ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) -ALLPS = $(addsuffix .ps,$(ALLDOCS)) - -# Prefix for archive names -ARCHIVEPREFIX = -# Additional LaTeX options -LATEXOPTS = -# format: pdf or dvi -FMT = pdf - -LATEX = latex -PDFLATEX = pdflatex -MAKEINDEX = makeindex - - -all: $(ALLPDF) -all-pdf: $(ALLPDF) -all-dvi: $(ALLDVI) -all-ps: $(ALLPS) - -all-pdf-ja: - for f in *.pdf *.png *.gif *.jpg *.jpeg; do extractbb $$f; done - for f in *.tex; do pdflatex -kanji=utf8 $(LATEXOPTS) $$f; done - for f in *.tex; do pdflatex -kanji=utf8 $(LATEXOPTS) $$f; done - for f in *.tex; do pdflatex -kanji=utf8 $(LATEXOPTS) $$f; done - -for f in *.idx; do mendex -U -f -d "`basename $$f .idx`.dic" -s python.ist $$f; done - for f in *.tex; do pdflatex -kanji=utf8 $(LATEXOPTS) $$f; done - for f in *.tex; do pdflatex -kanji=utf8 $(LATEXOPTS) $$f; done - for f in *.dvi; do dvipdfmx $$f; done - -zip: all-$(FMT) - mkdir $(ARCHIVEPREFIX)docs-$(FMT) - cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) - zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT) - rm -r $(ARCHIVEPREFIX)docs-$(FMT) - -tar: all-$(FMT) - mkdir $(ARCHIVEPREFIX)docs-$(FMT) - cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) - tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT) - rm -r $(ARCHIVEPREFIX)docs-$(FMT) - -gz: tar - gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz - -bz2: tar - bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar - -xz: tar - xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar - -# The number of LaTeX runs is quite conservative, but I don't expect it -# to get run often, so the little extra time won't hurt. -%.dvi: %.tex - $(LATEX) $(LATEXOPTS) '$<' - $(LATEX) $(LATEXOPTS) '$<' - $(LATEX) $(LATEXOPTS) '$<' - -$(MAKEINDEX) -s python.ist '$(basename $<).idx' - $(LATEX) $(LATEXOPTS) '$<' - $(LATEX) $(LATEXOPTS) '$<' - -%.pdf: %.tex - $(PDFLATEX) $(LATEXOPTS) '$<' - $(PDFLATEX) $(LATEXOPTS) '$<' - $(PDFLATEX) $(LATEXOPTS) '$<' - -$(MAKEINDEX) -s python.ist '$(basename $<).idx' - $(PDFLATEX) $(LATEXOPTS) '$<' - $(PDFLATEX) $(LATEXOPTS) '$<' - -%.ps: %.dvi - dvips '$<' - -clean: - rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) - -.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz -.PHONY: all-pdf-ja diff --git a/P01_Erste_Schritte_mit_C/README.md b/P01_Erste_Schritte_mit_C/README.md deleted file mode 100644 index add4b2d..0000000 --- a/P01_Erste_Schritte_mit_C/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# 01 - Erste Schritte mit C - -___ -## 1. Übersicht - -In diesem Praktikum erstellen Sie mehrere kleine C-Programme, in denen Sie Input- und Output-Funktionen der C Standard Library verwenden. - -Arbeiten Sie in Zweiergruppen und diskutieren Sie ihre Lösungsansätze miteinander, bevor Sie diese umsetzen. - -Bevor Sie mit den Programmieraufgaben beginnen, setzen Sie eine virtuelle Maschine mit der vorbereiteten Praktikumsumgebung auf. - -___ -## 2. Lernziele -In diesem Praktikum schreiben Sie selbst von Grund auf einige einfache C-Programme und wenden verschiedene Kontrollstrukturen an. - -- Sie können mit *#include* Funktionen der C Standard Library einbinden -- Sie können mit *#define* Macros definieren und diese anwenden -- Sie wenden die *Input-* und *Output-Funktionen* von C an, um Tastatur-Input einzulesen und formatierte Ausgaben zu machen. -- Sie verwenden die Kommandozeile, um ihren Sourcecode in ein ausführbares Programm umzuwandeln. -- Sie wenden for-und while-Loops sowie if-then-else-Verzweigungen an. -- Sie setzen eine Programmieraufgabe selbständig in ein funktionierendes Programm um. - -___ -## 3. Aufgabe 1: virtuelle Maschine -Im Moodle-Kurs "Systemnahe Programmierung" finden Sie unter "Praktika" eine Installationsanleitung für die virtuelle Maschine, die wir Ihnen zur Verfügung stellen. Die virtuelle Maschine enthält ein Ubuntu Linux-Betriebssystem und die für das Praktikum benötigten Frameworks. - -Folgen sie der Anleitung, um die virtuelle Maschine auf ihrem Rechner zu installieren. - -___ -## 4. Aufgabe 2: Hello World -Schreiben Sie ein C-Programm, das "Hello World" auf die Standardausgabe schreibt. Verwenden Sie die printf-Funktion aus der Standard Library. In den Vorlesungsfolien finden Sie bei Bedarf eine Vorlage. - -Erstellen sie das Source-File mit einem beliebigen Editor, sie benötigen nicht unbedingt eine IDE. Speichern Sie das Source-File mit der Endung `.c`. - -Um ihr Source-File zu kompilieren, verwenden Sie den GNU Compiler auf der Kommandozeile: -``` sh -$> gcc hello.c -``` - -Der Compiler übersetzt ihr Programm in eine ausführbare Datei `a.out`, die Sie mit - -``` sh -$> ./a.out -``` - -ausführen können. Sie können den Namen der ausführbaren Datei wählen, indem Sie die Option `-o` verwenden: - -``` sh -$> gcc hello.c -o hello -``` - -erzeugt die ausführbare Datei `hello`. - -Verwenden Sie die Option `-Wall`, um alle Warnungen des Compilers auszugeben. Dies weist Sie auf allfällige Programmierfehler hin. - -___ -## 5. Aufgabe 3: Tabellenausgabe -Schreiben Sie ein Programm in C, das von `stdin` einen Umrechnungsfaktor zwischen CHF und Bitcoin einliest und danach eine Tabelle von Franken- und Bitcoin-Beträgen ausgibt. Die Tabelle soll sauber formatiert sein, z.B. so: -``` -Enter conversion rate (1.00 BTC -> CHF): 43158.47 - 200 CHF <--> 0.00463 BTC - 400 CHF <--> 0.00927 BTC - 600 CHF <--> 0.01390 BTC - 800 CHF <--> 0.01854 BTC - 1000 CHF <--> 0.02317 BTC - 1200 CHF <--> 0.02780 BTC - 1400 CHF <--> 0.03244 BTC - 1600 CHF <--> 0.03707 BTC -``` - -- Verwenden Sie eine Schleife und die `printf`-Funktion für die Tabellenausgabe -- Definieren Sie ein Makro `NUM_ROWS`, um an zentraler Stelle im Source-Code zu definieren, wie viele Einträge die Tabelle in der Ausgabe haben soll. -- Lesen Sie den Umrechnungsfaktor mit der `scanf`-Funktion als `double` von der Kommandozeile ein. - -___ -## 6. Aufgabe 4: Zeichen und Wörter zählen -Schreiben Sie ein C-Programm, welches die Zeichen und Wörter einer mit der Tastatur eingegebenen Zeile zählt. Wortzwischenräume sind entweder Leerzeichen (' ') oder Tabulatoren ('\t'). Die Eingabe der Zeile mit einem newline-character ('\n') abgeschlossen. Danach soll ihr Programm die Anzahl Zeichen und die Anzahl Wörter ausgeben und terminieren. -- Verwenden Sie die `char getchar(void)` Funktion aus der `stdio.h` Library, um die Zeichen einzeln einzulesen. Die Funktion `getchar` kehrt nicht gleich bei Eingabe des ersten Zeichens zurück, sondern puffert die Daten, bis die Eingabe einer kompletten Zeile mit Return abgeschlossen wird. Dann wird das erste Zeichen aus dem Puffer zurückgegeben und mit weiteren Aufrufen von getchar können die nachfolgenden Zeichen aus dem Puffer gelesen werden. Gibt `getchar` das Zeichen `\n` zurück, ist die Zeile komplett zurückgegeben und der Puffer ist wieder leer. -- Setzen Sie eine Schleife ein, die beim Zeichen '\n' terminiert. -- Benutzen Sie if-then-else-Strukturen um die Wörter zu zählen. - -___ -## 7. Bewertung -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. diff --git a/P02_Funktionen_Datentyp_enum/P02_functions_enum.docx b/P02_Funktionen_Datentyp_enum/P02_functions_enum.docx deleted file mode 100644 index dec4db8..0000000 Binary files a/P02_Funktionen_Datentyp_enum/P02_functions_enum.docx and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/README.md b/P02_Funktionen_Datentyp_enum/README.md deleted file mode 100644 index 4c33a66..0000000 --- a/P02_Funktionen_Datentyp_enum/README.md +++ /dev/null @@ -1,228 +0,0 @@ -# 02: Funktionen, Datentyp "enum" - -___ - -![](./random_number.png) - -(Copyright Bild: xkcd.com) - -___ -## 1. Übersicht - In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum. - - Funktionen sind der wesentlichste Bestandteil der C Programmierung welcher eine strukturierte Programmierung ermöglicht: - * Eine Funktion ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden. - * Jede Funktion besitzt einen eindeutigen Namen, eine eindeutige Signatur (Typen und Reihenfolge der Parameter) und einen Rückgabewert (int falls nichts angegeben wird). - * Eine Funktion kann Werte aus dem aufrufendem Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern. -Beispiel einer Additions-Funktion: -``` -#include - -/* Funktionsdeklaration */ -int add(int a, int b); - -int main(void) { - int aa = 1, bb = 2, cc; - printf("%aa + %bb = %cc", aa, bb, add(aa, bb);); - return 0; -} - -/* Funktionsdefinition */ -int add(int a, int b) { - return a + b; -} -``` -Der Daten typt enum wird verwendet um die Lesbarkeit von Programmen zu erhöhen: - -Beispiel eines enum: -``` -enum Ampeln = {rot =1, gelb, gruen}; - -int main(void) { - Ampeln ampel1; - if (ampel1 == rot) {...} - return 0; -} -``` - -___ -## 2. Lernziele - -In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden. - * Sie können ein Programm schreiben welches aus mehreren Funktionen besteht. - * Sie können Funktionen deklarieren, definieren und aufrufen. - * Sie können enum Typen definieren und deren Werte bestimmen und abfragen. - -___ -## 3. Aufgaben - -```{eval-rst} -.. figure:: kalender-108_v-ARDFotogalerie.jpg - :width: 600px - :name: kalender-108_v-ARDFotogalerie - :align: center -``` - -(Copyright Bild: www.planet-wissen.de) - -### 3.1 Aufgabe 1 Tage pro Monat -In der ersten Aufgabe berechnen Sie die Tag pro Monat einer beliebigen Kombination Monat / Jahr. -Erweitern Sie dazu das Programm um folgende Aspekte: -* Bereichsprüfung von Jahr und Monat -* Funktion istSchaltjahr, welche berechnet, ob das Jahr eine Schaljahr ist -* Funktion tageProMonat, welche die Anzahl Tage des gegebenen Monats und Jahres berechnet. - -Vorgaben: -* Die Funktion istSchaltjahr nimmt ein Integer (jahr) entgegen und gibt 1 im Falle eiens Schltjahres und 0 im andreren Fall zurück -* Die Funktion tageProMonat nimmt zwei integer (monat und jahr) entgegeben und gibt die Anzahl Tage als Integer zurück -* Die Jahreszahl, welche den Funktionen übergeben wird, muss überprüft werden und grösser gleich 1599 und kleiner als 10000 sein -* Der übergebene Monat muss grösser als 0 und kleine als 13 sein. - -Die Regeln für die Schaltjahrberechnung: -* Schaltjahre sind alle Jahre, die durch 4 teilbar sind. -* Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schltjahre. -* zu den 100er gibt es ebenfalls Ausnahmen: Diese sind immer Schaltjahre, wenn sie durch 400 teilbar sind -... also zum Beispiel 1600 ist eines, nicht jedoch 1700. Weiterführende Details finden Sie unter https://de.wikipedia.org/wiki/Gregorianischer_Kalender - -Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen: -* gibIntWert: Die Funktion soll einen Int Wert zurückgeben. Der Bereich, wie auch Fehleingaben sollen sollen berücksichtigt werden. (atoi unfd fgets sind hier hilfreich) -* istSchaltjahr: Die Funktion gibt 1 im Falle eines Schltjahr und o im anderen Falle zurück. -* tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switchanweisung , sowie den enum Datentypen - -``` -int main (int argc, char *argv[]) { - - int monat, jahr; - - // Monat einlesen und Bereich ueberpruefen - monat = gibIntWert("Monat", 1, 12); - jahr = gibIntWert("Jahr", 1600, 9999); - - // Ausgabe zum Test - printf("Monat: %d, Jahr: %d \n", monat, jahr); - - // Ausgabe zum Test (hier mit dem ternaeren Operator "?:") - printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein"); - - // Ausgabe - printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat)); - - return 0; -} -``` - -Tipp: Angenommen Sie verwenden den enum month_t { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ }; -Dann können Sie im Programm direkt die Konstanten verwenden: -``` -if (m == 2) ... // schlecht lesbar -if (monat == 2) ... // besserer Variablenname -if (monat == FEB) ... // am besten lesbar -``` - - -Als Abnahme müssen die Tests unverändert ohne Fehler ausgeführt werden (`make test`) -___ -### 3.2 Aufgabe 2 Bestimmen des Wochentags -Erweitern Sie das vorgegebene zweite Programm Gerüst an den bezeichneten Stellen so, dass das Programm von der Kommando Zeile ein Argument entgegennimmt, es auf Gültigkeit überprüft und schliesslich den Wochentag für das gegebene Datum berechnet und ausgibt. -Prüfen Sie die Umsetzung beider Teilaufgaben mittels make test. -#### 3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen -Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel). -Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde terminiert das Programm mit Exit Code EXIT_SUCCESS. -##### 3.2.1.1 Argument Format -Das Format des Kommando Zeilen Arguments soll yyyy-mm-dd sein, wobei yyyy für das vier-stellige Jahr, mm für einen 1-2-stelligen Monat (1…12) und dd für einen Tag des Monats, begin-nend mit 01. Z.B. 2020-02-29. -##### 3.2.1.2 Korrektes Datum -Das Datum muss alle folgenden Bedingungen erfüllen damit es als korrekt erkannt wird: -* Obergrenze für ein «sinnvolles» Datum ist das Jahr 9999 -* es muss Gregorianisch sein, d.h. ab 15. Oktober 1582 (inklusive) -* es darf nur Monate von 1 für Januar bis 12 für Dezember beinhalten -* der Tag muss grösser oder gleich 1 sein -* der Tag darf nicht grösser als 31 sein für Monate mit einer Länge von 31 Tagen -* der Tag darf nicht grösser als 30 sein für Monate mit einer Länge von 30 Tagen -* der Tag darf für den Februar nicht grösser sein als 29 für ein Schaltjahr -* der Tag darf für den Februar nicht grösser sein als 28 für ein Nicht-Schaltjahr - -##### 3.2.1.3 Vorgaben an die Umsetzung -1. Definieren Sie einen enum Typen mit (typedef) Namen month_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher dass die Abkürzungen für die uns geläufigen Monatsnummer stehen. -2. Definierend Sie einen struct Typen mit (typedef) Namen date_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring "%d-%d-%d" in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang. -3. Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is_leap_year(date_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr». -4. Implementieren Sie die Funktion `int get_month_length(date_t date)`. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats ent-spricht) ausgeben – geben Sie 0 für ungültige Monatswerte zurück. -5. Schliesslich implementieren Sie die Funktion int is_gregorian_date(date_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja). -6. Implementieren Sie eine Funktion int is_valid_date(date_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die `month_t` Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implemen-tierten Hilfsfunktionen. -##### 3.2.1.4 Hinweise -Beachten Sie die Kommentare im Code für die geforderten Implementierungs-Details. -#### 3.2.2 Teilaufgabe Wochentag Berechnung -Schreiben Sie eine Funktion welche zu einem Datum den Wochentag berechnet. -Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss. - -```{eval-rst} -.. figure:: Wochentagsberechnung.jpg - :width: 600px - :name: Wochentagsberechnung - :align: center -``` -(Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung) - -Hier ist eine für C abgewandelte Variante davon. -``` -weekday = ((day + (13 * m - 1) / 5 + y + y / 4 + c / 4 - 2 * c) % 7 + 7) % 7 -alle Zahlen sind int Werte und alles basiert auf int-Arithmetik -m = 1 + (month + 9) % 12 -a = year - 1 (für month < Mar), ansonsten year -y = a % 100 -c = a / 100 -``` -Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms fol-gende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy-mm-dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020-02-29 is a Sat. -Vorgaben an die Umsetzung -1. Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stel-len Sie sicher dass die Abkürzungen für die Werte 0…6 stehen. -2. Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenom-men, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));) -3. Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti-ger Wert für day erkannt wird, soll assert(!"day is out-of-range"); aufgeru-fen werden. -Hinweise -• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung - - -___ -## 4. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden können. -| Aufgabe | Kriterium | Gewicht | -| :-- | :-- | :-- | -| alle | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| gibIntWert | Eingabe, Bereichsüberprüfung korrekt | 1 | -| istSchaltjahr | Funktion korrekt | 1 | -| TageProMonat | Funktion korrekt | 1 | -| Aufgabe 2 | Fehlenden Teile ergänzt und lauffähig | 1 | -___ -## 5. Anhang - -### 5.1 Sprach Element - -```int main(int argc, char *argv[]) { - ... -} argc: Anzahl Einträge in argv. -argv: Array von Command Line Argumenten. -argv[0]: wie das Programm gestartet wurde -argv[1]: erstes Argument -… -argv[argc-1]: letztes Argument -int a = 0; -int b = 0; -int c = 0; -int res = sscanf(argv[1] - , "%d-%d-%d" - , &a, &b, &c - ); -if (res != 3) { - // Fehler Behandlung... - // ... -} -``` - -### 5.2 Beschreibung -Siehe man 3 sscanf. -Die Funktion sscanf gibt die Anzahl erfolgreich erkannte Argumente zurück. Unbedingt prüfen und angemessen darauf reagieren. -Die gelesenen Werte werden in a, b und c, gespeichert, dazu müssen Sie die Adresse der Variablen übergeben. Mehr Details dazu werden später erklärt. -fprintf(stderr, "Usage: %s…\n", argv[0]); Siehe man 3 fprintf. -Schreibt formatierten Text auf den stderr Stream. - -___ -Version: 15.02.2022 \ No newline at end of file diff --git a/P02_Funktionen_Datentyp_enum/Wochentagsberechnung.jpg b/P02_Funktionen_Datentyp_enum/Wochentagsberechnung.jpg deleted file mode 100644 index cd3abd0..0000000 Binary files a/P02_Funktionen_Datentyp_enum/Wochentagsberechnung.jpg and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/b_wochentag.jpg b/P02_Funktionen_Datentyp_enum/b_wochentag.jpg deleted file mode 100644 index 374a35c..0000000 Binary files a/P02_Funktionen_Datentyp_enum/b_wochentag.jpg and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/kalender-108_v-ARDFotogalerie.jpg b/P02_Funktionen_Datentyp_enum/kalender-108_v-ARDFotogalerie.jpg deleted file mode 100644 index 9f221af..0000000 Binary files a/P02_Funktionen_Datentyp_enum/kalender-108_v-ARDFotogalerie.jpg and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/m_to_pdf.py b/P02_Funktionen_Datentyp_enum/m_to_pdf.py deleted file mode 100644 index bbd1b41..0000000 --- a/P02_Funktionen_Datentyp_enum/m_to_pdf.py +++ /dev/null @@ -1,11 +0,0 @@ -import os -import grip -import pdfkit - -os.chdir(r"C:\Users\bazz\Documents\GitHub\snp\praktika\P03_Bounding_Box") -f_md = r".\README.md" -f_html = r".\REAMDE.html" -f_pdf = r".\README.pdf" - -grip.render_content(f_md) -pdfkit.from_file(f_html, f_pdf) diff --git a/P02_Funktionen_Datentyp_enum/random_number.png b/P02_Funktionen_Datentyp_enum/random_number.png deleted file mode 100644 index 71b768c..0000000 Binary files a/P02_Funktionen_Datentyp_enum/random_number.png and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/wkhtmltox-0.12.4_msvc2015-win64.exe b/P02_Funktionen_Datentyp_enum/wkhtmltox-0.12.4_msvc2015-win64.exe deleted file mode 100644 index 9b9f058..0000000 Binary files a/P02_Funktionen_Datentyp_enum/wkhtmltox-0.12.4_msvc2015-win64.exe and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/work/demo.c b/P02_Funktionen_Datentyp_enum/work/demo.c deleted file mode 100644 index 53f127b..0000000 --- a/P02_Funktionen_Datentyp_enum/work/demo.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include - -/** Aufgabe 1: -enum Typ "textFlags" deklarieren mit den einzelnene Werten -- ITALICS = 00000001 // = 1 -- BOLD = 00000010 // = 2 -- UNDERLINE = 00000100 // = 4 -*/ - -enum textFlags { ITALICS = 1, BOLD = 2, UNDERLINE = 4 }; - -/** Aufgabe 2 -Funktion Flag Einlesen -*/ - -void menu (void) { - (void) printf("\nBitte geben Sie die gewuenschten Flags ein\n"); - (void) printf("(Ugueltige Eingaben fuehren zum Abbruch.)\n"); - (void) printf("Kursiv: tippen Sie die 1\n"); - (void) printf("Fett: tippen Sie die 2\n"); - (void) printf("Unterstrichen: tippen Sie die 3\n"); - (void) printf("Abbrechen: tippen Sie die 0\n"); - (void) printf("Ihre Wahl: "); -} - - -int flagEinlesen() { - fflush(stdin); - int flag = fgetc(stdin) - '0'; - if (flag < 1 || flag > 3) { flag = 0; } - return flag; -} - - -void displayFlags(int flags) { - printf("Gesetzte Flags: %d\n", flags); -} - -/** Vorgegebener Programm-Rumpf */ -int main(void) { - int oneFlag, flags = 0; - do { - menu(); - oneFlag = flagEinlesen(); - switch (oneFlag) { - case 1: - printf("Wahl: 1, Flag: %d", oneFlag); - flags |= ITALICS; - break; - case 2: - printf("Wahl: 2, Flag: %d", oneFlag); - flags |= BOLD; - break; - case 3: - printf("Wahl: 3, Flag: %d", oneFlag); - flags |= UNDERLINE; - break; - } - (void) displayFlags(flags); - } while (oneFlag != 0); -} - diff --git a/P02_Funktionen_Datentyp_enum/work/demo.exe b/P02_Funktionen_Datentyp_enum/work/demo.exe deleted file mode 100644 index 9bc6254..0000000 Binary files a/P02_Funktionen_Datentyp_enum/work/demo.exe and /dev/null differ diff --git a/P02_Funktionen_Datentyp_enum/work/main.c b/P02_Funktionen_Datentyp_enum/work/main.c deleted file mode 100644 index 3bd4ecb..0000000 --- a/P02_Funktionen_Datentyp_enum/work/main.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * P02 Praktikum - * - * - Funktionen - * - Funktion Schaltjahr - * - Funktion Tage pro Monat - * - Funktion Wochentag - * - * @author ZHAW - * @version 1.0 - 08.02.2022 - */ - -#include -#include - - -int leseZahl(char *prompt, int min, int max) { // Datentyp angeben, Parameter angeben - char zahlString[11]; - int zahl; - - do { - printf("%s", prompt); - fgets(zahlString, 10, stdin); - zahl = atoi(zahlString); // bei ungueltiger Zahl return 0 - } while ((zahl < min) || (zahl > max)); - return zahl; // return Zeile angeben -} - -/** - -____ leseZahl(____) { // Datentyp angeben, Parameter angeben - char zahlString[11]; - int zahl; - - fgets(zahlString, 10, stdin); - zahl = atoi(zahlString); // bei ungueltiger Zahl return 0 - ___________________ // return Zeile angeben - -} -*/ - - - -/* Konstante Werte fuer die Monate */ -enum { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ }; - - -int main (void) { - - // - // Variablen definieren - // - int monat, jahr; - char *prompt; - - int istSchaltjahr = 0; // 0: kein Schaltjahr, sonst Schaltjahr - int tageProMonat = 0; // Ergebnis spaeter in dieser Variablen - - - // - // Monat und Jahr einlesen - // - - //printf("Monat: "); - //scanf("%d", &monat); - //printf("Jahr: "); - //scanf("%d", &jahr); - - prompt = "Monat: "; - monat = leseZahl(prompt, 1, 12); - prompt = "Jahr: "; - jahr = leseZahl(prompt, 1, 3000); - - // Ausgabe zum Test - // printf("Monat: %d, Jahr: %d \n", monat, jahr); - - - // - // Monate mit 30 und 31 Tagen behandeln - // - switch (monat) { - - case JAN: case MAR: case MAI: case JUL: case AUG: case OKT: case DEZ: - tageProMonat = 31; - break; - - case APR: case JUN: case SEP: case NOV: - tageProMonat = 30; - break; - - // - // Monat ist 2: Auf Schaltjahr ueberpruefen - // - case FEB: - if (jahr % 4 == 0 && (jahr % 100 != 0 || jahr % 400 == 0)) { - tageProMonat = 29; - } - else { - tageProMonat = 28; - } - break; - - // - // Anderer Monat: Fehler - // - default: - printf("Der Monat muss zwischen 1 und 12 sein.\n"); - return 1; - } - - // - // Ergebnis ausgeben - // - printf("Der Monat %d.%d hat %d Tage.\n", monat, jahr, tageProMonat); - - return 0; -} diff --git a/P03_Bit_Operation_struct_typedef/135oALYhkYyXB2aG0F-qrwA.jpeg b/P03_Bit_Operation_struct_typedef/135oALYhkYyXB2aG0F-qrwA.jpeg deleted file mode 100644 index afd7142..0000000 Binary files a/P03_Bit_Operation_struct_typedef/135oALYhkYyXB2aG0F-qrwA.jpeg and /dev/null differ diff --git a/P03_Bit_Operation_struct_typedef/README.md b/P03_Bit_Operation_struct_typedef/README.md deleted file mode 100644 index a005934..0000000 --- a/P03_Bit_Operation_struct_typedef/README.md +++ /dev/null @@ -1,193 +0,0 @@ -# 03 - Bit Operationen, Struct, Typedef - - -## 1. Bit Operationen - -![](./135oALYhkYyXB2aG0F-qrwA.jpeg) - - -Bit Operationen sind allgegenwärtig in den Computer-Wissenschaften und finden in vielen Disziplinen Anwendung. Folgend ein kleiner Auszug aus den wichtigsten Themen: -- **Bit Felder**: Sind die effizienteste Art, etwas darzustellen, dessen Zustand durch mehrere "wahr" oder "falsch" definiert werden kann. Besonders auf Systemen mit begrenzten Ressourcen sollte jede überflüssige Speicher-Allozierung vermieden werden. - - Beispiel: - ```c - // primary colors - #define BLUE 0b100 - #define GREEN 0b010 - #define RED 0b001 - - // mixed colors - #define BLACK 0 /* 000 */ - #define YELLOW (RED | GREEN) /* 011 */ - #define MAGENTA (RED | BLUE) /* 101 */ - #define CYAN (GREEN | BLUE) /* 110 */ - #define WHITE (RED | GREEN | BLUE) /* 111 */ - ``` -[https://de.wikipedia.org/wiki/Bitfeld](https://de.wikipedia.org/wiki/Bitfeld) - -- **Kommunikation**: - - **Prüfsummen/Paritätsbit**: Übertragungsfehler und Integrität können bis zu einem definiertem Grad erkannt werden. Je nach Komplexität der Berechnung können mehrere Fehler erkannt oder auch korrigiert werden. -[https://de.wikipedia.org/wiki/Parit%C3%A4tsbit](https://de.wikipedia.org/wiki/Parit%C3%A4tsbit), [https://de.wikipedia.org/wiki/Pr%C3%BCfsumme](https://de.wikipedia.org/wiki/Pr%C3%BCfsumme) - - **Stoppbit**: Markieren bei asynchronen seriellen Datenübertragungen das Ende bzw. Start eines definierten Blocks. -[https://de.wikipedia.org/wiki/Stoppbit](https://de.wikipedia.org/wiki/Stoppbit) - - **Datenflusssteuerung**: Unterschiedliche Verfahren, mit denen die Datenübertragung von Endgeräten an einem Datennetz, die nicht synchron arbeiten, so gesteuert wird, dass eine möglichst kontinuierliche Datenübermittlung ohne Verluste erfolgen kann. -[https://de.wikipedia.org/wiki/Datenflusssteuerung](https://de.wikipedia.org/wiki/Datenflusssteuerung) - - ... - -- **Datenkompression**: Bei der Datenkompression wird versucht, redundante Informationen zu entfernen. Dazu werden die Daten in eine Darstellung überführt, mit der sich alle – oder zumindest die meisten – Information in kürzerer Form darstellen lassen. -[https://de.wikipedia.org/wiki/Datenkompression](https://de.wikipedia.org/wiki/Datenkompression) -- **Kryptographie**: Konzeption, Definition und Konstruktion von Informationssystemen, die widerstandsfähig gegen Manipulation und unbefugtes Lesen sind. [https://de.wikipedia.org/wiki/Verschl%C3%BCsselung](https://de.wikipedia.org/wiki/Verschl%C3%BCsselung) -- **Grafik-Programmierung**: XOR (oder ^) ist hier besonders interessant, weil eine zweite Eingabe derselben Eingabe die erste rückgängig macht (ein Beispiel dazu weiter unten: "Variablen tauschen, ohne Dritt-Variable -"). Ältere GUIs verwendeten dies für die Hervorhebung von Auswahlen und andere Überlagerungen, um kostspielige Neuzeichnungen zu vermeiden. Sie sind immer noch nützlich in langsamen Grafikprotokollen (z. B. Remote-Desktop). - -### 1.1 Übungen - -#### 1. Basis Operationen -Manipulationen von einzelnen Bits gehören zu den Basis Operationen und dienen als Grundlagen um weitere komplexere Konstrukte zu schaffen. Verfollständigen sie folgendes Beispiel mit den drei Basis Operationen: -```c -#include - -int main() { - unsigned int number; - unsigned int bit = 3; // bit at position 3 - - // Setting a bit - number = ...; // solution: number |= 1 << bit; - - // Clearing a bit - number = ...; // solution: number &= ~(1 << bit); - - // Toggling a bit - number = ...; // solution; number ^= 1 << bit; - - return EXIT_SUCCESS; -} -``` - -#### 2. Variablen tauschen (ohne Dritt-Variable) -Zwei Variablen zu vertauschen scheint ein einfach lösbares Problem zu sein. Eine offensichtliche Variante wäre mittels einer temporären Variablen: -```c -#include -#include - -int main(){ - int a = 3; - int b = 4; - printf("a: %d; b: %d\n", a, b); - - int temp = a; - a = b; - b = temp; - - printf("a: %d; b: %d\n", a, b); - return EXIT_SUCCESS; -} -``` - -Es gibt aber auch eine Variante, die ohne zusätzliche Variable auskommt. Dabei wird die Tatsache, dass eine zweite XOR Operation eine erste XOR Operation rückgängig macht: - -*0011 XOR 0100 = 0111* - -*0111 XOR 0100 = 0011* - -Somit kommt man von einem XOR Resultat (*0111*) wieder auf beide Anfangs Operanden zurück indem man einfach ein zweites Mal mit einem Operanden eine XOR Verknüpfung macht. Damit kann ein Operand als Zwischenspeicher dienen und man muss nicht extra eine Zusatzvariable verwenden. - -Überlegen sie sich wie sie damit zwei Variablen vertauschen können ohne Zusatzvariable: -```c -#include -#include - -int main(){ - int a = 3; - int b = 4; - printf("a: %d; b: %d\n", a, b); - - - ... - - /* Solutions: - // a == 0011; b == 0100 - a ^= b; // a == 0111; b == 0100 - b ^= a; // a == 0111; b == 0011 - a ^= b; // a == 0100; b == 0011 - */ - - printf("a: %d; b: %d\n", a, b); - return EXIT_SUCCESS; -} -``` - -#### 3. Lower- / Uppercase -```c -#include -#include - -int main(){ - char word[8] = "sREedEv"; - char *wordptr = &word[0]; - - while(wordptr < &word[7]) { - printf("UPPERCASE: %c\n", *wordptr & '_'); // converts the char into uppercase regardless of the current casing - printf("LOWERCASE: %c\n", *wordptr | ' '); // converts the char into lowercase regardless of the current casing - wordptr++; - } - - return EXIT_SUCCESS; -} -``` - -#### 4. Prüfen auf 2-er Potenz -```c -#include -#include - -int main(){ - int a=32; - if(a > 0 && (a & (a - 1)) == 0){ - printf("%d is a power of 2", a); - } - return EXIT_SUCCESS; -} -``` -___ -## 2. Struct & typedef - -### 2.1 Übungen - -#### 1. Bit Operationen Rechner - - Bitweise Operationen mit 2 Operanden - - Rechnung wird als ein String über scanf dem Programm übergeben - - String wird in Token zerstückelt und in struct gespeichert: - ```c - typedef struct { - unsigned int operand_1; - unsigned int operand_2; - char operation; - } Expression; - ``` - - Ausgabe in 3 verschiedenen Formaten: - ``` - Bin: - 0000'0000'0000'0001 - & 0000'0000'0000'0011 - ------------------- - 0000'0000'0000'0001 - - Hex - 0x01 & 0x03 = 0x01 - - Dec - 1 & 3 = 1 - ``` - -___ -## 4. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden können. -| Aufgabe | Kriterium | Gewicht | -| :-- | :-- | :-- | -| alle | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| gibIntWert | Eingabe, Bereichsüberprüfung korrekt | 1 | -| istSchaltjahr | Funktion korrekt | 1 | -| TageProMonat | Funktion korrekt | 1 | -| Aufgabe 2 | Fehlenden Teile ergänzt und lauffähig | 1 | diff --git a/P04_Aufgabenstellung.png b/P04_Aufgabenstellung.png deleted file mode 100644 index b694a31..0000000 Binary files a/P04_Aufgabenstellung.png and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.docx b/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.docx deleted file mode 100644 index 1e9048b..0000000 Binary files a/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.docx and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.pdf b/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.pdf deleted file mode 100644 index 61c2206..0000000 Binary files a/P04_Modularisieren_von_C_Code/P04_Modularisieren_von_C_Code.pdf and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/README.md b/P04_Modularisieren_von_C_Code/README.md deleted file mode 100644 index e135a32..0000000 --- a/P04_Modularisieren_von_C_Code/README.md +++ /dev/null @@ -1,532 +0,0 @@ -# 04 - Modularisieren von C Code - -```{eval-rst} -.. figure:: zhaw_neg_P2945.jpg - :width: 100px - :name: logo - :align: right -``` - -___ - -```{eval-rst} -.. figure:: modularisieren_von_c_code.JPG - :width: 500px - :name: logo - :align: center -``` - - -___ - -## Inhalt - -{ref}`04_introduction` - -{ref}`04_learning_objectives` - -{ref}`04_task_01` - -{ref}`04_task_02` - -{ref}`04_grading` - -{ref}`04_appendix` - -___ - -(04_introduction)= -## 1. Übersicht - -In diesem Praktikum üben Sie modulare Programmierung indem Sie ein -Java Programm (bestehend aus drei Java Files) in ein entsprechendes C -Programm aus drei Modulen (aus je einem Header- und Implementations- -File) übersetzen. Sie passen das Makefile so an, dass die -entsprechenden Module mit kompiliert werden. - -In der zweiten Aufgabe erstellen Sie Makefile Regeln für die drei -Schritte von den C Source Files zur graphischen Darstellung der -Abhängigkeiten. - -```{eval-rst} -.. figure:: uebersicht.png - :width: 500px - :name: uebersicht - :align: center -``` - - -Im Anhang ist eine Übersicht über die verwendeten File Formate gegeben. - - -(04_learning_objectives)= -## 2. Lernziele - -In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen. - -* Sie wissen, dass ein Modul aus einem C-File und einem passenden - H-File besteht. -* Sie können Header Files korrekt strukturieren. -* Sie deklarieren im Header-File die öffentlichen Typen und Funktionen - eines Moduls. -* Sie wissen wie **Include Guards** anzuwenden sind. -* Sie können Module im `Makefile` zur Kompilation hinzufügen. -* Sie können `Makefile` Regeln schreiben. - -Die Bewertung dieses Praktikums ist am Ende angegeben. - -Erweitern Sie die vorgegebenen Code Gerüste, welche im `git` -Repository `snp-lab-code` verfügbar sind. - - -(04_task_01)= -## 3. Aufgabe 1: Modularisieren -Das zu ergänzende Programm dep2dot hat folgende Funktionalität: - -Ergänzen Sie in **`modularize/src`** den Code in **`triangle.c`**, -**`read.h`**, **`read.c`**, **`rectang.h`** und **`rectang.c`** so -dass die Tests erfolgreich durchlaufen. Die C Implementation soll -dieselbe Funktionalität haben wie die gegebenen Java Files. Lehnen Sie -sich so nahe wie möglich an die Java Files an. - -1. In den Header-Files implementieren Sie den Include-Guard und - deklarieren Sie die öffentlichen Funktionen und gegebenenfalls - **`#define`**. -2. In den Implementations-Files implementieren Sie die Funktionen. - -Die drei Java Files liegen in **`modularize/java`**. - -### Tipps - -* Implementieren Sie die Symbole welche vollständig in Grossbuchstaben - geschrieben sind als **`#define`**. -* **`EOF`** kommt schon aus **`stdio.h`** und sollte deshalb nicht - mehr definiert werden. -* Jene **`#define`** welche von andern Modulen verwendet werden - kommen ins Header-File, die andern ins Implementations-File. -* Ein Grossteil des Java Codes aus den Methoden Bodies kann - eins-zu-eins in C übernommen werden. Listen Sie auf welche - Unterschiede es gibt: - - - - - - - - - - - - - - - - - - -
JavaC
- -```Java -byte -``` - -
- -```Java -boolean -``` - -
- - -```Java -true -``` -
- -```Java -false -``` - -
- -```Java -System.out.print(…) -``` - -
- -```Java -System.out.println(…) -``` - -
- -```Java -System.in.read() -``` - - -
- -```Java -byte[] buffer = new byte[BUFFERSIZE]; -``` - -
- -```Java -public class rectang { - public boolean Rectangular(…) - { … } -} -``` - -
- -```Java -public class read { - public int getInt(...) - throws java.io.IOException - { ... } -} -``` - -
- -```Java -class triangle { - public static void main(String[] args) - throws java.io.IOException - { ... } -} -``` - -
- -```Java -read ReadInt = new read(); -... -word = ReadInt.getInt(MAX_NUMBER); -``` - -
- -```Java -rectang Rect = new rectang(); -... -if (Rect.Rectangular(a, b, c) == true) { ... } -``` - -
- -``` -System.out.println( -"-> Dreieck " + a + "-" + b + "-" + c -+ " ist rechtwinklig"); -``` - -
- -(04_task_02)= -## 4. Aufgabe 2: Makefile Regeln - -Die folgenden drei Schritte erstellen von einem C Source File eine -graphische Darstellung der Abhängigkeiten: - -1. `gcc ... -H .. file.c ... 2> file.dep` (Regeln im Makefile bereits vorhanden) -2. `dep2dot file.c file.dot` (in dieser Aufgabe zu erstellen) -3. `dot -Tpng file.dot >file.png` (in dieser Aufgabe zu erstellen) - -Sie sollen für die Compiler-ähnlichen Programme `dep2dot` und `dot` -Makefile Regeln schreiben. - -```{eval-rst} -.. figure:: uebersicht.png - :width: 500px - :name: uebersicht - :align: center -``` - - -Das Programm `dep2dot` hat folgende Funktionalität: - - -1. Es liest von `stdin` die vom Compiler generierten - Abhängigkeits-Daten in Form des `dep` Formates ein. -2. Das erste und einzige Command Line Argument gibt das File an für - welches die von `stdin` gelesenen Abhängigkeiten gelten. -3. Auf `stdout` werden die Abhängigkeiten von `stdin` übersetzt als - `dot`-File Format ausgegeben. - -Das Programm `dot` hat folgende Funktionalität: -1. Es liest die textuelle Beschreibung eines Graphen aus der - übergebenen Datei (erstes Argument) ein. -2. Auf `stdout` wird die grafische Darstellung der Beschreibung der - Eingabe-Datei im `png`-File Format ausgegeben. - -Das `dep`-Format und das `dot`-Format sind im Anhang beschrieben. - -Sie können die Funktionalität des Programms `dep2dot` kennen lernen, -indem Sie folgende Zeilen auf der Bash Shell ausführen. Das -`dep.input` File ist Teil der automatisierten Test Suite im -Verzeichnis `tests`: - - -```bash -bin/dep2dot dir/file dep.dot -dot -Tpng dep.dot >dep.png -firefox dep.png -``` - -Als Resultat sollte Firefox folgende Graphik darstellen: - - -```{eval-rst} -.. figure:: dep_dot.png - :width: 150px - :name: dep_dot - :align: center -``` - - - -Definieren Sie im `Makefile` Regeln, welche die einzelnen Schritte von -den Source Files zu den `png` Files ausführen. - - -Prüfen Sie schliesslich die Umsetzung Aufgabe mittels `make dep-clean -dep && firefox src/*.png.` - - -### 4.1 Neue Regeln hinzufügen - - -Führen Sie im `Makefile` an den angegebenen Stellen folgende -Ergänzungen durch - -* definieren Sie eine Variable `DEPFILES` deren Inhalt die Liste alle - Einträge der Variable `SOURCES` ist, wobei bei allen die Endung `.c` - durch die Endung `.c.png` ersetzt ist -* fügen Sie zum `Pseudo-Target .PHONEY` das Target `dep` dazu – dies - besagt, dass das später folgenden Target `dep` nicht ein File - repräsentiert (ohne dieses Setting würde make gegebenenfalls nach - einem File mit Namen `dep` suchen um zu entscheiden ob es - inkrementell gebildet werden muss) -* schreiben Sie das Target `dep` gemäss der Beschreibung im Makefile -* schreiben Sie die Suffix Regel für die Übersetzung von `.png <- - .dot` gemäss Vorgabe im `Makefile` (als Inspiration, siehe auch die - `%.c.dep: %.c` Suffix Regel weiter unten im `Makefile`) – erklären - Sie was die Regel macht -* schreiben Sie die Suffix Regel für die Übersetzung von` .dot <- - .dep` gemäss Vorgabe im `Makefile` – erklären Sie was die Regel - macht - -Die Umsetzung der obigen Änderungen sind erfolgreich, wenn Sie -folgende Shell Command Line erfolgreich ausführen können und in -Firefox die Abhängigkeiten der C-Files von den Inclu-de Files -dargestellt wird. - -`make dep-clean dep && firefox src/*.png.` - - - - -(04_grading)= -## 5. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| 1 | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| 1 | Module einbinden, Header Files schreiben | 2 | -| 2 | Sie können das funktionierende Makefile demonstrieren und erklären. | | -| 2 | Neue Regeln hinzufügen | 2 | - - - - -(04_appendix)= -## 6. Anhang - - - - -### 6.1 Verwendete zusätzliche Sprach Elemente - - - -
- -**Sprach Element** - - - -**Beschreibung** - -
- - - -```C -fprintf(stderr, "v=%d", v) -``` - - - -Formatierte Ausgabe auf den Standard Error Stream. Siehe ***man 3 -stderr*** und ***man 3 fprintf***. - -
- - -### 6.2 Verarbeitung und verwendete File Formate - -Das Programm in diesem Praktikum ist Teil für die graphische -Darstellung von `#include` File Abhängigkeit von C Files. - -Den ersten Schritt für die Darstellung der `#include` File -Abhängigkeiten bietet der Compiler. Der Compiler kann mittels der `-H` -Command Line Option auf `stderr` ein Text File generieren, welches die -tatsächlich verwendeten Header Files auflistet. Zusätzlich wird im -Resultat die Verschachtelungstiefe der Includes angegeben. - -Im zweiten Schritt übersetzt das Programm (`dep2dot`) dieses -Praktikums solche Dependency Files (`dep`) in eine Text Repräsentation -der Abhängigkeiten (`dot`) welche in graphische Darstel-lung (`png`) -übersetzt werden kann. - -Als Tool zur Übersetzung der `dot` Files in das `png` Format dient das -`dot` Tool. Dieses Tool muss gegebenenfalls installiert werden: - -```sudo apt install graphviz``` - -Die `png` Files können dann z.B. in der Programm Dokumentation -integriert werden (Darstellung zu Test Zwecken z.B. mittels `firefox -file.png`). - - -#### 6.2.1 dep File - - -Siehe: `man gcc` - -```bash --H Print the name of each header file used, in addition to other - normal activities. Each name is indented to show how deep in the - #include stack it is. [...] -``` - -Das File wird auf `stderr` ausgegeben. - -**Beispiel File** (für Abhängigkeiten des `main.c` Files des `dep2dot` Programms) - -```bash -. /usr/include/stdio.h -.. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h -... /usr/include/features.h -.... /usr/include/x86_64-linux-gnu/sys/cdefs.h -..... /usr/include/x86_64-linux-gnu/bits/wordsize.h -..... /usr/include/x86_64-linux-gnu/bits/long-double.h -.... /usr/include/x86_64-linux-gnu/gnu/stubs.h -..... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h -.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h -.. /usr/include/x86_64-linux-gnu/bits/types.h -... /usr/include/x86_64-linux-gnu/bits/wordsize.h -... /usr/include/x86_64-linux-gnu/bits/typesizes.h -.. /usr/include/x86_64-linux-gnu/bits/types/__FILE.h -.. /usr/include/x86_64-linux-gnu/bits/types/FILE.h -.. /usr/include/x86_64-linux-gnu/bits/libio.h -... /usr/include/x86_64-linux-gnu/bits/_G_config.h -.... /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h -.... /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h -... /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h -.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h -.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h -. /usr/include/stdlib.h -.. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h -.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h -.. /usr/include/x86_64-linux-gnu/bits/floatn.h -... /usr/include/x86_64-linux-gnu/bits/floatn-common.h -.... /usr/include/x86_64-linux-gnu/bits/long-double.h -.. /usr/include/x86_64-linux-gnu/bits/stdlib-float.h -. src/error.h -.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h -. src/data.h -.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h -. src/output.h -Multiple include guards may be useful for: -/usr/include/x86_64-linux-gnu/bits/stdlib-float.h -/usr/include/x86_64-linux-gnu/bits/sys_errlist.h -/usr/include/x86_64-linux-gnu/bits/typesizes.h -/usr/include/x86_64-linux-gnu/gnu/stubs-64.h -/usr/include/x86_64-linux-gnu/gnu/stubs.h -``` - - -#### 6.2.2 dot File - -**Graphviz** ist ein mächtiges Tool-Set welches Graphen, definiert in -einem `dot`-Text File, automatisch anordnet und in `png`, `gif` und -andere Formate übersetzt. - -Siehe die offizielle Web-Page -[https://www.graphviz.org/](https://www.graphviz.org/). - -Es gibt als Teil dieses Tool-Sets verschiedene Übersetzer. Der hier -verwendete ist der Basis-übersetzer: `dot`. - -Das `dot`-File Format kennt viele Möglichkeiten die Knoten und Kanten -eines Graphen und de-ren Anordnung anzugeben. - -Der Vorteil eines solchen Tool-Sets ist, dass man den Inhalt (den -Graphen) einfach definieren kann und sich nicht um das komplexe -Problem der ansprechenden Visualisierung kümmern muss. - -**Beispiel File** (`dot -Tpng sample.dot > sample.png`) - -```C -digraph G { - node [shape=box] - A [label="a.c"]; - B [label="a.h"]; - C [label="b.h"]; - - subgraph cluster_c0 { - label="main"; color=black; - A; - } - - subgraph cluster_c1 { - label="others"; style=filled; col-or=lightgrey; - { B; C; rank=same; } - } - - A -> B; - A -> C; - B -> C; -} -``` - - -#### 6.2.3 png File - -Das `png` Format ist ein verlustfrei komprimiertes Raster Graphik -Format. Es wird oft in Web Pages verwendet. - - -___ -Version: 15.02.2022 \ No newline at end of file diff --git a/P04_Modularisieren_von_C_Code/bsp_dot.png b/P04_Modularisieren_von_C_Code/bsp_dot.png deleted file mode 100644 index 9435a0c..0000000 Binary files a/P04_Modularisieren_von_C_Code/bsp_dot.png and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/dep_dot.png b/P04_Modularisieren_von_C_Code/dep_dot.png deleted file mode 100644 index 7cdd91a..0000000 Binary files a/P04_Modularisieren_von_C_Code/dep_dot.png and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/modularisieren_von_c_code.JPG b/P04_Modularisieren_von_C_Code/modularisieren_von_c_code.JPG deleted file mode 100644 index 44e8067..0000000 Binary files a/P04_Modularisieren_von_C_Code/modularisieren_von_c_code.JPG and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.drawio b/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.drawio deleted file mode 100644 index a789857..0000000 --- a/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.drawio +++ /dev/null @@ -1 +0,0 @@ -7VnRcuIgFP2aPLoTiIn6WLXd7sx2ptPuTrf7RhM0TDG4BGvs1y9RYgLoGjPqVLtPkgtc4Jx74IKON5hkXzmaxncswtSBbpQ53tCBEAReR/7kloWyuK67sow5iZStNDySd1w0VNYZiXCqNRSMUUGmujFkSYJDodkQ52yuNxsxqo86RWNsGR5DRG3rE4lErKwg6JUVt5iMYzV0F6oVT1DRWK0kjVHE5hWTd+14A86YWJUm2QDTHL0Cl1W/my2164lxnIg6He5GrYenJLv986310P99tfj56oKW8vKG6EwtWE1WLAoEcBJd5UDKr5CiNCXhj5gkjtePxYRKI5BFzmZJhPOBXPkle9wQWtStHOLIwrmcOFjDIQMJswkWfCGbzEvAfQViXIG6sHFMkSBvunukeB+v3a1HuGdEDgxdFaR+EWoqRNtdV3eRshkPsepVBdhw1G3vcCQQH2NhOZKFyrJL05K/PbiE/7n0oUFBryGXpiMAT8ultxeXCUvwv0j86LQFro62Z6Jdl7ZOoDuC7dPSVmwlFd6oTZzk4Tt6kSelRhmiZJzkwpScYC4Nb5gLIk+iK1UxIVGU++hznJJ39LL0l9M7zZezXKDfd/zhmvDcAc40TtQxqTqXh1M1FLYHpB0fyrv7BcBuT4f+IJHR0p0WuigcsNEoxUdhst1EgBFK46XowDmr0RTR2aqxY3EYX4YY2zvEGLQ7UNcNOEhkGAoPTiVG//OK0TwaG2c0O8/YI4sxsDh8+QAkrq+lqx5ntsE25bR0dHztdj+vdk2eG2t3Z8AcWbu9z8vhwa4m5jPDqTkE9lPPPbBolCmK0OlKBWeveMAo4yW3I0KpYaqfMc1jIvDjFIX5mHOOpluCYkPGVCMsCri7vgY37NlbPNwQNp67PUI0SvbGH9r42zK6GPyt3H/DEXta/Bs9qdTbxHBGxK9K+Vm1ysvDrFIxXOy57cnpLfeXnYH1UVIb36DdvPI13S7r3h1PmdoA+16SXa6ireftoJ6iTeIOp2g7LVlcLvymIIBbD34zzagBv/ws/5ZaiaX8d8+7/gs= \ No newline at end of file diff --git a/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.png b/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.png deleted file mode 100644 index b694a31..0000000 Binary files a/P04_Modularisieren_von_C_Code/new_P04/P04_Aufgabenstellung.png and /dev/null differ diff --git a/P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code.md b/P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code.md deleted file mode 100644 index b78d962..0000000 --- a/P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code.md +++ /dev/null @@ -1,127 +0,0 @@ -# 04 - Modularisieren von C Code - -___ -## 1. Übersicht - -In diesem Praktikum wird eine kleine Sammlung von Funktionen als Modul erstellt. - -In der ersten Aufgabe schreiben Sie zu einem bestehenden C Programm die notwendigen Header Files plus passen das Makefile so an, dass die entsprechenden Module mit kompiliert werden. - -In der zweiten Aufgabe erstellen Sie Makefile Regeln um aus Konfigurationsdateien graphischen Darstellungen zu erzeugen. - -___ -## 2. Lernziele - -In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen. - -- Sie wissen, dass ein Modul aus einem C-File und einem passenden H-File bestehen. -- Sie können Header Files korrekt strukturieren. -- Sie wissen wie **Include Guards** anzuwenden sind. -- Sie können Module im **Makefile** zur Kompilation hinzufügen. -- Sie können anhand einer Beschreibung Typen und Funktionen in den passenden Header Files deklarieren. -- Sie können **Makefile** Regeln schreiben. - -Die Bewertung dieses Praktikums ist am Ende angegeben. - -Erweitern Sie die vorgegebenen Code Gerüste, welche im **git** Repository **snp-lab-code** verfügbar sind. - -___ -## 3. Aufgabe 1: Modularisieren - -![](./P04_Aufgabenstellung.png) - -### 3.1 Teilaufgabe Modules einbinden, Header Files schreiben - -- src/objects.h - - 2 Datenstukturen definieren - - `struct point` mit 2 double für x und y Koordinate - - `struct line` mit 2 point -- src/functions.h und .c - - 2 Funktionen deklarieren und definieren - - Berechnung der Länge `get_length`einer Linie (Annahme: Koordinaten sind alle positiv) - - l = sqrt(h^ 2 + b^ 2) - - ev. muss hier in den Anhang `#include ` - - Berechnung der Steigung `get_slope` der Linie gegenüber dem Koordinatensystem - - m = h / b -- tests vorgeben - -- src/objects.h - - Include Guard - - Includes - - Struct für Punkt und Linie - - Include Guard -- src/functions.h - - Include Guard - - Includes - - Deklarationen der Funktionen für Berechnung der Länge und Steigung - - Include Guard -- src/functions.c - - Includes - - Definitionen der Funktionen für Berechnung der Länge und Steigung - - Include Guard - - - - - -___ -## 4. Aufgabe 2: Makefile Regeln - -Makefile ergänzen, damit Modul `functions` korrekt eingebunden und kompiliert wird. - -1. Kompilieren Sie das ganze mittels **make clean default**. Es sollten keine Compiler Fehler auftreten. - -### 4.1 Neue Regeln hinzufügen - -- Vorraussetzung: tab2svg.sh aus Praktikum 3 wird um die Möglichkeit erweitert eine Linie zu zeichnen (`line:x1:y1:x2:y2:color`) -- Studierende erstellen - - mind. 2 Files `long.line` und `short.line` mit 2 unterschiedlichen Linien - - Makefile Regeln um aus einem File `.line` ein File `.svg` mit Hilfe des Scripts zu erstellen - - PHONY Regel `display` um beide `.svg` mit Firefox darzustellen - - Vorgabe: sie sollen eine Variable für die Input-Dateien nutzen - -Nachdem das Programm in Aufgabe 1 umgesetzt ist, geht es nun darum, im **Makefile** Regeln zu definieren welche die einzelnen Schritte von den Source Files zu den **png** Files ausführen. - -Prüfen Sie schliesslich die Umsetzung mittels `make display`. - -___ -## 5. Aufgabe 3 -- Studierende sollen Ausgabe von `make doc` analysieren und die Include Diagramme erklären können -``` -make doc -firefox doc/index.html & -``` - -___ -## 6. Bewertung - - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -___ -## 7. Erweiterung Doxyfile für Abhängigkeitsanalyse - -``` ---- /home/vagrant/huno/snp-new/snp/praktika/Shared/work/Doxyfile 2022-02-07 21:16:42.343302707 +0100 -+++ /home/vagrant/snp/Doxyfile 2022-02-07 22:22:36.266839126 +0100 -@@ -297,14 +297,14 @@ - UML_LOOK = NO - UML_LIMIT_NUM_FIELDS = 10 - TEMPLATE_RELATIONS = NO --INCLUDE_GRAPH = NO --INCLUDED_BY_GRAPH = NO -+INCLUDE_GRAPH = YES -+INCLUDED_BY_GRAPH = YES - CALL_GRAPH = NO - CALLER_GRAPH = NO --GRAPHICAL_HIERARCHY = NO --DIRECTORY_GRAPH = NO -+GRAPHICAL_HIERARCHY = YES -+DIRECTORY_GRAPH = YES - DOT_IMAGE_FORMAT = png --INTERACTIVE_SVG = NO -+INTERACTIVE_SVG = YES - DOT_PATH = - DOTFILE_DIRS = - MSCFILE_DIRS = -``` diff --git a/P04_Modularisieren_von_C_Code/uebersicht.png b/P04_Modularisieren_von_C_Code/uebersicht.png deleted file mode 100644 index cdb4272..0000000 Binary files a/P04_Modularisieren_von_C_Code/uebersicht.png and /dev/null differ diff --git a/P05_TicTacToe/Control.png b/P05_TicTacToe/Control.png deleted file mode 100644 index 6708944..0000000 Binary files a/P05_TicTacToe/Control.png and /dev/null differ diff --git a/P05_TicTacToe/Control.svg b/P05_TicTacToe/Control.svg deleted file mode 100644 index d710376..0000000 --- a/P05_TicTacToe/Control.svg +++ /dev/null @@ -1,32 +0,0 @@ - - -Control diff --git a/P05_TicTacToe/Deklarationen.docx b/P05_TicTacToe/Deklarationen.docx deleted file mode 100644 index bdcaeaa..0000000 Binary files a/P05_TicTacToe/Deklarationen.docx and /dev/null differ diff --git a/P05_TicTacToe/Deklarationen.pdf b/P05_TicTacToe/Deklarationen.pdf deleted file mode 100644 index fa4e471..0000000 Binary files a/P05_TicTacToe/Deklarationen.pdf and /dev/null differ diff --git a/P05_TicTacToe/Deklarationen_Lsg.docx b/P05_TicTacToe/Deklarationen_Lsg.docx deleted file mode 100644 index 8f36acd..0000000 Binary files a/P05_TicTacToe/Deklarationen_Lsg.docx and /dev/null differ diff --git a/P05_TicTacToe/Deklarationen_Lsg.pdf b/P05_TicTacToe/Deklarationen_Lsg.pdf deleted file mode 100644 index c640162..0000000 Binary files a/P05_TicTacToe/Deklarationen_Lsg.pdf and /dev/null differ diff --git a/P05_TicTacToe/MVC.png b/P05_TicTacToe/MVC.png deleted file mode 100644 index 7527534..0000000 Binary files a/P05_TicTacToe/MVC.png and /dev/null differ diff --git a/P05_TicTacToe/MVC.svg b/P05_TicTacToe/MVC.svg deleted file mode 100644 index c75342f..0000000 --- a/P05_TicTacToe/MVC.svg +++ /dev/null @@ -1,52 +0,0 @@ - - -ModelControlView diff --git a/P05_TicTacToe/MVC_Pattern.uxf b/P05_TicTacToe/MVC_Pattern.uxf deleted file mode 100644 index cea1d9f..0000000 --- a/P05_TicTacToe/MVC_Pattern.uxf +++ /dev/null @@ -1,109 +0,0 @@ - - - 10 - - UMLClass - - 180 - 310 - 120 - 50 - - View -fontsize=30 - - - - UMLClass - - 180 - 390 - 120 - 50 - - Control -fontsize=30 - - - - UMLClass - - 180 - 470 - 120 - 50 - - Model -fontsize=30 - - - - Relation - - 230 - 430 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 230 - 350 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Text - - 320 - 320 - 210 - 40 - - //Text Element -View kennt Control, -Control aber nicht View - - - - - Text - - 320 - 400 - 210 - 40 - - //Text Element -Control kennt Model, -Model aber nicht Control. - - - - - - Text - - 320 - 480 - 250 - 40 - - //Text Element -Das Main Programm kombiniert die -Komponenten nach obigen Vorgaben -und startet die Abarbeitung von Eingaben -über die View. - - - - - - diff --git a/P05_TicTacToe/MVC_pattern.png b/P05_TicTacToe/MVC_pattern.png deleted file mode 100644 index 408a4b6..0000000 Binary files a/P05_TicTacToe/MVC_pattern.png and /dev/null differ diff --git a/P05_TicTacToe/MVC_pattern.svg b/P05_TicTacToe/MVC_pattern.svg deleted file mode 100644 index 152be7f..0000000 --- a/P05_TicTacToe/MVC_pattern.svg +++ /dev/null @@ -1,80 +0,0 @@ - - -Das Main Programm kombiniert dieKomponenten nach obigen Vorgabenund startet die Abarbeitung von Eingabenüber die View.Control kennt Model,Model aber nicht Control.View kennt Control,Control aber nicht ViewModelControlView diff --git a/P05_TicTacToe/Model.png b/P05_TicTacToe/Model.png deleted file mode 100644 index 93e4a97..0000000 Binary files a/P05_TicTacToe/Model.png and /dev/null differ diff --git a/P05_TicTacToe/Model.svg b/P05_TicTacToe/Model.svg deleted file mode 100644 index 8e3308b..0000000 --- a/P05_TicTacToe/Model.svg +++ /dev/null @@ -1,25 +0,0 @@ - - -Model diff --git a/P05_TicTacToe/P05_TicTacToe.docx b/P05_TicTacToe/P05_TicTacToe.docx deleted file mode 100644 index bb1af1d..0000000 Binary files a/P05_TicTacToe/P05_TicTacToe.docx and /dev/null differ diff --git a/P05_TicTacToe/P05_TicTacToe.pdf b/P05_TicTacToe/P05_TicTacToe.pdf deleted file mode 100644 index 915276f..0000000 Binary files a/P05_TicTacToe/P05_TicTacToe.pdf and /dev/null differ diff --git a/P05_TicTacToe/P05_TicTacToe.rst b/P05_TicTacToe/P05_TicTacToe.rst deleted file mode 100644 index 58512e9..0000000 --- a/P05_TicTacToe/P05_TicTacToe.rst +++ /dev/null @@ -1,272 +0,0 @@ -05 - SNP: TicTacToe -############## - - - -.. image:: zhaw_neg_P2945.jpg - :width: 100px - :height: 100px - :scale: 25 % - :align: right - -.. contents:: - - - -Übersicht -********* -In diesem Praktikum erweitern Sie einen Programm Rahmen zu einem funktionierenden TicTacToe Spiel. Bei TicTacToe legen zwei Spieler abwechselnd auf einem 3x3 Brett einen Stein, bis ein Spieler mit einer horizontalen, vertikalen oder diagonalen Linie gewinnt, oder alle Felder besetzt sind. - -.. image:: TicTacToe.svg - -In der Aufgabe implementieren Sie die fehlenden Funktionen bis alle Tests erfolgreich durchlau-fen. Die gewählte Vorgehensweise ist somit TDD – Test-Driven-Development: es existieren zuerst Tests welche alle fehlschlagen. Schrittweise werden die Funktionen implementiert bis alle Tests erfolgreich durchlaufen. - -Wenn die Tests erfolgreich durchlaufen, wird auch das Programm funktionieren und Sie können jemanden mit dem Spiel herausfordern 😉. - - - -Lernziele -********* -In diesem Praktikum lernen Sie den Zugriff auf Arrays. - - * Sie können anhand einer Beschreibung im Code die fehlenden Funktionen implementieren wo auf Arrays zugegriffen wird. - -Die Bewertung dieses Praktikums ist am Ende angegeben. - -Erweitern Sie die vorgegebenen Code Gerüste, welche im git Repository snp-lab-code verfügbar sind. - - -Aufgabe: TicTacToe -****************** -Das zu ergänzende Programm tic-tac-toe hat folgende Funktionalität: -#. es stellt ein 3x3 TicTacToe Spielbrett auf dem Terminal dar -#. es liest von stdin eine Ziffer 0…9 ein, wobei 0 für Programm-Terminieren, die übrigen Ziffern für die Wahl eines Feldes stehen -#. der erste Spielzug wird von Spieler A geführt, danach wechselt das Programm zwischen den Spielern A und B -# bei Gewinn oder bei vollem Brett ist das Spiel vorbei - -Wenn die Aufgabe erfolgreich umgesetzt ist, können Sie das Spiel ausführen: -```bash -bin/tic-tac-toe -``` - -Als Abnahme müssen die Tests unverändert ohne Fehler ausgeführt werden (``make test``). - -Die Architektur des Programms folgt dem MVC – Model-View-Control Paradigma. Dieses Paradigma besagt, dass die View (Eingabe und Darstellung) über Control (Vermittler) das Modell (die eigentliche Programm-Logik) steuert und darstellt. Dabei sind folgende Abhängigkeiten gegeben: - -.. image:: MVC_pattern.svg - - - -Test-Driven-Development -======================= - -Das Programm besteht aus folgenden Files: - -.. list-table:: - - * - Datei - - ToDo - * - Makefile - - - - * - tests/tests.c - - - - * - src/main.c - - - - * - src/view.h - - - - * - src/view.c - - - - * - src/control.h - - - - * - src/control.c - - - - * - src/model.h - - - - * - src/model.c - - siehe unten - - -1. Führen Sie ``make test`` aus:: - - Suite: lab test - Test: test_model_init - init_model:... 0/0 FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_state ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_winner ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_can_move ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_move ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_win_line ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - - Run Summary: Type Total Ran Passed Failed Inactive - suites 1 1 n/a 0 0 - tests 6 6 0 6 0 - asserts 6 6 0 6 n/a - - - -2. Konzentrieren Sie sich auf den ersten Test der fehlschlägt. Dies ist ein Unit Test, welcher die Funktion **model_init()** prüft. Suchen Sie die Funktion in **src/model.h** und **src/model.c**. -Was ist die geforderte Funktionalität und wie ist sie implementiert? -Suchen Sie die darin aufgerufene **model_init()** Funktion und implementieren Sie diese. - -.. code-block:: c - - void model_init(model_t *instance) { - assert(instance); - // Instructions to the students: - // set all fields of the board to model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - // END-STUDENTS-TO-ADD-CODE } - - - - -3. Führen Sie ``make test`` und korrigieren Sie obige Funktion, bis der Test nicht mehr fehlschlägt. - - - -3.2 test_model_init -=================== - -Gehen Sie analog zur ersten Teilaufgabe vor: -1. Führen Sie ``make test`` aus. -2. Suchen Sie die Funktion **model_get_state()** in **model.h** und **model.c**. -3. Implementieren Sie die intern benutzte Funktion **get_state()** gemäss der Anleitung im Code. - -.. code-block:: c - - model_state_t model_get_state(model_t *instance, model_pos_t pos) - { - assert(instance); - assert_pos(pos); - - // Instructions to the students: - // replace the stub implementation my access to the field at the given position. - // BEGIN-STUDENTS-TO-ADD-CODE - - - return model_state_none; // stub - - - // END-STUDENTS-TO-ADD-CODE - } - -4. Führen Sie ``make test`` und korrigieren Sie, bis die beiden Tests nicht mehr fehlschlagen. - - - -3.3 test_model_get_state test_model_get_winner -============================================== - -Gehen Sie analog zur ersten Teilaufgabe vor: -1. Führen Sie ``make test`` aus. -2. Suchen Sie die Funktion **model_get_state()** in **model.h** und **model.c**. -3. Implementieren Sie die intern benutzte Funktion **get_state()** gemäss der Anleitung im Code. - -.. code-block:: c - - model_state_t model_get_state(model_t *instance, model_pos_t pos) - { - assert(instance); - assert_pos(pos); - - // Instructions to the students: - // replace the stub implementation my access to the field at the given position. - // BEGIN-STUDENTS-TO-ADD-CODE - - - return model_state_none; // stub - - - // END-STUDENTS-TO-ADD-CODE - } - - - - - -3.4 test_model_can_move -======================= - -Gehen Sie analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion **model_can_move()**. - -.. code-block:: c - - int model_can_move(model_t *instance){ - assert(instance); - if (model_get_winner(instance) == model_state_none) { - // Instructions to the students: - // scan all fields: return 1 with first field which equals model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - // END-STUDENTS-TO-ADD-CODE} - return 0;} - - - - -3.5 test_model_move test_model_get_win_line -=========================================== - -Schliesslich gehen Sie auch hier analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion **set_state()**. - -.. code-block:: c - - /** - * @brief Sets the field on the board to the given state. - * @param instance [INOUT] The instance which holds the state. - * @param pos [IN] The affected field. - * @param state [IN] The new state of the field. - */ - static void set_state(model_t *instance, model_pos_t pos, model_state_t state) - { - assert_pos(pos); - - // Instructions to the students: - // set the field of the board to the new state - // BEGIN-STUDENTS-TO-ADD-CODE - - // END-STUDENTS-TO-ADD-CODE - } - - - -Wenn die beiden obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch und das Spiel kann gespielt werden. - - -4. Bewertung -****************** - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -.. list-table:: - :header-rows: 0 - - * - Aufgabe - - Kriterium - - Gewicht - * - TicTacToe - - Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. - - - * - TicTacToe - - Teilaufgabe test_model_init - - 1 - * - TicTacToe - - Teilaufgabe test_model_get_state und test_model_get_winner - - 1 - * - TicTacToe - - Teilaufgabe test_model_can_move - - 1 - * - TicTacToe - - Teilaufgabe test_model_move und test_model_get_win_line - - 1 - - -Version: 15.02.2022 diff --git a/P05_TicTacToe/README.md b/P05_TicTacToe/README.md deleted file mode 100644 index 02d33cf..0000000 --- a/P05_TicTacToe/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# 05 - Arrays/Strings/TicTacToe -___ - -## 1. Übersicht - In diesem Praktikum werden Sie in der ersten Aufgabe ein Programm zum Einlesen, Sortieren und Ausgeben von Strings von Grund auf entwickeln. - - In der zweiten Aufgabe werden Sie einen Programmrahmen zu einem funktionierenden TicTacToe-Spiel erweitern. Sie implementieren hierbei die fehlenden Funktionen bis alle Tests erfolgreich durchlaufen. Die gewählte Vorgehensweise entspricht somit Test-Driven-Development (TDD). D.h. es existieren zuerst Tests, welche alle fehlschlagen. Schrittweise werden die Funktionen implementiert bis alle Tests erfolgreich durchlaufen. Wenn die Tests erfolgreich durchlaufen, wird auch das Programm funktionieren. - -___ - -## 2. Lernziele -In diesem Praktikum schreiben Sie selbst von Grund auf ein C-Programme, das mit Strings operiert. Ferner ergänzen Sie ein bestehendes und lernen dabei den Zugriff auf Arrays. - - * Sie können mit Arrays von Strings umgehen. - * Sie können String-Funktionen aus der Standard Library verwenden. - * Sie können anhand einer Beschreibung im Code die fehlenden Funktionen die auf Arrays zugreifen implementieren. - -___ - -## 3. Aufgabe 1: Sortieren von Strings -Schreiben Sie ein C-Programm, das bis zu 10 Wörter mit einer maximalen Länge von jeweils 20 char von der Tastatur einliest, diese in Grossbuchstaben umwandelt, in einem Array der Reihe nach ablegt und zum Schluss im Array alphabetisch sortiert und ausgibt. Wiederholt eingegebene Wörter sollen dabei ignoriert werden. Das Ende der Eingabe soll durch das Erreichen der zehn unterschiedlichen Wörter oder durch die Eingabe von „ZZZ“ erfolgen. Die Ausgabe der sortierten Wörter soll direkt nach Beendigung der Eingabe erfolgen. - -Hinweise: -- Zur Speicherung der Wörter sollten Sie ein zweidimensionales Array verwenden. -- Verwenden Sie die String-Funktionen der C Standard Library (include ), z.B. um Strings alphabetisch zu vergleichen. -- Wenn Sie aus anderen Vorlesungen bereits einen effizienten Sortieralgorithmus kennen, können Sie diesen natürlich verwenden. Sonst erfinden Sie einfach einen eigenen. -- Strukturieren Sie das Programm durch geeignete Funktionen. - -___ - -## 4. Aufgabe 2: TicTacToe -Das zu ergänzende Programm tic-tac-toe hat folgende Funktionalität: -1. es stellt ein 3x3 TicTacToe Spielbrett auf dem Terminal dar -2. es liest von stdin eine Ziffer 0…9 ein, wobei 0 für Programm-Terminieren, die übrigen Ziffern für die Wahl eines Feldes stehen -3. der erste Spielzug wird von Spieler A geführt, danach wechselt das Programm zwischen den Spielern A und B -4. bei Gewinn oder bei vollem Brett ist das Spiel vorbei - -Erweitern Sie die vorgegebenen Code Gerüste, welche im git Repository snp-lab-code verfügbar sind. - -Wenn die Aufgabe erfolgreich umgesetzt ist, können Sie das Spiel ausführen: -```bash -bin/tic-tac-toe -``` - - -![](./TicTacToe.png) - -Als Abnahme müssen die Tests unverändert ohne Fehler ausgeführt werden (`make test`). - -Die Architektur des Programms folgt dem MVC – Model-View-Control Paradigma. Dieses Paradigma besagt, dass die View (Eingabe und Darstellung) über Control (Vermittler) das Modell (die eigentliche Programm-Logik) steuert und darstellt. Dabei sind folgende Abhängigkeiten gegeben: - - -![](./MVC_pattern.png) -___ - -### 4.1 Teilaufgabe test_model_init -Das Programm besteht aus folgenden Files: -| Datei | ToDo | -| :-- | :-- | -|Makefile | -> gegeben, d.h. nichts anzupassen | -|tests/tests.c| -> gegeben, d.h. nichts anzupassen | -|src/main.c| -> gegeben, d.h. nichts anzupassen | -|src/view.h| -> gegeben, d.h. nichts anzupassen | -|src/view.c| -> gegeben, d.h. nichts anzupassen | -|src/control.h| -> gegeben, d.h. nichts anzupassen | -|src/control.c| -> gegeben, d.h. nichts anzupassen | -|src/model.h| -> gegeben, d.h. nichts anzupassen | -|src/model.c| -> **anzupassen:** umsetzen gemäss den Angaben unten | - -1. Führen Sie `make test` aus -```bash -Suite: lab test - Test: test_model_init ... - init_model:... 0/0 FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_state ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_winner ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_can_move ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_move ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - Test: test_model_get_win_line ...FAILED - 1. tests/tests.c:62 - CU_ASSERT_EQUAL_FATAL(instance->board[row][col],model_state_none) - -Run Summary: Type Total Ran Passed Failed Inactive - suites 1 1 n/a 0 0 - tests 6 6 0 6 0 - asserts 6 6 0 6 n/a - -``` -2. Konzentrieren Sie sich auf den ersten Test der fehlschlägt. Dies ist ein Unit Test, welcher die Funktion **model_init()** prüft. Suchen Sie die Funktion in **src/model.h** und **src/model.c**. -3. Was ist die geforderte Funktionalität und wie ist sie implementiert? - -Suchen Sie die darin aufgerufene **model_init()** Funktion und implementieren Sie diese. -```c -void model_init(model_t *instance) -{ - assert(instance); - - // Instructions to the students: - // set all fields of the board to model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - - - // END-STUDENTS-TO-ADD-CODE -} - -``` -3. Führen Sie `make test` und korrigieren Sie obige Funktion, bis der Test nicht mehr fehlschlägt. - -___ - -### 4.2 Teilaufgabe test_model_get_state und test_model_get_winner -Gehen Sie analog zur ersten Teilaufgabe vor: -1. Führen Sie `make test` aus. -2. Suchen Sie die Funktion **model_get_state()** in **model.h** und **model.c**. -3. Implementieren Sie die intern benutzte Funktion **get_state()** gemäss der Anleitung im Code. - -```c -model_state_t model_get_state(model_t *instance, model_pos_t pos) -{ - assert(instance); - assert_pos(pos); - - // Instructions to the students: - // replace the stub implementation my access to the field at the given position. - // BEGIN-STUDENTS-TO-ADD-CODE - - - return model_state_none; // stub - - - // END-STUDENTS-TO-ADD-CODE -} - - -``` -___ - -### 4.3 Teilaufgabe test_model_can_move -Gehen Sie analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion **model_can_move()**. -```c -int model_can_move(model_t *instance) -{ - assert(instance); - if (model_get_winner(instance) == model_state_none) { - // Instructions to the students: - // scan all fields: return 1 with first field which equals model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - - - // END-STUDENTS-TO-ADD-CODE - } - return 0; -} - -``` -___ - -### 4.4 Teilaufgabe test_model_move und test_model_get_win_line -Schliesslich gehen Sie auch hier analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion **set_state()**. -```c -/** - * @brief Sets the field on the board to the given state. - * @param instance [INOUT] The instance which holds the state. - * @param pos [IN] The affected field. - * @param state [IN] The new state of the field. - */ -static void set_state(model_t *instance, model_pos_t pos, model_state_t state) -{ - assert_pos(pos); - - // Instructions to the students: - // set the field of the board to the new state - // BEGIN-STUDENTS-TO-ADD-CODE - - - - - // END-STUDENTS-TO-ADD-CODE -} - -``` - -Wenn die beiden obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch und das Spiel kann gespielt werden. -___ - -## 5. Bewertung - -Der funktionierende Programmcode muss der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| Sortieren von Strings | Sie können das funktionierende Programm demonstrieren und erklären. | 2 | -| TicTacToe | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| TicTacToe | Teilaufgabe test_model_init | 0.5 | -| TicTacToe | Teilaufgabe test_model_get_state und test_model_get_winner | 0.5 | -| TicTacToe | Teilaufgabe test_model_can_move | 0.5 | -| TicTacToe | Teilaufgabe test_model_move und test_model_get_win_line | 0.5 | -___ -Version: 14.02.2022 diff --git a/P05_TicTacToe/TicTacToe.png b/P05_TicTacToe/TicTacToe.png deleted file mode 100644 index 728da54..0000000 Binary files a/P05_TicTacToe/TicTacToe.png and /dev/null differ diff --git a/P05_TicTacToe/TicTacToe.svg b/P05_TicTacToe/TicTacToe.svg deleted file mode 100644 index f6f4bef..0000000 --- a/P05_TicTacToe/TicTacToe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/P05_TicTacToe/View.png b/P05_TicTacToe/View.png deleted file mode 100644 index b940a8e..0000000 Binary files a/P05_TicTacToe/View.png and /dev/null differ diff --git a/P05_TicTacToe/View.svg b/P05_TicTacToe/View.svg deleted file mode 100644 index a1efaf3..0000000 --- a/P05_TicTacToe/View.svg +++ /dev/null @@ -1,32 +0,0 @@ - - -View diff --git a/P05_TicTacToe/work/tic-tac-toe/Makefile b/P05_TicTacToe/work/tic-tac-toe/Makefile deleted file mode 100644 index a29984f..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -SNP_SHARED_MAKEFILE := $(if $(SNP_SHARED_MAKEFILE),$(SNP_SHARED_MAKEFILE),"~/snp/shared.mk") - -TARGET := bin/tic-tac-toe -MODULES := src/model.c src/view.c src/control.c -SOURCES := src/main.c $(MODULES) -TSTSOURCES := tests/tests.c $(MODULES) - -include $(SNP_SHARED_MAKEFILE) - diff --git a/P05_TicTacToe/work/tic-tac-toe/mainpage.dox b/P05_TicTacToe/work/tic-tac-toe/mainpage.dox deleted file mode 100644 index b07e65d..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/mainpage.dox +++ /dev/null @@ -1,8 +0,0 @@ -/** - * @mainpage SNP - P05 Tic Tac Toe Game - * - * @section Purpose - * - * This is a lab on usage of arrays. - * - */ diff --git a/P05_TicTacToe/work/tic-tac-toe/src/control.c b/P05_TicTacToe/work/tic-tac-toe/src/control.c deleted file mode 100644 index ccae643..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/control.c +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @file - * @brief Implementation - */ -#include "control.h" -#include "model.h" -#include - -/** - * @brief Conversion from control field number (1...9) to 0-based model position (row, col). - * @param cell [IN] Field number (1...9). - * @return Returns the position of the field. - * @remark Asserts proper field range. - */ -static model_pos_t get_pos(size_t cell) -{ - assert(1 <= cell && cell <= 9); - model_pos_t pos = { (cell - 1) / 3, (cell - 1) % 3 }; - return pos; -} - -/** - * @brief Conversion from control player to model state. - * @param player [IN] Control player value to convert. - * @return Returns the matching model state. - * @remark No assertion is done - defaults to model_state_none. - */ -static model_state_t get_state(control_player_t player) -{ - switch(player) { - case control_player_a: return model_state_a; - case control_player_b: return model_state_b; - default: return model_state_none; - } -} - -/** - * @brief Conversion from 0-based model position (row, col) to control field number (1...9). - * @param pos [IN] 0-based model position (row,col). - * @return The control filed number (1...9) - * @remark Asserts proper position range. - */ -static size_t get_cell(model_pos_t pos) -{ - assert(pos.row < 3); - assert(pos.col < 3); - return 1 + pos.row * 3 + pos.col; -} - -/** - * @brief Conversion from model state to control player. - * @param state [IN] Model state to convert - * @return Returns the matching control player value. - * @remark No assertion is done - defaults to control_no_player. - */ -static control_player_t get_player(model_state_t state) -{ - switch(state) { - case model_state_a: return control_player_a; - case model_state_b: return control_player_b; - default: return control_no_player; - } -} - -/** - * @brief Queries if a move is possible. - * @param instance [INOUT] The instance which holds the state. - * @return Returns 0 if no move is possible any more, otherwise 1. - */ -static int control_can_move(control_t *instance) -{ - assert(instance); - return model_can_move(instance->model); -} - -// public API function which is documented in the header file. -void control_init(control_t *instance, model_t *model) -{ - assert(instance); - assert(model); - instance->player = control_player_a; - instance->model = model; -} - -// public API function which is documented in the header file. -void control_move(control_t *instance, size_t cell) -{ - assert(instance); - if (model_move(instance->model, get_pos(cell), get_state(instance->player))) { - if (control_can_move(instance)) { - switch(instance->player) { - case control_player_a: - instance->player = control_player_b; - break; - case control_player_b: - instance->player = control_player_a; - break; - default: - break; - } - } else { - instance->player = control_no_player; - } - } -} - -// public API function which is documented in the header file. -control_player_t control_get_winner(control_t *instance) -{ - assert(instance); - return get_player(model_get_winner(instance->model)); -} - -// public API function which is documented in the header file. -control_player_t control_get_player(control_t *instance) -{ - assert(instance); - return instance->player; -} - -// public API function which is documented in the header file. -control_player_t control_get_state(control_t *instance, size_t cell) -{ - assert(instance); - return get_player(model_get_state(instance->model, get_pos(cell))); -} - -// public API function which is documented in the header file. -control_line_t control_get_win(control_t *instance) -{ - assert(instance); - if (control_get_winner(instance) == control_no_player) { - control_line_t no_win = { 0 }; - return no_win; - } - - model_line_t line = model_get_win_line(instance->model); - assert(line.dir != model_dir_none); - size_t start_cell = get_cell(line.start); - switch(line.dir) { - case model_dir_h: - return (control_line_t) { { start_cell, start_cell + 1, start_cell + 2 } }; - case model_dir_v: - return (control_line_t) { { start_cell, start_cell + 3, start_cell + 6 } }; - case model_dir_d: - if (start_cell == 1) { - return (control_line_t) { { start_cell, start_cell + 4, start_cell + 8 } }; - } else { - return (control_line_t) { { start_cell, start_cell + 2, start_cell + 6 } }; - } - default: - return (control_line_t) { { 1, 1, 1 } }; - } -} diff --git a/P05_TicTacToe/work/tic-tac-toe/src/control.h b/P05_TicTacToe/work/tic-tac-toe/src/control.h deleted file mode 100644 index 613bd8f..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/control.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file - * @brief MVC - agent between model and view - */ -#ifndef _CONTROL_H_ -#define _CONTROL_H_ - -#include "model.h" - -/** - * @brief The selection of possible players. - */ -typedef enum { - control_no_player, ///< none of the players - control_player_a, ///< first player - control_player_b, ///< second player -} control_player_t; - -/** - * @brief Sequence of winning cell numbers in increasing cell numbers. - */ -typedef struct { - size_t line[3]; ///< the sequence of cells (1...9) or 0 in the first element if no win -} control_line_t; - -/** - * @brief The instance type. - */ -typedef struct { - control_player_t player; ///< the current player - model_t *model; ///< the reference to the model -} control_t; - -/** - * @brief Constructor: initialize the instance memory. - * @param instance [INOUT] The instance which holds the state. - * @param model [IN] Dependency Injection of the model instance. - */ -void control_init(control_t *instance, model_t *model); - -/** - * @brief Performs a move on the board. - * @param instance [INOUT] The instance which holds the state. - * @param cell [IN] The affected field (1...9) - * @remark Silently ignores a move if it is not allowed (e.g. if already completed or the field is already played, etc.). - */ -void control_move(control_t *instance, size_t cell); - -/** - * @brief Queries the winning player. - * @param instance [INOUT] The instance which holds the state. - * @returns Returns the winning player (if any). - */ -control_player_t control_get_winner(control_t *instance); - -/** - * @brief Queries the next player. - * @param instance [INOUT] The instance which holds the state. - * @returns Returns the next player (if any). - * @remark This is updated by the control_move() function. - */ -control_player_t control_get_player(control_t *instance); - -/** - * @brief Queries the state of a field. - * @param instance [INOUT] The instance which holds the state. - * @param cell [IN] The affected field of the board (1...9). - * @returns Returns the player which played this field (if any). - */ -control_player_t control_get_state(control_t *instance, size_t cell); - -/** - * @brief Gets the winning fields (if any). - * @param instance [INOUT] The instance which holds the state. - * @returns Returns the field numbers in increasing order (1...9) which win the game (if any). - * @remark If there is no winner (yet), the first entry in the result is 0. - */ -control_line_t control_get_win(control_t *instance); - -#endif // _CONTROL_H_ diff --git a/P05_TicTacToe/work/tic-tac-toe/src/main.c b/P05_TicTacToe/work/tic-tac-toe/src/main.c deleted file mode 100644 index 7e66b7e..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/main.c +++ /dev/null @@ -1,39 +0,0 @@ - /* ---------------------------------------------------------------------------- - * -- _____ ______ _____ - - * -- |_ _| | ____|/ ____| - - * -- | | _ __ | |__ | (___ Institute of Embedded Systems - - * -- | | | '_ \| __| \___ \ Zuercher Hochschule Winterthur - - * -- _| |_| | | | |____ ____) | (University of Applied Sciences) - - * -- |_____|_| |_|______|_____/ 8401 Winterthur, Switzerland - - * ---------------------------------------------------------------------------- - */ -/** - * @file - * @brief Lab P04 dep2dot - */ -#include -#include - -#include "view.h" -#include "model.h" -#include "control.h" - -/** - * @brief main function - * @param argc [in] number of entries in argv - * @param argv [in] program name plus command line arguments - * @returns returns success if valid date is given, failure otherwise - */ -int main(int argc, const char *argv[]) -{ - view_t view; - control_t control; - model_t model; - - model_init(&model); - control_init(&control, &model); - view_init(&view, &control); - view_run(&view); - - return EXIT_SUCCESS; -} diff --git a/P05_TicTacToe/work/tic-tac-toe/src/model.c b/P05_TicTacToe/work/tic-tac-toe/src/model.c deleted file mode 100644 index fd673bc..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/model.c +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file - * @brief Implementation - */ -#include "model.h" -#include - -/** - * @brief Asserts that the position is in range. - * @param [IN] The position to check. - */ -static void assert_pos(model_pos_t pos) -{ - assert(pos.row < MODEL_SIZE); - assert(pos.col < MODEL_SIZE); -} - -/** - * @brief Sets the field on the board to the given state. - * @param instance [INOUT] The instance which holds the state. - * @param pos [IN] The affected field. - * @param state [IN] The new state of the field. - */ -static void set_state(model_t *instance, model_pos_t pos, model_state_t state) -{ - assert_pos(pos); - - // Instructions to the students: - // set the field of the board to the new state - // BEGIN-STUDENTS-TO-ADD-CODE - - - - - - - // END-STUDENTS-TO-ADD-CODE -} - -// public API function which is documented in the header file. -model_pos_t model_pos(size_t row, size_t col) -{ - return (model_pos_t){row, col}; -} - -// public API function which is documented in the header file. -void model_init(model_t *instance) -{ - assert(instance); - - // Instructions to the students: - // set all fields of the board to model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - - - - - - // END-STUDENTS-TO-ADD-CODE -} - -// public API function which is documented in the header file. -model_state_t model_get_state(model_t *instance, model_pos_t pos) -{ - assert(instance); - assert_pos(pos); - - // Instructions to the students: - // replace the stub implementation my access to the field at the given position. - // BEGIN-STUDENTS-TO-ADD-CODE - - - return model_state_none; // stub - - - // END-STUDENTS-TO-ADD-CODE -} - -// public API function which is documented in the header file. -model_line_t model_get_win_line(model_t *instance) -{ - assert(instance); - model_state_t anchor; - - // horizontal - for(size_t row = 0; row < MODEL_SIZE; row++) { - anchor = model_get_state(instance, model_pos(row, 0)); - if (anchor != model_state_none - && anchor == model_get_state(instance, model_pos(row, 1)) - && anchor == model_get_state(instance, model_pos(row, 2))) { - return (model_line_t) { model_dir_h, { row, 0 } }; - } - } - - // vertical - for(size_t col = 0; col < MODEL_SIZE; col++) { - anchor = model_get_state(instance, model_pos(0, col)); - if (anchor != model_state_none - && anchor == model_get_state(instance, model_pos(1, col)) - && anchor == model_get_state(instance, model_pos(2, col))) { - return (model_line_t) { model_dir_v, { 0, col } }; - } - - - } - - // diagonal - anchor = model_get_state(instance, model_pos(1, 1)); - if (anchor != model_state_none) { - if (anchor == model_get_state(instance, model_pos(0, 0)) && anchor == model_get_state(instance, model_pos(2, 2))) { - return (model_line_t) { model_dir_d, { 0, 0 } }; - } - if (anchor == model_get_state(instance, model_pos(2, 0)) && anchor == model_get_state(instance, model_pos(0, 2))) { - return (model_line_t) { model_dir_d, { 0, 2 } }; - } - } - - // fallback - return (model_line_t) { model_dir_none, { 0, 0 } }; -} - -// public API function which is documented in the header file. -model_state_t model_get_winner(model_t *instance) -{ - assert(instance); - model_line_t line = model_get_win_line(instance); - return line.dir == model_dir_none - ? model_state_none - : model_get_state(instance, model_pos(line.start.row, line.start.col)) - ; -} - -// public API function which is documented in the header file. -int model_can_move(model_t *instance) -{ - assert(instance); - if (model_get_winner(instance) == model_state_none) { - // Instructions to the students: - // scan all fields: return 1 with first field which equals model_state_none - // BEGIN-STUDENTS-TO-ADD-CODE - - - - - - - - - // END-STUDENTS-TO-ADD-CODE - } - return 0; -} - -// public API function which is documented in the header file. -int model_move(model_t *instance, model_pos_t pos, model_state_t state) -{ - assert(instance); - assert_pos(pos); - if (model_get_state(instance, pos) == model_state_none && model_can_move(instance)) { - set_state(instance, pos, state); - return 1; - } - return 0; -} diff --git a/P05_TicTacToe/work/tic-tac-toe/src/model.h b/P05_TicTacToe/work/tic-tac-toe/src/model.h deleted file mode 100644 index 51e2678..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/model.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file - * @brief MVC - Model instance - */ -#ifndef _MODEL_H_ -#define _MODEL_H_ - -#include - -#define MODEL_SIZE 3 ///< size of the game to avoid magic numbers in the code (not meant to modify) - -/** - * @brief The position on the board. - */ -typedef struct { - size_t row; ///< The row (0-based). - size_t col; ///< The column (0-based). -} model_pos_t; - -/** - * @brief Winner line direction - the winner line is given together with the start position. - */ -typedef enum { - model_dir_none, ///< no winner line - model_dir_h, ///< horizontal - model_dir_v, ///< vertical - model_dir_d, ///< diagonal -} model_dir_t; - -/** - * @brief The Winner line (if any). - */ -typedef struct { - model_dir_t dir; ///< the winner line direction (if any) - model_pos_t start; ///< the start position of the winner line -} model_line_t; - -/** - * @brief The state of a field. - */ -typedef enum { - model_state_none, ///< field available to play - model_state_a, ///< field already played - model_state_b, ///< field already played -} model_state_t; - -/** - * @brief The instance type. - */ -typedef struct { - model_state_t board[MODEL_SIZE][MODEL_SIZE]; ///< the play board -} model_t; - -/** - * @brief Convert to row and col to position. - * @param row [IN] position parameter - * @param col [IN] position parameter - * @return Returns the position given be row and col parameters. - */ -model_pos_t model_pos(size_t row, size_t col); - -/** - * @brief Constructor: initialize the instance memory. - * @param instance [INOUT] The instance which holds the state. - */ -void model_init(model_t *instance); - -/** - * @brief Queries the state of the given field. - * @param instance [INOUT] The instance which holds the state. - * @param pos [IN] The affected field. - * @return Returns the state of the field. - */ -model_state_t model_get_state(model_t *instance, model_pos_t pos); - -/** - * @brief Queries the winner (if any). - * @param instance [INOUT] The instance which holds the state. - * @return Returns the wining player or model_state_none if no winner (yet). - */ -model_state_t model_get_winner(model_t *instance); - -/** - * @brief Queries if a move is possible (i.e. not won yet and any field available?). - * @param instance [INOUT] The instance which holds the state. - * @return Returns 0 if no move possible, 1 otherwise. - */ -int model_can_move(model_t *instance); - -/** - * @brief Do a move if possible. - * @param instance [INOUT] The instance which holds the state. - * @param pos [IN] The field to play. - * @param state [IN] The new state (only model_state_a and model_state_b allowed). - * @return Returns if the attempt to move was successful. - * @remark Does only succeed if not yet won and if the field is available. - */ -int model_move(model_t *instance, model_pos_t pos, model_state_t state); - -/** - * @brief Gets the winner line (if any). - * @param instance [INOUT] The instance which holds the state. - * @returns The line which wins (if any). - * @remark The start position is 0/0, 1/0, 2/0 for horizontal, 0/0, 0/1, 0/2 for vertical, 0/0, 0/2 for diagonal. - */ -model_line_t model_get_win_line(model_t *instance); - -#endif // _MODEL_H_ diff --git a/P05_TicTacToe/work/tic-tac-toe/src/view.c b/P05_TicTacToe/work/tic-tac-toe/src/view.c deleted file mode 100644 index a248c49..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/view.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - * @file - * @brief Implementation - */ -#include "view.h" -#include "control.h" - -#include // assert() -#include // various i/o -#include // isdigit() -#include // STDIN_FILENO, isatty() -#include // tcgetattr(), tcsetattr() - -#define EXIT '0' ///< the UI exit request - -#define CLS "\033[2J" ///< ANSI termial CSI sequence for clear screen -#define AVAILABLE "\033[40m" ///< ANSI termial CSI sequence for available fields (black) -#define PLAYER_A "\033[42m" ///< ANSI termial CSI sequence for one player (green) -#define PLAYER_B "\033[41m" ///< ANSI termial CSI sequence for the other player (red) -#define GAP "\033[47m" ///< ANSI termial CSI sequence for boarder (white) -#define RESET "\033[0m" ///< ANSI termial CSI sequence to reset all settings - -#define CELL_WIDTH 10 ///< rendering parameter: columns per cell -#define CELL_HEIGHT 5 ///< rendering parameter: rows per cell -#define GAP_WIDTH 4 ///< rendering parameter: columns per border -#define GAP_HEIGHT 2 ///< rendering parameter: rows per boarder - -#define SIZE 3 ///< size of the game to avoid magic numbers in the code (not meant to modify) -#define CELLS (SIZE * SIZE) ///< size of the game to avoid magic numbers in the code (not meant to modify) - -/** - * @brief Position the cursor for further output. - * @param row [IN] position parameter - * @param col [IN] position parameter - */ -static void goto_pos(size_t row, size_t col) -{ - printf("\033[%zd;%zdH", row, col); -} - -/** - * @brief Displays a sequence of spaces at the given position in the given background color. - * @param row [IN] position parameter - * @param col [IN] position parameter - * @param width [IN] how many spaces to write - * @param color [IN] the format string before writing the spaces (intent: background color) - * @remark After writing the spaces, the format is reset. - */ -static size_t show_bar(size_t row, size_t col, size_t width, const char* color) -{ - goto_pos(row, col); - printf("%s", color); - for(size_t col = 0; col < width; col++) { - putchar(' '); - } - printf(RESET); - return col + width; -} - -/** - * @brief Displays a horizontal border over the whole board width. - * @param row [IN] position parameter - * @param col [IN] position parameter - */ -static size_t show_h_gap(size_t row, size_t col) { - for(size_t i = 0; i < GAP_HEIGHT; i++) { - show_bar(row+i, col, GAP_WIDTH + CELL_WIDTH + GAP_WIDTH, GAP); - } - return row + GAP_HEIGHT; -} - -/** - * @brief Writes for the call at position y/x the given number with the given background color. - * @param y [IN] position parameter: the upper left row of the cell - * @param x [IN] position parameter: the upper left column of the cell - * @param n [IN] the number to write as text - * @param color [IN] the format string before writing the text (intent: background color) - * @remark After writing the number, the format is reset. - */ -static void show_cell_nr(size_t y, size_t x, size_t n, const char *color) -{ - size_t cy = (y + y + CELL_HEIGHT)/2; - size_t cx = (x + x + CELL_WIDTH - 2)/2; - - goto_pos(cy, cx); - printf("%s", color); - printf("%2zd", n); - printf(RESET); -} - -/** - * @brief Renders the given cell with the given background color, including the surrounding border. - * @param n [IN] the cell number (0...CELLS-1) - * @param color [IN] the format string for the cell content (intent: background color) - * @remark After writing the number, the format is reset. - */ -static void show_cell(size_t n, const char *color) -{ - // goto upper-left corner of a cell (the cell starts with an upper and left gap) - size_t y = 1 + n / SIZE * (GAP_HEIGHT + CELL_HEIGHT); - size_t x = 1 + n % SIZE * (GAP_WIDTH + CELL_WIDTH); - - size_t row = show_h_gap(y, x); - for(size_t i = 0; i < CELL_HEIGHT; i++) { - size_t col = x; - col = show_bar(row, col, GAP_WIDTH, GAP); - col = show_bar(row, col, CELL_WIDTH, color); - col = show_bar(row, col, GAP_WIDTH, GAP); - row++; - } - row = show_h_gap(row, x); - show_cell_nr(y + GAP_HEIGHT, x + GAP_WIDTH, n + 1, color); - goto_pos(row, 0); -} - -/** - * @brief Renders the given player's name in the given background color. - * @param player [IN] the player to render (select the background color and the name of the player - * @remark After writing the content, the format is reset. - */ -static void print_player(control_player_t player) -{ - switch(player) { - case control_player_a: - printf(PLAYER_A); - printf("Player A"); - printf(RESET); - break; - case control_player_b: - printf(PLAYER_B); - printf("Player B"); - printf(RESET); - break; - default: - printf(RESET); - printf("none"); - break; - } -} - -/** - * @brief Displays a label followed by the given player. - * @param row [IN] position parameter - * @param col [IN] position parameter - * @param label [IN] the profixing label - * @param player [IN] the player to display - */ -static void show_player(size_t row, size_t col, const char *label, control_player_t player) -{ - goto_pos(row, col); - printf(RESET); - col += printf("%s", label); - goto_pos(row, col); - print_player(player); -} - -/** - * @brief Renders the winner and the next player. - * @param winner [IN] the winning player (if any) - * @param next [IN] the next player (if any) - */ -static void show_status(control_player_t winner, control_player_t next) -{ - size_t y = GAP_HEIGHT; - size_t x = SIZE * (GAP_WIDTH + CELL_WIDTH) + GAP_WIDTH + GAP_WIDTH; - size_t row = y; - size_t col = x; - - show_player(row, col, "Winner is: ", winner); - row += 2; - show_player(row, col, "Next player is: ", next); - row += 2; - row += 2; - goto_pos(row, col); - printf("0: exit"); - row += 2; - goto_pos(row, col); - printf("1..9: play field"); -} - -/** - * @brief Renders the board from the status given by the control instance. - * @param instance [IN] the instance which holds the control instance - */ -static void show(view_t *instance) -{ - assert(instance); - assert(instance->control); - puts(CLS); - show_status(control_get_winner(instance->control), control_get_player(instance->control)); - - for(size_t i = 0; i < CELLS; i++) { - const char *color = AVAILABLE; - switch(control_get_state(instance->control, i+1)) { - case control_player_a: - color = PLAYER_A; - break; - case control_player_b: - color = PLAYER_B; - break; - default: - break; - } - show_cell(i, color); - } -} - -/** - * @brief Processes the input and dsiplays the result. - * @param the instance which holds the control instance - */ -static void notifier_loop(view_t *instance) -{ - show(instance); - int c = getchar(); - while(c != EOF && c != EXIT) { - if (isdigit(c)) { - control_move(instance->control, c-'0'); - } - show(instance); - c = getchar(); - } -} - - -// public API function which is documented in the header file. -void view_init(view_t *instance, control_t *control) -{ - assert(instance); - assert(control); - instance->control = control; -} - -// public API function which is documented in the header file. -void view_run(view_t *instance) -{ - if (isatty(STDIN_FILENO)) { // in case of an interactive terminal, the exhoing and buffering is disabled - // declare non POSIX function, which is available in glibc, but not in strinct C99 mode - void cfmakeraw(struct termios *termios_p); - - // replace original tty IO state... - struct termios orig; - struct termios raw; - cfmakeraw(&raw); - tcgetattr(STDIN_FILENO, &orig); - tcsetattr(STDIN_FILENO, TCSANOW, &raw); - // ...do the work... - notifier_loop(instance); - // ...and finalle restore original tty IO state - tcsetattr(STDIN_FILENO, TCSANOW, &orig); - } else { // if not an interactive terminal, no tweaking with IO is done - notifier_loop(instance); - } -} - diff --git a/P05_TicTacToe/work/tic-tac-toe/src/view.h b/P05_TicTacToe/work/tic-tac-toe/src/view.h deleted file mode 100644 index 84cee90..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/src/view.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file - * @brief MVC - View instance - */ -#ifndef _VIEW_H_ -#define _VIEW_H_ - -#include "control.h" - -/** - * @brief The instance type. - */ -typedef struct { - control_t *control; ///< the instance knows of the control instance -} view_t; - -/** - * @brief Constructor: initialize the instance memory. - * @param instance [INOUT] The instance which holds the state. - * @param control [IN] Dependency Injection of the control instance. - */ -void view_init(view_t *instance, control_t *control); - -/** - * @brief Starts the notifyer loop: accepts input and displays the results. - * @param instance [INOUT] The instance which holds the state. - * @remark Does only return when termination is requested through the UI. - */ -void view_run(view_t *instance); - -#endif // _VIEW_H_ diff --git a/P05_TicTacToe/work/tic-tac-toe/tests/tests.c b/P05_TicTacToe/work/tic-tac-toe/tests/tests.c deleted file mode 100644 index f2d15df..0000000 --- a/P05_TicTacToe/work/tic-tac-toe/tests/tests.c +++ /dev/null @@ -1,445 +0,0 @@ -/* ---------------------------------------------------------------------------- - * -- _____ ______ _____ - - * -- |_ _| | ____|/ ____| - - * -- | | _ __ | |__ | (___ Institute of Embedded Systems - - * -- | | | '_ \| __| \___ \ Zuercher Hochschule Winterthur - - * -- _| |_| | | | |____ ____) | (University of Applied Sciences) - - * -- |_____|_| |_|______|_____/ 8401 Winterthur, Switzerland - - * ---------------------------------------------------------------------------- - */ -/** - * @file - * @brief Test suite for the given package. - */ -#include -#include -#include -#include -#include -#include -#include "test_utils.h" -#include "model.h" - -#ifndef TARGET // must be given by the make file --> see test target -#error missing TARGET define -#endif - -/// @brief alias for EXIT_SUCCESS -#define OK EXIT_SUCCESS -/// @brief alias for EXIT_FAILURE -#define FAIL EXIT_FAILURE - -/// @brief The name of the STDOUT text file. -#define OUTFILE "stdout.txt" -/// @brief The name of the STDERR text file. -#define ERRFILE "stderr.txt" - -#define TRACE_INDENT "\n " ///< allow for better stdout formatting in case of error - -// setup & cleanup -static int setup(void) -{ - remove_file_if_exists(OUTFILE); - remove_file_if_exists(ERRFILE); - return 0; // success -} - -static int teardown(void) -{ - // Do nothing. - // Especially: do not remove result files - they are removed in int setup(void) *before* running a test. - return 0; // success -} - -// test utils -static void init_model(model_t *instance, int act) -{ - if (act) printf(TRACE_INDENT "init_model:... "); - model_init(instance); - for(size_t row = 0; row < MODEL_SIZE; row++) { - for(size_t col = 0; col < MODEL_SIZE; col++) { - if (act) printf("%zd/%zd ", row, col); - CU_ASSERT_EQUAL_FATAL(instance->board[row][col], model_state_none); - } - } - if (act) printf(TRACE_INDENT); -} - -static void print_board(model_state_t board[MODEL_SIZE][MODEL_SIZE]) -{ - for(size_t row = 0; row < MODEL_SIZE; row++) { - printf("{ "); - for(size_t col = 0; col < MODEL_SIZE; col++) { - printf("%d ", board[row][col]); - } - printf("} "); - } -} - - -// tests -static void test_model_init(void) -{ - // check void model_init(model_t *instance); - - // arrange - model_t model; - // act & assert - init_model(&model, 1); -} - -static void test_model_get_state(void) -{ - // check: model_state_t model_get_state(model_t *instance, model_pos_t pos); - - { - // arrange - model_t model; - init_model(&model, 0); - // act & assert - printf(TRACE_INDENT "initial state:... "); - print_board(model.board); - for(size_t row = 0; row < MODEL_SIZE; row++) { - for(size_t col = 0; col < MODEL_SIZE; col++) { - printf("%zd/%zd ", row, col); - CU_ASSERT_EQUAL_FATAL(model_get_state(&model, model_pos(row, col)), model_state_none); - } - } - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_b }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "modified state:... "); - print_board(model.board); - for(size_t row = 0; row < MODEL_SIZE; row++) { - for(size_t col = 0; col < MODEL_SIZE; col++) { - printf("%zd/%zd ", row, col); - CU_ASSERT_EQUAL_FATAL(model_get_state(&model, model_pos(row, col)), board[row][col]); - } - } - } - printf(TRACE_INDENT); -} - -static void test_model_get_winner(void) -{ - // check: model_state_t model_get_winner(model_t *instance); - - { - // arrange - model_t model; - init_model(&model, 0); - // act & assert - printf(TRACE_INDENT "initial no winner:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_get_winner(&model), model_state_none); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_b }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "winner:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_get_winner(&model), model_state_b); - } - printf(TRACE_INDENT); -} - -static void test_model_can_move(void) -{ - // check: int model_can_move(model_t *instance); - - { - // arrange - model_t model; - init_model(&model, 0); - // act & assert - printf(TRACE_INDENT "initial can move:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_can_move(&model), 1); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_b }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "can move while not yet done nor win:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_can_move(&model), 1); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_b }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "cannot move after win:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_can_move(&model), 0); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_b, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_b }, - { model_state_b, model_state_a, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "cannot move when all done:... "); - print_board(model.board); - CU_ASSERT_EQUAL_FATAL(model_can_move(&model), 0); - } - printf(TRACE_INDENT); -} - -static void test_model_move(void) -{ - // check: int model_move(model_t *instance, model_pos_t pos, model_state_t state); - - { - // arrange - model_t model; - init_model(&model, 0); - // act & assert - printf(TRACE_INDENT "initial move:... "); - print_board(model.board); - model_pos_t pos_a = model_pos(0, 0); - printf("%zd/%zd ", pos_a.row, pos_a.col); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_a, model_state_a), 1); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_a, model_state_a), 0); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_a, model_state_b), 0); - model_pos_t pos_b = model_pos(2, 2); - printf("%zd/%zd ", pos_b.row, pos_b.col); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_b, model_state_b), 1); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_b, model_state_b), 0); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos_b, model_state_a), 0); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_b }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "can move while not yet done nor win:... "); - print_board(model.board); - model_pos_t pos = model_pos(2, 1); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_a), 1); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_a), 0); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_b), 0); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_b }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "cannot move after win:... "); - print_board(model.board); - model_pos_t pos = model_pos(2, 1); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_a), 0); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_b), 0); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_b, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_b }, - { model_state_b, model_state_a, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "cannot move when all done:... "); - print_board(model.board); - for(size_t row = 0; row < MODEL_SIZE; row++) { - for(size_t col = 0; col < MODEL_SIZE; col++) { - model_pos_t pos = model_pos(row, col); - printf("%zd/%zd ", row, col); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_a), 0); - CU_ASSERT_EQUAL_FATAL(model_move(&model, pos, model_state_b), 0); - } - } - CU_ASSERT_EQUAL_FATAL(model_can_move(&model), 0); - } - printf(TRACE_INDENT); -} - -static void test_model_get_win_line(void) -{ - // check: model_line_t model_get_win_line(model_t *instance); - - { - // arrange - model_t model; - init_model(&model, 0); - // act & assert - printf(TRACE_INDENT "initial no winner:... "); - print_board(model.board); - model_line_t no_win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(no_win.dir, model_dir_none); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_none, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_none }, - { model_state_b, model_state_none, model_state_b }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "no winner while not yet done nor win:... "); - print_board(model.board); - model_line_t no_win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(no_win.dir, model_dir_none); - } - { - // arrange - static const model_state_t board[MODEL_SIZE][MODEL_SIZE] = { - { model_state_b, model_state_a, model_state_a }, - { model_state_a, model_state_b, model_state_b }, - { model_state_b, model_state_a, model_state_a }, - }; - model_t model; - init_model(&model, 0); - memcpy(model.board, board, sizeof(board)); - - // act & assert - printf(TRACE_INDENT "no winner when all done:... "); - print_board(model.board); - model_line_t no_win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(no_win.dir, model_dir_none); - } - { - for(size_t row = 0; row < MODEL_SIZE; row++) { - // arrange - model_t model; - init_model(&model, 0); - for(size_t col = 0; col < MODEL_SIZE; col++) { - CU_ASSERT_EQUAL_FATAL(model_move(&model, model_pos(row, col), model_state_a), 1); - } - // act & assert - printf(TRACE_INDENT "row winner:... "); - print_board(model.board); - model_line_t win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(win.dir, model_dir_h); - CU_ASSERT_EQUAL_FATAL(win.start.row, row); - CU_ASSERT_EQUAL_FATAL(win.start.col, 0); - } - } - { - for(size_t col = 0; col < MODEL_SIZE; col++) { - // arrange - model_t model; - init_model(&model, 0); - for(size_t row = 0; row < MODEL_SIZE; row++) { - CU_ASSERT_EQUAL_FATAL(model_move(&model, model_pos(row, col), model_state_a), 1); - } - // act & assert - printf(TRACE_INDENT "column winner:... "); - print_board(model.board); - model_line_t win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(win.dir, model_dir_v); - CU_ASSERT_EQUAL_FATAL(win.start.row, 0); - CU_ASSERT_EQUAL_FATAL(win.start.col, col); - } - } - { - printf(TRACE_INDENT "diagonal left-right winner:... "); - // arrange - model_t model; - init_model(&model, 0); - for(size_t i = 0; i < MODEL_SIZE; i++) { - CU_ASSERT_EQUAL_FATAL(model_move(&model, model_pos(i, i), model_state_a), 1); - } - // act & assert - print_board(model.board); - model_line_t win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(win.dir, model_dir_d); - CU_ASSERT_EQUAL_FATAL(win.start.row, 0); - CU_ASSERT_EQUAL_FATAL(win.start.col, 0); - } - { - printf(TRACE_INDENT "diagonal right-left winner:... "); - // arrange - model_t model; - init_model(&model, 0); - for(size_t i = 0; i < MODEL_SIZE; i++) { - CU_ASSERT_EQUAL_FATAL(model_move(&model, model_pos(MODEL_SIZE - 1 - i, i), model_state_a), 1); - } - // act & assert - print_board(model.board); - model_line_t win = model_get_win_line(&model); - CU_ASSERT_EQUAL_FATAL(win.dir, model_dir_d); - CU_ASSERT_EQUAL_FATAL(win.start.row, 0); - CU_ASSERT_EQUAL_FATAL(win.start.col, MODEL_SIZE - 1); - } - printf(TRACE_INDENT); -} - -/** - * @brief Registers and runs the tests. - * @returns success (0) or one of the CU_ErrorCode (>0) - */ -int main(void) -{ - // setup, run, teardown - TestMainBasic("lab test", setup, teardown - , test_model_init - , test_model_get_state - , test_model_get_winner - , test_model_can_move - , test_model_move - , test_model_get_win_line - ); -} diff --git a/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.docx b/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.docx deleted file mode 100644 index 68c5257..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.docx and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.pdf b/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.pdf deleted file mode 100644 index 9cd3c97..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/P07_Personen_Verwaltung_Linked_List.pdf and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/README.md b/P06_Personen_Verwaltung_Linked_List/README.md deleted file mode 100644 index a45e70b..0000000 --- a/P06_Personen_Verwaltung_Linked_List/README.md +++ /dev/null @@ -1,254 +0,0 @@ -# 06 - Personen Verwaltung – Linked List -___ - -![](./linked_list.png) - -___ - -## 1. Übersicht -In diesem Praktikum schreiben Sie eine einfache Personenverwaltung. Dabei werden Sie etliche Elemente von C anwenden: -* Header Files selber schreiben, inklusive Include Guard -* Typen definieren -* Funktionen mit `by value` und `by reference` Parametern deklarieren und definieren -* einfache Variablen, Pointer Variablen, struct Variablen und Array Variablen benutzen -* Strukturen im Speicher dynamisch allozieren und freigeben -* I/O und String Funktionen aus der Standard Library anwenden -* Anwender Eingaben verarbeiten -* Fehlerbehandlung - -___ - -## 2. Lernziele - -In diesem Praktikum wenden Sie viele der bisher gelernten C Elemente an. -* Sie können anhand dieser Beschreibung ein vollständiges C Programm schreiben. -* Sie können Unit Tests schreiben welche die wesentlichen Funktionen des Programms individuell testen. -* -Die Bewertung dieses Praktikums ist am Ende angegeben. - -Erweitern Sie die vorgegebenen Code Gerüste, welche im `git` Repository `snp-lab-code` verfügbar sind. - - -___ - -## 3. Personenverwaltung -___ - - -### 3.1 Programmfunktion -Das Programm soll in einer Schleife dem Benutzer jeweils folgende Auswahl bieten, wovon eine Aktion mit Eingabe des entsprechenden Buchstabens ausgelöst wird: - -**I**(nsert), **R**(emove), **S**(how), **C**(lear), **E**(nd): -* **Insert**: der Benutzer wird aufgefordert, eine Person einzugeben -* **Remove**: der Benutzer wird aufgefordert, die Daten einer zu löschenden Person einzu-geben -* **Show**: eine komplette Liste aller gespeicherten Personen wird in alphabetischer Rei-henfolge ausgegeben -* **Clear**: alle Personen werden gelöscht -* **End**: das Programm wird beendet - -___ - -### 3.2 Designvorgaben - -**Verkettete Liste** -Da zur Kompilierzeit nicht bekannt ist, ob 10 oder 10'000 Personen eingegeben werden, wäre es keine gute Idee, im Programm einen statischen Array mit z.B. 10'000 Personen-Einträgen zu allozieren. Dies wäre ineffizient und umständlich beim sortierten Einfügen von Personen. In solchen Situationen arbeitet man deshalb mit dynamischen Datenstrukturen, die zur Laufzeit beliebig (solange Speicher vorhanden ist) wachsen und wieder schrumpfen können. Eine sehr populäre dynamische Datenstruktur ist die **verkettete Liste** und genau die werden wir in diesem Praktikum verwenden. - - - -![](./a.png) - -![](./b.png) - -![](./c.png) - -![](./d.png) -Abbildung 1: Zyklisch verkettete Liste - - -Eine verkettete Liste bedeutet, dass ein Knoten der verketten Liste einen Datensatz einer Person speichert und zusätzlich einen Pointer auf den nächsten Knoten in der Liste aufweist (siehe Abbildung 1). In dieser Pointer Variablen (`next` in der `node_t` Struktur unten) steht also einfach die Adresse des nächsten Knotens. - -Die leere Liste besteht aus einem einzelnen Element, welches keine spezifische Person abspeichert und welches auf sich selbst zeigt (Abbildung 1 a). Dieses Element ist der Einstiegspunkt der Liste (auch Anker oder Wurzel genannt) und ist das einzige Element, das Sie im Programm direkt kennen und einer Variablen zuweisen. Dieses Element können Sie statisch allozieren (z.B. `node_t anchor`;, siehe Details weiter unten), denn es existiert während der gesamten Ausführungszeit. Alle anderen Elemente erreichen Sie ausgehend vom Anker, indem Sie einmal, den Pointern folgend, im Kreis herum gehen. Abbildung 1 b zeigt die Liste nach dem Einfügen der Person `Max Mueller, 40` Jahre. Nach dem Einfügen von zwei weiteren Personen sieht die Datenstruktur aus wie in Abbildung 1 c. Das Entfernen der Person `Arno Bosshard` führt zu Abbildung 1 d. - -Eine Person kann **zugefügt** werden, indem dynamisch ein neuer Knoten erzeugt wird und dieser in die verkettete Liste eingefügt wird. Beim Einfügen müssen die Adressen der Knoten so den Pointern zugewiesen werden, dass die Kette intakt bleibt. - -Ein Knoten wird **entfernt**, indem der entsprechende Knoten aus der Verkettung herausgelöst wird (`next` des Vorgängerknotens soll neu auf `next` des herauszulösenden Knotens zeigen) und dann der Speicher des entsprechenden Knotens freigegeben wird. - -**Personen und Knoten Records** - -Die für je eine Person zu speichernden Daten sollen in folgendem C `struct` zusammengefasst sein. - -```C -#define NAME_LEN 20 - -typedef struct { - char name[NAME_LEN]; - char first_name[NAME_LEN]; - unsigned int age; -} person_t; -``` - -Jeder Knoten der verketteten Liste soll aus folgendem C `struct` bestehen. - -```C -typedef struct node { - person_t content; // in diesem Knoten gespeicherte Person - struct node *next; // Pointer auf den nächsten Knoten in der Liste -} node_t; -``` - -**Vorschlag: zyklisch verkettete Liste** - -Erkennen des Endes der Liste: bei der zyklisch verketteten Liste zeigt das letzte Element wie-der auf den Anker, die Liste bildet also einen Kreis. Dies ist in Abbildung 1 so abgebildet. - -Alternativ könnte man das Ende erkennbar machen, indem die Kette anstelle von zyklisch, mit einem NULL Pointer endet. - -Die Wahl ist ihnen überlassen ob sie die eine oder andere Art der End-Erkennung implementieren. In der Beschreibung wird angenommen, dass es sich um eine zyklisch verkettete Liste handelt. - -**Sortiertes Einfügen** - -Die Personen Records sollen sortiert in die Liste eingefügt werden. Dies bedeutet, dass vom Anker her gesucht werden soll, bis der erste Knoten gefunden wurde dessen Nachfolgeknoten entweder „grösser“ ist als der einzufügende Knoten, oder wo das Ende der Liste erreicht ist. Die Ordnung (grösser, gleich, kleiner) soll so definiert sein: - -```C -// if (p1 > p2) { ... } -if (person_compare(&p1, &p2) > 0) { ... } -/** - * @brief Compares two persons in this sequence: 1st=name, 2nd=first_name, 3rd=age - * @param a [IN] const reference to 1st person in the comparison - * @param b [IN] const reference to 2nd person in the comparison - * @return =0 if all record fields are the same - * >0 if all previous fields are the same, but for this field, a is greater - * <0 if all previous fields are the same, but for this field, b is greater - * @remark strncmp() is used for producing the result of string field comparisons - * @remark a->age – b->age is used for producing the result of age comparison - */ -int person_compare(const person_t *a, const person_t *b); -``` - -**Eingabe** - -**Fehlerhafte Wahl der Operation** in der Hauptschleife soll gemeldet werden, ansonsten aber ignoriert werden. - -**Fehlerhafte Eingabe der Personenangaben** sollen gemeldet werden und die gesamte Operation (z.B. Insert) verworfen werden. - -Zu prüfende Fehler bei Personeneingaben: -* für die Namen - * zu lange Namen -* für das Alter - * keine Zahl -* Duplikat - * derselbe Record soll nicht doppelt in der Liste vorkommen - -Weitergehende Prüfungen sind nicht erwartet. - -**Zu beachten:** bei fehlerhafter Eingabe darf kein „Memory Leak“ entstehen, d.h. potentiell auf dem Heap allozierter Speicher muss im Fehlerfall freigegeben werden. - - -___ - -### 3.3 Bestehender Programmrahmen - -Der Programmrahmen besteht aus den unten aufgelisteten Files. Es sollen weitere Module in `src` hinzugefügt werden und die bestehenden Files ergänzt werden gemäss den Aufgaben. - -| | | -| :-- | :-- | -| Makefile | -> **zu ergänzen** mit neuen Modulen | -| tests/tests.c | -> **zu ergänzen** gemäss Aufgaben (implementieren von Unit Tests) | -| src/main.c | -> **zu ergänzen** gemäss Aufgaben (Hauptprogramm) | - -___ - -## 4. Aufgabe 1: Modularisierung – API und Implementation main.c -Kreieren Sie folgende Files in `src` und implementieren Sie `main.c` basierend auf dem unten von Ihnen gegebenen API. - - -**File person.h** - - -Typ Definitionen: -```C -person_t... // siehe Beschreibung oben -``` - -Funktionsdeklarationen: -```C -// siehe Beschreibung oben -int person_compare(const person_t *a, const person_t *b); -``` - -* gegebenenfalls weitere Funktionen für die Bearbeitung von Personen - - - - -**File list.h** - -Typ Definitionen: -```C -person_t... // siehe Beschreibung oben -``` - -Funktionsdeklarationen: -* Funktionen für `insert`, `remove`, `clear` Operationen auf der Liste - -___ - -Das Hauptprogramm soll die Eingabeschleife implementieren und die obigen Funktionen (wo angebracht) aufrufen. - -___ - -## 5. Aufgabe 2: Implementierung von person.c und list.c - -Fügen Sie die beiden Implementationsfiles `person.c` und `list.c` zu `src`. Fügen Sie die beiden Module im `Makefile` zu der vorgegebenen Variablen `MODULES` hinzu, so dass sie beim `make` Aufruf auch berücksichtigt werden. - -___ - -### 5.1 Teilaufgabe: Implementierung von person.c -Implementieren Sie die Funktionen aus `person.h`. - -Falls nötig, stellen Sie weitere statische Hilfsfunktionen in `person.c` zur Verfügung. - -___ - -### 5.2 Teilaufgabe: Implementierung von list.c - -Implementieren Sie die Funktionen aus `list.h`. - -Falls nötig, stellen Sie weitere statische Hilfsfunktionen in `list.c` zur Verfügung. - -___ - -## 6. Aufgabe 3: Unit Tests - -Schreiben Sie Unit Tests für mindestens die folgenden Funktionen - -* `person.h:` - * `person_compare` -* `list.h:` - * `list_insert` - * `list_remove` - * `list_clear` - -Es existieren in `tests/tests.c` schon vier Test Rahmen für diese Test Cases. - -In diese Test Cases sollen die entsprechenden Funktionen unter verschiedenen Bedingungen isoliert aufgerufen werden und deren Verhalten überprüft werden. - -Verwenden Sie für die Überprüfung die CUnit `CU_ASSERT_...` Makros. - -Siehe dazu auch `man CUnit`. - -Wenn die obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch. - - -___ - -## 7. Bewertung - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| 1 | API von list.h und person.h plus die Implementation von main.c | 2 | -| 2 | Teilaufgabe: person.c | 2 | -| 2 | Teilaufgabe: list.c | 2 | -| 3 | Unit Tests | 2 | - -___ -Version: 11.01.2022 diff --git a/P06_Personen_Verwaltung_Linked_List/a.png b/P06_Personen_Verwaltung_Linked_List/a.png deleted file mode 100644 index 925d567..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/a.png and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/a.svg b/P06_Personen_Verwaltung_Linked_List/a.svg deleted file mode 100644 index b790e3f..0000000 --- a/P06_Personen_Verwaltung_Linked_List/a.svg +++ /dev/null @@ -1,42 +0,0 @@ - - -a) diff --git a/P06_Personen_Verwaltung_Linked_List/b.png b/P06_Personen_Verwaltung_Linked_List/b.png deleted file mode 100644 index 1c7d260..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/b.png and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/b.svg b/P06_Personen_Verwaltung_Linked_List/b.svg deleted file mode 100644 index 46bb1de..0000000 --- a/P06_Personen_Verwaltung_Linked_List/b.svg +++ /dev/null @@ -1,59 +0,0 @@ - - -b)MuellerMax40 diff --git a/P06_Personen_Verwaltung_Linked_List/c.png b/P06_Personen_Verwaltung_Linked_List/c.png deleted file mode 100644 index 0b42e10..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/c.png and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/c.svg b/P06_Personen_Verwaltung_Linked_List/c.svg deleted file mode 100644 index fb93f0b..0000000 --- a/P06_Personen_Verwaltung_Linked_List/c.svg +++ /dev/null @@ -1,89 +0,0 @@ - - -Bosshard Arno62MuellerMax40Schmid Anna 32c) diff --git a/P06_Personen_Verwaltung_Linked_List/d.png b/P06_Personen_Verwaltung_Linked_List/d.png deleted file mode 100644 index 43daab4..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/d.png and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/d.svg b/P06_Personen_Verwaltung_Linked_List/d.svg deleted file mode 100644 index 0fddd4d..0000000 --- a/P06_Personen_Verwaltung_Linked_List/d.svg +++ /dev/null @@ -1,78 +0,0 @@ - - -MuellerMax40Schmid Anna 32d) diff --git a/P06_Personen_Verwaltung_Linked_List/linked_list.png b/P06_Personen_Verwaltung_Linked_List/linked_list.png deleted file mode 100644 index ee01144..0000000 Binary files a/P06_Personen_Verwaltung_Linked_List/linked_list.png and /dev/null differ diff --git a/P06_Personen_Verwaltung_Linked_List/linked_list.svg b/P06_Personen_Verwaltung_Linked_List/linked_list.svg deleted file mode 100644 index ca23342..0000000 --- a/P06_Personen_Verwaltung_Linked_List/linked_list.svg +++ /dev/null @@ -1,68 +0,0 @@ - - -MuellerMax40Schmid Anna 32 diff --git a/P06_Personen_Verwaltung_Linked_List/linked_list.uxf b/P06_Personen_Verwaltung_Linked_List/linked_list.uxf deleted file mode 100644 index 1e2355d..0000000 --- a/P06_Personen_Verwaltung_Linked_List/linked_list.uxf +++ /dev/null @@ -1,386 +0,0 @@ - - - 10 - - UMLObject - - 120 - 80 - 100 - 60 - - Schmid -Anna -32 -halign=left - - - - Relation - - 210 - 100 - 90 - 30 - - lt=<<<- - 10.0;10.0;70.0;10.0 - - - UMLObject - - 280 - 80 - 100 - 60 - - Mueller -Max -40 -halign=left - - - - UMLObject - - 200 - 180 - 100 - 60 - - -halign=left -bg=#444444 - - - - Relation - - 160 - 130 - 60 - 70 - - lt=<<<- - 40.0;50.0;10.0;10.0 - - - Relation - - 290 - 130 - 60 - 70 - - lt=<<<- - 40.0;10.0;10.0;50.0 - - - UMLObject - - 320 - 320 - 100 - 60 - - Bosshard -Arno -62 -halign=left - - - - UMLObject - - 140 - 450 - 100 - 60 - - -halign=left -bg=#444444 - - - - Relation - - 110 - 420 - 170 - 80 - - lt=<<<- - 30.0;60.0;10.0;60.0;10.0;10.0;150.0;10.0;150.0;60.0;130.0;60.0 - - - UMLObject - - 370 - 530 - 100 - 60 - - -halign=left -bg=#444444 - - - - UMLObject - - 370 - 440 - 100 - 60 - - Mueller -Max -40 -halign=left - - - - Relation - - 460 - 460 - 50 - 120 - - lt=<<<- - 10.0;10.0;30.0;10.0;30.0;100.0;10.0;100.0 - - - Relation - - 340 - 460 - 50 - 120 - - lt=<<<- - 30.0;100.0;10.0;100.0;10.0;10.0;30.0;10.0 - - - Text - - 180 - 510 - 40 - 30 - - a) -style=wordwrap - - - - Text - - 410 - 590 - 40 - 30 - - b) -style=wordwrap - - - - UMLObject - - 210 - 740 - 100 - 60 - - -halign=left -bg=#444444 - - - - Text - - 250 - 800 - 40 - 30 - - c) -style=wordwrap - - - - UMLObject - - 90 - 670 - 100 - 60 - - Schmid -Anna -32 -halign=left - - - - UMLObject - - 210 - 600 - 100 - 60 - - Mueller -Max -40 -halign=left - - - - UMLObject - - 330 - 670 - 100 - 60 - - Bosshard -Arno -62 -halign=left - - - - Relation - - 300 - 720 - 100 - 70 - - lt=<<<- - 80.0;10.0;10.0;50.0 - - - Relation - - 300 - 620 - 100 - 70 - - lt=<<<- - 10.0;10.0;80.0;50.0 - - - Relation - - 130 - 620 - 100 - 70 - - lt=<<<- - 10.0;50.0;80.0;10.0 - - - Relation - - 130 - 720 - 100 - 70 - - lt=<<<- - 80.0;50.0;10.0;10.0 - - - UMLObject - - 440 - 930 - 100 - 60 - - -halign=left -bg=#444444 - - - - Text - - 480 - 990 - 40 - 30 - - d) -style=wordwrap - - - - UMLObject - - 320 - 850 - 100 - 60 - - Schmid -Anna -32 -halign=left - - - - UMLObject - - 560 - 850 - 100 - 60 - - Mueller -Max -40 -halign=left - - - - Relation - - 530 - 900 - 100 - 80 - - lt=<<<- - 80.0;10.0;10.0;60.0 - - - Relation - - 350 - 900 - 110 - 80 - - lt=<<<- - 90.0;60.0;10.0;10.0 - - - Relation - - 410 - 870 - 170 - 30 - - lt=<<<- - 10.0;10.0;150.0;10.0 - - diff --git a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/Makefile b/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/Makefile deleted file mode 100644 index 44f82b3..0000000 --- a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -SNP_SHARED_MAKEFILE := $(if $(SNP_SHARED_MAKEFILE),$(SNP_SHARED_MAKEFILE),"~/snp/shared.mk") - -TARGET := bin/personen-verwaltung -# BEGIN-STUDENTS-TO-ADD-CODE -MODULES := -# END-STUDENTS-TO-ADD-CODE -SOURCES := src/main.c $(MODULES) -TSTSOURCES := tests/tests.c $(MODULES) - - -include $(SNP_SHARED_MAKEFILE) - -# CFLAGS += -Werror diff --git a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/mainpage.dox b/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/mainpage.dox deleted file mode 100644 index 05d1c72..0000000 --- a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/mainpage.dox +++ /dev/null @@ -1,8 +0,0 @@ -/** - * @mainpage SNP - P07 Linked List - * - * @section Purpose - * - * This is a lab on usage of arrays. - * - */ diff --git a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/src/main.c b/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/src/main.c deleted file mode 100644 index 3dd772a..0000000 --- a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/src/main.c +++ /dev/null @@ -1,29 +0,0 @@ -/* ---------------------------------------------------------------------------- - * -- _____ ______ _____ - - * -- |_ _| | ____|/ ____| - - * -- | | _ __ | |__ | (___ Institute of Embedded Systems - - * -- | | | '_ \| __| \___ \ Zuercher Hochschule Winterthur - - * -- _| |_| | | | |____ ____) | (University of Applied Sciences) - - * -- |_____|_| |_|______|_____/ 8401 Winterthur, Switzerland - - * ---------------------------------------------------------------------------- - */ -/** - * @file - * @brief Lab implementation - */ -#include -#include - -/** - * @brief Main entry point. - * @param[in] argc The size of the argv array. - * @param[in] argv The command line arguments... - * @returns Returns EXIT_SUCCESS (=0) on success, EXIT_FAILURE (=1) there is an expression syntax error. - */ -int main(int argc, char* argv[]) -{ - // BEGIN-STUDENTS-TO-ADD-CODE - - // END-STUDENTS-TO-ADD-CODE - return EXIT_SUCCESS; -} diff --git a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/tests/tests.c b/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/tests/tests.c deleted file mode 100644 index 408182d..0000000 --- a/P06_Personen_Verwaltung_Linked_List/work/personen-verwaltung/tests/tests.c +++ /dev/null @@ -1,119 +0,0 @@ -/* ---------------------------------------------------------------------------- - * -- _____ ______ _____ - - * -- |_ _| | ____|/ ____| - - * -- | | _ __ | |__ | (___ Institute of Embedded Systems - - * -- | | | '_ \| __| \___ \ Zuercher Hochschule Winterthur - - * -- _| |_| | | | |____ ____) | (University of Applied Sciences) - - * -- |_____|_| |_|______|_____/ 8401 Winterthur, Switzerland - - * ---------------------------------------------------------------------------- - */ -/** - * @file - * @brief Test suite for the given package. - */ -#include -#include -#include -#include -#include -#include -#include "test_utils.h" - -#ifndef TARGET // must be given by the make file --> see test target -#error missing TARGET define -#endif - -/// @brief alias for EXIT_SUCCESS -#define OK EXIT_SUCCESS -/// @brief alias for EXIT_FAILURE -#define FAIL EXIT_FAILURE - -/// @brief The name of the STDOUT text file. -#define OUTFILE "stdout.txt" -/// @brief The name of the STDERR text file. -#define ERRFILE "stderr.txt" - -#define TRACE_INDENT "\n " ///< allow for better stdout formatting in case of error - -// setup & cleanup -static int setup(void) -{ - remove_file_if_exists(OUTFILE); - remove_file_if_exists(ERRFILE); - return 0; // success -} - -static int teardown(void) -{ - // Do nothing. - // Especially: do not remove result files - they are removed in int setup(void) *before* running a test. - return 0; // success -} - -// tests -static void test_person_compare(void) -{ - // BEGIN-STUDENTS-TO-ADD-CODE - // arrange - - // act - CU_FAIL("missing test"); - - // assert - - // END-STUDENTS-TO-ADD-CODE -} - -static void test_list_insert(void) -{ - // BEGIN-STUDENTS-TO-ADD-CODE - // arrange - - // act - CU_FAIL("missing test"); - - // assert - - // END-STUDENTS-TO-ADD-CODE -} - -static void test_list_remove(void) -{ - // BEGIN-STUDENTS-TO-ADD-CODE - // arrange - - // act - CU_FAIL("missing test"); - - // assert - - // END-STUDENTS-TO-ADD-CODE -} - -static void test_list_clear(void) -{ - // BEGIN-STUDENTS-TO-ADD-CODE - // arrange - - // act - CU_FAIL("missing test"); - - // assert - - // END-STUDENTS-TO-ADD-CODE -} - -/** - * @brief Registers and runs the tests. - * @returns success (0) or one of the CU_ErrorCode (>0) - */ -int main(void) -{ - // setup, run, teardown - TestMainBasic("lab test", setup, teardown - , test_person_compare - , test_list_insert - , test_list_remove - , test_list_clear - ); -} diff --git a/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.docx b/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.docx deleted file mode 100644 index 063c745..0000000 Binary files a/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.docx and /dev/null differ diff --git a/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.pdf b/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.pdf deleted file mode 100644 index 5d3c386..0000000 Binary files a/P07_Prozesse_und_Threads/P09_1_Prozesse_und_Threads.pdf and /dev/null differ diff --git a/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.docx b/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.docx deleted file mode 100644 index 1966e8b..0000000 Binary files a/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.docx and /dev/null differ diff --git a/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.pdf b/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.pdf deleted file mode 100644 index 78acc4d..0000000 Binary files a/P07_Prozesse_und_Threads/P09_2_Dämon_Prozesse.pdf and /dev/null differ diff --git a/P07_Prozesse_und_Threads/README.bbl b/P07_Prozesse_und_Threads/README.bbl deleted file mode 100644 index e69de29..0000000 diff --git a/P07_Prozesse_und_Threads/README.blg b/P07_Prozesse_und_Threads/README.blg deleted file mode 100644 index bd2960c..0000000 --- a/P07_Prozesse_und_Threads/README.blg +++ /dev/null @@ -1,5 +0,0 @@ -[0] Config.pm:311> INFO - This is Biber 2.16 -[0] Config.pm:314> INFO - Logfile is 'README.blg' -[131] biber-MSWIN64:340> INFO - === -[445] Utils.pm:411> ERROR - Cannot find 'README.bcf'! -[445] Biber.pm:132> INFO - ERRORS: 1 diff --git a/P07_Prozesse_und_Threads/README.log b/P07_Prozesse_und_Threads/README.log deleted file mode 100644 index e69de29..0000000 diff --git a/P07_Prozesse_und_Threads/README.md b/P07_Prozesse_und_Threads/README.md deleted file mode 100644 index bdbd3bd..0000000 --- a/P07_Prozesse_und_Threads/README.md +++ /dev/null @@ -1,441 +0,0 @@ -# 07 - Prozesse und Threads -___ - -![](./ein_mann_orchester.png) - - -[Quelle: https://www.wikiwand.com/de/Ein-Mann-Orchester](https://www.wikiwand.com/de/Ein-Mann-Orchester) - -___ - -## 1. Übersicht -In diesem Praktikum werden wir uns mit Prozessen, Prozesshierarchien und Threads beschäftigen, um ein gutes Grundverständnis dieser Abstraktionen zu erhalten. Sie werden bestehenden Code analysieren und damit experimentieren. D.h. dies ist nicht ein «Codierungs»-Praktikum, sondern ein «Analyse»- und «Experimentier»-Praktikum. -___ - -### 1.1 Nachweis -Dieses Praktikum ist eine leicht abgewandelte Variante des ProcThreads Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins-zu-ein übernommen. - -Als Autoren des BSY Praktikums sind genannt: M. Thaler, J. Zeman. - - -___ - -## 2. Lernziele -In diesem Praktikum werden Sie sich mit Prozessen, Prozesshierarchien und Threads beschäftigen. Sie erhalten einen vertieften Einblick und Verständnis zur Erzeugung, Steuerung und Terminierung von Prozessen unter Unix/Linux und Sie werden die unterschiedlichen Eigenschaften von Prozessen und Threads kennenlernen. -* Sie können Prozesse erzeugen und die Prozesshierarchie erklären -* Sie wissen was beim Erzeugen eines Prozesses vom Elternprozess vererbt wird -* Sie wissen wie man auf die Terminierung von Kindprozessen wartet -* Sie kennen die Unterschiede zwischen Prozessen und Threads -___ - -## 3. Aufgaben -Das Betriebssystem bietet Programme um die aktuellen Prozesse und Threads darzustellen. - -Die Werkzeuge kommen mit einer Vielzahl von Optionen für die Auswahl und Darstellung der Daten, z.B. ob nur Prozesse oder auch Threads aufgelistet werden sollen, und ob alle Prozesse oder nur die «eigenen» Prozesse ausgewählt werden sollen, etc. - -Siehe die entsprechenden `man` Pages für weitere Details. - -Eine Auswahl, welche unter Umständen für die folgenden Aufgaben nützlich sind: - -| | | -| :-- | :-- | -| `ps` | Auflisten der Prozess Zustände zum gegebenen Zeitpunkt. | -| `pstree` | Darstellung der gesamten Prozesshierarchie. | -| `top` | Wie `ps`, aber die Darstellung wird in Zeitintervallen aufdatiert. | -| `htop` | Wie `top`, aber zusätzlich dazu die Auslastung der CPU in einem System mit mehreren CPUs. | -| `lscpu` | Auflisten der CPUs. | -| `cat`/`proc`/`cpuinfo` | Ähnlich zu `lscpu`, aber mit Zusatzinformationen wie enthaltene CPU Bugs (z.B. `bugs: cpu_meltdown spectre_v1 spect-re_v2 spec_store_bypass l1tf mds swapgs itlb_multihit`) | - -___ - -### 3.1 Aufgabe 1: Prozess mit fork() erzeugen - -**Ziele** - -* Verstehen, wie mit `fork()` Prozesse erzeugt werden. -* Einfache Prozesshierarchien kennenlernen. -* Verstehen, wie ein Programm, das `fork()` aufruft, durchlaufen wird. - -**Aufgaben** -1. Studieren Sie zuerst das Programm `ProcA1.c` und beschrieben Sie was geschieht. - ``` - - - ``` -2. Notieren Sie sich, was ausgegeben wird. Starten Sie das Programm und vergleichen Sie die Ausgabe mit ihren Notizen? Was ist gleich, was anders und wieso? - ``` - - - ``` - -___ - -### 3.2 Aufgabe 2: Prozess mit fork() und exec(): Programm Image ersetzen - -**Ziele** -* An einem Beispiel die Funktion `execl()` kennenlernen. -* Verstehen, wie nach `fork()` ein neues Programm gestartet wird. -**Aufgaben** -1. Studieren Sie zuerst die Programme `ProcA2.c` und `ChildProcA2.c`. -2. Starten Sie `ProcA2.e` und vergleichen Sie die Ausgabe mit der Ausgabe unter Aufgabe 1. Diskutieren und erklären Sie was gleich ist und was anders. - ``` - - - ``` -3. Benennen Sie `ChildProcA2.e` auf `ChildProcA2.f` um (Shell Befehl `mv`) und überlegen Sie, was das Programm nun ausgibt. Starten Sie `ProcA2.e` und vergleichen Sie Ihre Überlegungen mit der Programmausgabe. - ``` - - - ``` -4. Nennen Sie das Kindprogramm wieder `ChildProcA2.e` und geben Sie folgenden Befehl ein: `chmod -x ChildProcA2.e`. Starten Sie wiederum `ProcA2.e` und analysieren Sie die Ausgabe von `perror("...")`. Wieso verwenden wir `perror()`? - ``` - - - ``` - -___ - -### 3.3 Aufgabe 3: Prozesshierarchie analysieren - -**Ziele** - -* Verstehen, was `fork()` wirklich macht. -* Verstehen, was Prozesshierarchien sind. - -**Aufgaben** - -1. Studieren Sie zuerst Programm `ProcA3.c` und zeichnen Sie die entstehende Prozesshierarchie (Baum) von Hand auf. Starten Sie das Programm und verifizieren Sie ob Ihre Prozesshierarchie stimmt. -2. Mit dem Befehl `ps f` oder `pstree` können Sie die Prozesshierarchie auf dem Bildschirm ausgeben. Damit die Ausgabe von `pstree` übersichtlich ist, müssen Sie in dem Fenster, wo Sie das Programm `ProcA3.e` starten, zuerst die PID der Shell erfragen, z.B. über `echo $$`. Wenn Sie nun den Befehl `pstree -n -p pid-von-oben` eingeben, wird nur die Prozesshierarchie ausgehend von der Bash Shell angezeigt: `-n` sortiert die Prozesse numerisch, `-p` zeigt für jeden Prozess die PID an. - -**Hinweis:** alle erzeugten Prozesse müssen arbeiten (d.h. nicht terminiert sein), damit die Darstellung gelingt. Wie wird das im gegebenen Programm erreicht? - - -___ - -### 3.4 Aufgabe 4: Zeitlicher Ablauf von Prozessen - -**Ziele** - -* Verstehen, wie Kind- und Elternprozesse zeitlich ablaufen. - -**Aufgaben** - -1. Studieren Sie Programm `ProcA4.c.` Starten Sie nun mehrmals hintereinander das Programm `ProcA4.e` und vergleichen Sie die jeweiligen Outputs (leiten Sie dazu auch die Ausgabe auf verschiedene Dateien um). Was schliessen Sie aus dem Resultat? - ``` - - - ``` -**Anmerkung:** Der Funktionsaufruf `selectCPU(0)` erzwingt die Ausführung des Eltern- und Kindprozesses auf CPU 0 (siehe Modul `setCPU.c`). Die Prozedur `justWork(HARD_WORK)` simuliert CPU-Load durch den Prozess (siehe Modul `workerUtils.c`). - -___ - -### 3.5 Aufgabe 5: Waisenkinder (Orphan Processes) - -**Ziele** -* Verstehen, was mit verwaisten Kindern geschieht. - -**Aufgaben** -1. Analysieren Sie Programm `ProcA5.c`: was läuft ab und welche Ausgabe erwarten Sie? - - ``` - - - ``` -2. Starten Sie `ProcA5.e`: der Elternprozess terminiert: was geschieht mit dem Kind? - - ``` - - - ``` -3. Was geschieht, wenn der Kindprozess vor dem Elternprozess terminiert? Ändern Sie dazu im `sleep()` Befehl die Zeit von 2 Sekunden auf 12 Sekunden und verfolgen Sie mit top das Verhalten der beiden Prozesse, speziell auch die Spalte S. - ``` - - - ``` -___ - -### 3.6 Aufgabe 6: Terminierte, halbtote Prozesse (Zombies) - -**Ziele** - -* Verstehen, was ein Zombie ist. -* Eine Möglichkeit kennenlernen, um Zombies zu verhindern. - -**Aufgaben** - -1. Analysieren Sie das Programm `ProcA6.c`. -2. Starten Sie das Script `mtop` bzw. `mtop aaaa.e`. Es stellt das Verhalten der Prozesse dynamisch dar. - - **Hinweis:** `` = Zombie. -3. Starten Sie `aaaa.e` und verfolgen Sie im `mtop`-Fenster was geschieht. Was beachten Sie? - ``` - - - ``` - -4. In gewissen Fällen will man nicht auf die Terminierung eines Kindes mit `wait()`, bzw. `waitpid()` warten. Überlegen Sie sich, wie Sie in diesem Fall verhindern können, dass ein Kind zum Zombie wird. - ``` - - - ``` - -___ - -### 3.7 Aufgabe 7: Auf Terminieren von Kindprozessen warten - -**Vorbemerkung:** Diese Aufgabe verwendet Funktionen welche erst in der Vorlesung über *Inter-Process-Communication (IPC)* im Detail behandelt werden. - -Sie können diese Aufgabe bis dann aufsparen oder die verwendeten Funktionen selber via `man` Pages im benötigten Umfang kennenlernen: `man 2 kill` und `man 7 signal`. - -**Ziele** -* Verstehen, wie Informationen zu Kindprozessen abgefragt werden können. -* Die Befehle `wait()` und `waitpid()` verwenden können. - -**Aufgaben** -1. Starten Sie das Programm `ProcA7.e` und analysieren Sie wie die Ausgabe im Hauptprogramm zustande kommt und was im Kindprozess `ChildProcA7.c` abläuft. - ``` - - - ``` -2. Starten Sie `ProcA7.e` und danach nochmals mit `1` als erstem Argument. Dieser Argument Wert bewirkt, dass im Kindprozess ein ”Segmentation Error” erzeugt wird, also eine Speicherzugriffsverletzung. Welches Signal wird durch die Zugriffsverletzung an das Kind geschickt? Diese Information finden Sie im Manual mit `man 7 signal`. Schalten Sie nun core dump ein (siehe README) und starten Sie `ProcA7.e 1` erneut und analysieren Sie die Ausgabe. -``` - - -``` -**Hinweis:** ein core Dump ist ein Abbild des Speichers z.B. zum Zeitpunkt, wenn das Programm abstürzt (wie oben mit der Speicher Zugriff Verletzung). Der Dump wird im File **core** abgelegt und kann mit dem **gdb** (GNU-Debugger) gelesen werden (siehe `README`). Tippen Sie nach dem Starten des Command Line UI des `gdb where` gefolgt von list ein, damit sie den Ort des Absturzes sehen. Mit `quit` verlassen Sie **gdb** wieder. - -3. Wenn Sie `ProcA7.e 2` starten, sendet das Kind das Signal 30 an sich selbst. Was geschieht? - ``` - - - ``` -4. Wenn Sie `ProcA7.e 3` starten, sendet ProcA7.e das Signal SIGABRT (abort) an das Kind: was geschieht in diesem Fall? - ``` - - - ``` -5. Mit `ProcA7.e 4` wird das Kind gestartet und terminiert nach 5 Sekunden. Analysieren Sie wie in ProcA7.e der Lauf- bzw. Exit-Zustand des Kindes abgefragt wird (siehe dazu auch `man 3 exit`). - ``` - - - ``` -___ - -### 3.8 Aufgabe 8: Kindprozess als Kopie des Elternprozesses - -**Ziele** -* Verstehen, wie Prozessräume vererbt werden. -* Unterschiede zwischen dem Prozessraum von Eltern und Kindern erfahren. - -**Aufgaben** -1. Analysieren Sie Programm `ProcA8_1.c`: was gibt das Programm aus? - * Starten Sie `ProcA8_1.e `und überprüfen Sie Ihre Überlegungen. - * Waren Ihre Überlegungen richtig? Falls nicht, was könnten Sie falsch überlegt haben? - ``` - - - ``` -2. Analysieren Sie Programm `ProcA8_2.c`: was gibt das Programm aus? - * Starten Sie `ProcA8_2.e` und überprüfen Sie Ihre Überlegungen. - * Waren Ihre Überlegungen richtig? Falls nicht, was könnten Sie falsch gemacht haben? - * Kind und Eltern werden in verschiedener Reihenfolge ausgeführt: ist ein Unterschied ausser der Reihenfolge festzustellen? - ``` - - - ``` -3. Analysieren Sie Programm `ProcA8_3.c` und Überlegen Sie, was in die Datei `AnyOutPut.txt` geschrieben wird, wer schreibt alles in diese Datei (sie wird ja vor `fork()` geöffnet) und wieso ist das so? - * Starten Sie `ProcA8_3.e` und überprüfen Sie Ihre Überlegungen. - * Waren Ihre Überlegungen richtig? Falls nicht, wieso nicht? - ``` - - - ``` - -___ - -### 3.9 Aufgabe 9: Unterschied von Threads gegenüber Prozessen - -**Ziele** -* Den Unterschied zwischen Thread und Prozess kennenlernen. -* Problemstellungen um Threads kennenlernen. -* Die `pthread`-Implementation kennen lernen. - -**Aufgaben** -1. Studieren Sie Programm `ProcA9.c` und überlegen Sie, wie die Programmausgabe aussieht. Vergleichen Sie Ihre Überlegungen mit denjenigen aus Aufgabe 8.2 b) (`Pro-cA8_2.e`). - * Starten Sie `ProcA9.e` und vergleichen das Resultat mit Ihren Überlegungen. - * Was ist anders als bei `ProcA8_2.e`? -``` - - -``` - - -2. Setzen Sie in der Thread-Routine vor dem Befehl `pthread_exit()` eine unendliche Schleife ein, z.B. `while(1) { }`; . - * Starten Sie das Programm und beobachten Sie das Verhalten mit `top`. Was beobachten Sie und was schliessen Sie daraus? - - **Hinweis:** wenn Sie in `top` den Buchstaben H eingeben, werden die Threads einzeln dargestellt. - * Kommentieren Sie im Hauptprogram die beiden `pthread_join()` Aufrufe aus und starten Sie das Programm. Was geschieht? Erklären Sie das Verhalten. - -``` - - -``` - - -___ - -### 3.10 Aufgabe 10 (optional): - -#### 3.10.1 Übersicht -Dieser Teil des Praktikums behandelt spezielle Prozesse: die Dämon Prozesse («daemon pro-cesses»). Es ist gedacht als Zusatz zum Basis Praktikum über Prozesse und Threads. - -Auch dieser Teil ist ein «Analyse»- und «Experimentier»-Praktikum. -___ - -##### 3.10.1.1 Nachweis -Dieses Praktikum ist eine leicht abgewandelte Variante des ProcThreads Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins-zu-ein übernommen. - -Als Autoren des BSY Praktikums sind genannt: M. Thaler, J. Zeman. - - -___ - -#### 3.10.2 Lernziele -In diesem Praktikum werden Sie sich mit Dämon Prozessen beschäftigen. -* Sie können die Problemstellung der Dämon Prozesse erklären -* Sie können einen Dämon Prozess kreieren -* Sie können aus dem Dämon Prozess mit der Umgebung kommunizieren -* -___ - -#### 3.10.3 Aufgabe: Dämon Prozesse - -**Ziele** -* Problemstellungen um Daemons kennenlernen: - * wie wird ein Prozess zum Daemon? - * wie erreicht man, dass nur ein Daemon vom gleichen Typ aktiv ist? - * wie teilt sich ein Daemon seiner Umwelt mit? - * wo "lebt" ein Daemon? - -**Einleitung** - -Für diese Aufgabe haben wir einen Daemon implementiert: **MrTimeDaemon** gibt auf Anfrage die Systemzeit Ihres Rechners bekannt. Abfragen können Sie diese Zeit mit dem Programm `WhatsTheTimeMr localhost`. Die Kommunikation zwischen den beiden Prozessen haben wir mit TCP/IP Sockets implementiert. Weitere Infos zum Daemon finden Sie nach den Aufgaben. - -Im Abschnitt 4 finden Sie Zusatzinformationen über diese Implementation eines Dämon Prozesses plus weiterführende Informationen. - -**Aufgaben** - -1. Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit `make` und starten Sie das Programm **PlapperMaul** in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden *Hallo, ich bins.... Pidi* plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl `ps` können Sie Ihre aktiven Prozesse auflisten, auch **PlapperMaul**. Überlegen Sie sich zuerst, was mit **PlapperMaul** geschieht, wenn Sie das Fenster schliessen: läuft **PlapperMaul** weiter? Was geschieht mit **PlapperMaul** wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen? - ``` - - - ``` - -2. Starten Sie nun das Programm bzw. den Daemon **MrTimeDaemon**. Stellen Sie die gleichen Überlegungen an wie mit **PlapperMaul** und testen Sie wiederum, ob Ihre Überlegungen stimmen. Ob **MrTimeDaemon** noch läuft können Sie feststellen, indem Sie die Zeit abfragen oder den Befehl `ps ajx | grep MrTimeDaemon` eingeben: was fällt Ihnen am Output auf? Was schliessen Sie aus Ihren Beobachtungen? - ``` - - - ``` - -3. Starten Sie **MrTimeDaemon** erneut, was geschieht? - ``` - - - ``` - -4. Stoppen Sie nun **MrTimeDaemon** mit `killall MrTimeDaemon`. -5. Starten Sie **MrTimeDaemon** und fragen Sie mit `WhatsTheTimeMr localhost` oder mit `WhatsTheTimeMr 127.0.0.1` die aktuelle Zeit auf Ihrem Rechner ab. - - - **Optional:** - Fragen Sie die Zeit bei einem Ihrer Kollegen ab. Dazu muss beim Server (dort wo **MrTimeDaemon** läuft) ev. die Firewall angepasst werden. Folgende Befehle müssen dazu mit **root-Privilegien** ausgeführt werden: - - ```bash - iptables-save > myTables.txt # sichert die aktuelle Firewall - iptables -I INPUT 1 -p tcp --dport 65534 -j ACCEPT - iptables -I OUTPUT 2 -p tcp --sport 65534 -j ACCEPT - ``` - - Nun sollten Sie über die IP-Nummer oder über den Rechner-Namen auf den **TimeServer** mit `WhatsTheTimeMr` zugreifen können. - Die Firewall können Sie mit folgendem Befehl wiederherstellen: - ```bash - iptables-restore myTables.txt - ``` - -6. Studieren Sie `MrTimeDaemon.c`, `Daemonizer.c` und `TimeDaemon.c` und analysieren Sie, wie die Daemonisierung abläuft. Entfernen Sie die Kommentare im Macro `Out-PutPIDs` am Anfang des Moduls `Daemonizer.c`. Übersetzen Sie die Programme mit make und starten Sie `MrTimeDaemon` erneut. Analysieren Sie die Ausgabe, was fällt Ihnen auf? Notieren Sie alle für die vollständige Daemonisierung notwendigen Schritte. - ``` - - - ``` - -7. Setzen Sie beim Aufruf von `Daemonizer()` in `MrTimeDaemon.c` anstelle von `lock-FilePath` den Null-Zeiger `NULL` ein. Damit wird keine lock-Datei erzeugt. Übersetzen Sie die Programme und starten Sie erneut `MrTimedaemon`. Was geschieht bzw. wie können Sie feststellen, was geschehen ist? - - **Hinweis:** lesen Sie das log-File: `/tmp/timeDaemon.log.` - ``` - - - ``` - - Wenn Sie noch Zeit und Lust haben: messen Sie die Zeit, zwischen Start der Zeitanfrage und Eintreffen der Antwort. Dazu müssen Sie die Datei `WhatsTheTimeMr.c` entsprechend anpassen. - -___ - -#### 3.10.4 Zusatzinformationen -___ - -##### 3.10.4.1 Diese Implementation - -Dieser Daemon besteht aus den 3 Komponenten. - -**Hauptprogramm: MrTimeDaemon.c** - -Hier werden die Pfade für die lock-Datei, die log-Datei und der ”Aufenthaltsort” des Daemons gesetzt. Die lock-Datei wird benötigt um sicherzustellen, dass der Daemon nur einmal gestartet werden kann. In die lock-Datei schreibt der Daemon z.B. seine PID und sperrt sie dann für Schreiben. Wird der Daemon ein zweites Mal gestartet und will seine PID in diese Datei schreiben, erhält er eine Fehlermeldung und terminiert (es soll ja nur ein Daemon arbeiten). Terminiert der Daemon, wird die Datei automatisch freigegeben. Weil Daemonen sämtliche Kontakte mit ihrer Umwelt im Normalfall abbrechen und auch kein Kontrollterminal besitzen, ist es sinnvoll, zumindest die Ausgabe des Daemons in eine log-Datei umzuleiten. Dazu stehen einige Systemfunktionen für Logging zur Verfügung. Der Einfachheit halber haben wir hier eine normale Datei im Verzeichnis `/tmp` gewählt. - -> **Anmerkung:** die Wahl des Verzeichnisses `/tmp` für die lock- und log-Datei ist für den normalen Betrieb problematisch, weil der Inhalt dieses Verzeichnisses jederzeit gelöscht werden kann, bzw. darf. Wir haben dieses Verzeichnis gewählt, weil wir die beiden Dateien nur für die kurze Zeit des Praktikums benötigen. - -Der Daemon erbt sein Arbeitsverzeichnis vom Elternprozesse, er sollte deshalb in ein festes Verzeichnis des Systems wechseln, um zu verhindern, dass er sich in einem montierten (gemounteten) Verzeichnis aufhält, das dann beim Herunterfahren nicht demontiert werden könnte (wir haben hier wiederum `/tmp` gewählt). - -**Daemonizer: Daemonizer.c** - -Der Daemonizer macht aus dem aktuellen Prozess einen Daemon. Z.B. sollte er Signale (eine Art Softwareinterrupts) ignorieren: wenn Sie die CTRL-C Taste während dem Ausführen eines Vordergrundprozess drücken, erhält dieser vom Betriebssystem das Signal SIGINT und bricht seine Ausführung ab. Weiter sollte er die Dateierzeugungsmaske auf 0 setzen (Dateizugriffsrechte), damit kann er beim Öffnen von Dateien beliebige Zugriffsrechte verlangen (die Dateierzeugungsmaske erbt er vom Elternprozess). Am Schluss startet der Daemonizer das eigentliche Daemonprogramm: TimeDaemon.e. - -**Daemonprogramm: TimeDaemon.c** - -Das Daemonprogramm wartet in einer unendlichen Schleife auf Anfragen zur Zeit und schickt die Antwort an den Absender zurück. Die Datenkommunikation ist, wie schon erwähnt, mit Sockets implementiert, auf die wir aber im Rahmen dieses Praktikums nicht weiter eingehen wollen (wir stellen lediglich Hilfsfunktionen zur Verfügung). -___ - -##### 3.10.4.2 Zusatzinformation zu Dämon Prozessen - -Dämonen oder englisch Daemons sind eine spezielle Art von Prozessen, die vollständig unabhängig arbeiten, d.h. ohne direkte Interaktion mit dem Anwender. Dämonen sind Hintergrundprozesse und terminieren i.A. nur, wenn das System heruntergefahren wird oder abstürzt. Dämonen erledigen meist Aufgaben, die periodisch ausgeführt werden müssen, z.B. Überwachung von Systemkomponenten, abfragen, ob neue Mails angekommen sind, etc. - -Ein typisches Beispiel unter Unix ist der Printer Daemon `lpd`, der periodisch nachschaut, ob ein Anwender eine Datei zum Ausdrucken hinterlegt hat. Wenn ja, schickt er die Datei auf den Drucker. - -Hier wird eine weitere Eigenschaft von Daemons ersichtlich: meist kann nur ein Dämon pro Aufgabe aktiv sein: stellen Sie sich vor, was passiert, wenn zwei Druckerdämonen gleichzeitig arbeiten. Andererseits muss aber auch dafür gesorgt werden, dass ein Dämon wieder gestartet wird, falls er stirbt. - -___ - - - -___ - -## 4. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| | Sie können die gestellten Fragen erklären. | | -| 1 | Prozess mit `fork()` erzeugen | 0.5 | -| 2 | Prozess mit `fork()` und `exec()`: Programm Image ersetzen | 0.5 | -| 3 | Prozesshierarchie analysieren | 0.5 | -| 4 | Zeitlicher Ablauf von Prozessen | 0.5 | -| 5 | Waisenkinder (Orphan Processes) | 0.5 | -| 6 | Terminierte, halbtote Prozesse (Zombies) | 0.5 | -| 7 | Auf Terminieren von Kindprozessen warten | 0.5 | -| 8 | Kindprozess als Kopie des Elternprozesses | 0.5 | -| 9 | Unterschied von Threads gegenüber Prozessen | 0.5 | -| 10 | Dämon Prozesse | (4) | - - -___ -Version: 11.01.2022 diff --git a/P07_Prozesse_und_Threads/README_P02.md b/P07_Prozesse_und_Threads/README_P02.md deleted file mode 100644 index 13599b8..0000000 --- a/P07_Prozesse_und_Threads/README_P02.md +++ /dev/null @@ -1,149 +0,0 @@ -# 09/02 - Dämon Prozesse - -___ - -![](./daemon.png) - -___ - -## 1. Übersicht -Dieser Teil des Praktikums behandelt spezielle Prozesse: die Dämon Prozesse («daemon pro-cesses»). Es ist gedacht als Zusatz zum Basis Praktikum über Prozesse und Threads. - -Auch dieser Teil ist ein «Analyse»- und «Experimentier»-Praktikum. - - -___ - -### 1.1 Nachweis -Dieses Praktikum ist eine leicht abgewandelte Variante des ProcThreads Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins-zu-ein übernommen. - -Als Autoren des BSY Praktikums sind genannt: M. Thaler, J. Zeman. - -___ - -## 2. Lernziele -In diesem Praktikum werden Sie sich mit Dämon Prozessen beschäftigen. -* Sie können die Problemstellung der Dämon Prozesse erklären -* Sie können einen Dämon Prozess kreieren -* Sie können aus dem Dämon Prozess mit der Umgebung kommunizieren -* -___ - -## 3. Aufgabe: Dämon Prozesse - -**Ziele** -* Problemstellungen um Daemons kennenlernen: - * wie wird ein Prozess zum Daemon? - * wie erreicht man, dass nur ein Daemon vom gleichen Typ aktiv ist? - * wie teilt sich ein Daemon seiner Umwelt mit? - * wo "lebt" ein Daemon? - -**Einleitung** - -Für diese Aufgabe haben wir einen Daemon implementiert: **MrTimeDaemon** gibt auf Anfrage die Systemzeit Ihres Rechners bekannt. Abfragen können Sie diese Zeit mit dem Programm `WhatsTheTimeMr localhost`. Die Kommunikation zwischen den beiden Prozessen haben wir mit TCP/IP Sockets implementiert. Weitere Infos zum Daemon finden Sie nach den Aufgaben. - -Im Abschnitt 4 finden Sie Zusatzinformationen über diese Implementation eines Dämon Prozesses plus weiterführende Informationen. - -**Aufgaben** - -1. Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit `make` und starten Sie das Programm **PlapperMaul** in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden *Hallo, ich bins.... Pidi* plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl `ps` können Sie Ihre aktiven Prozesse auflisten, auch **PlapperMaul**. Überlegen Sie sich zuerst, was mit **PlapperMaul** geschieht, wenn Sie das Fenster schliessen: läuft **PlapperMaul** weiter? Was geschieht mit **PlapperMaul** wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen? -``` - - -``` - -2. Starten Sie nun das Programm bzw. den Daemon **MrTimeDaemon**. Stellen Sie die gleichen Überlegungen an wie mit **PlapperMaul** und testen Sie wiederum, ob Ihre Überlegungen stimmen. Ob **MrTimeDaemon** noch läuft können Sie feststellen, indem Sie die Zeit abfragen oder den Befehl `ps ajx | grep MrTimeDaemon` eingeben: was fällt Ihnen am Output auf? Was schliessen Sie aus Ihren Beobachtungen? -``` - - -``` - -3. Starten Sie **MrTimeDaemon** erneut, was geschieht? -``` - - -``` - -4. Stoppen Sie nun **MrTimeDaemon** mit `killall MrTimeDaemon`. -5. Starten Sie **MrTimeDaemon** und fragen Sie mit `WhatsTheTimeMr localhost` oder mit `WhatsTheTimeMr 127.0.0.1` die aktuelle Zeit auf Ihrem Rechner ab. - - -**Optional:** -Fragen Sie die Zeit bei einem Ihrer Kollegen ab. Dazu muss beim Server (dort wo **MrTimeDaemon** läuft) ev. die Firewall angepasst werden. Folgende Befehle müssen dazu mit **root-Privilegien** ausgeführt werden: - -```bash -iptables-save > myTables.txt # sichert die aktuelle Firewall -iptables -I INPUT 1 -p tcp --dport 65534 -j ACCEPT -iptables -I OUTPUT 2 -p tcp --sport 65534 -j ACCEPT -``` - -Nun sollten Sie über die IP-Nummer oder über den Rechner-Namen auf den **TimeServer** mit `WhatsTheTimeMr` zugreifen können. -Die Firewall können Sie mit folgendem Befehl wiederherstellen: -```bash -iptables-restore myTables.txt -``` - -6. Studieren Sie `MrTimeDaemon.c`, `Daemonizer.c` und `TimeDaemon.c` und analysieren Sie, wie die Daemonisierung abläuft. Entfernen Sie die Kommentare im Macro `Out-PutPIDs` am Anfang des Moduls `Daemonizer.c`. Übersetzen Sie die Programme mit make und starten Sie `MrTimeDaemon` erneut. Analysieren Sie die Ausgabe, was fällt Ihnen auf? Notieren Sie alle für die vollständige Daemonisierung notwendigen Schritte. -``` - - -``` - -7. Setzen Sie beim Aufruf von `Daemonizer()` in `MrTimeDaemon.c` anstelle von `lock-FilePath` den Null-Zeiger `NULL` ein. Damit wird keine lock-Datei erzeugt. Übersetzen Sie die Programme und starten Sie erneut `MrTimedaemon`. Was geschieht bzw. wie können Sie feststellen, was geschehen ist? - - **Hinweis:** lesen Sie das log-File: `/tmp/timeDaemon.log.` -``` - - -``` - -Wenn Sie noch Zeit und Lust haben: messen Sie die Zeit, zwischen Start der Zeitanfrage und Eintreffen der Antwort. Dazu müssen Sie die Datei `WhatsTheTimeMr.c` entsprechend anpassen. - -___ - -## 4. Zusatzinformationen -___ - -### 4.1 Diese Implementation - -Dieser Daemon besteht aus den 3 Komponenten. - -**Hauptprogramm: MrTimeDaemon.c** - -Hier werden die Pfade für die lock-Datei, die log-Datei und der ”Aufenthaltsort” des Daemons gesetzt. Die lock-Datei wird benötigt um sicherzustellen, dass der Daemon nur einmal gestartet werden kann. In die lock-Datei schreibt der Daemon z.B. seine PID und sperrt sie dann für Schreiben. Wird der Daemon ein zweites Mal gestartet und will seine PID in diese Datei schreiben, erhält er eine Fehlermeldung und terminiert (es soll ja nur ein Daemon arbeiten). Terminiert der Daemon, wird die Datei automatisch freigegeben. Weil Daemonen sämtliche Kontakte mit ihrer Umwelt im Normalfall abbrechen und auch kein Kontrollterminal besitzen, ist es sinnvoll, zumindest die Ausgabe des Daemons in eine log-Datei umzuleiten. Dazu stehen einige Systemfunktionen für Logging zur Verfügung. Der Einfachheit halber haben wir hier eine normale Datei im Verzeichnis `/tmp` gewählt. - -> **Anmerkung:** die Wahl des Verzeichnisses `/tmp` für die lock- und log-Datei ist für den normalen Betrieb problematisch, weil der Inhalt dieses Verzeichnisses jederzeit gelöscht werden kann, bzw. darf. Wir haben dieses Verzeichnis gewählt, weil wir die beiden Dateien nur für die kurze Zeit des Praktikums benötigen. - -Der Daemon erbt sein Arbeitsverzeichnis vom Elternprozesse, er sollte deshalb in ein festes Verzeichnis des Systems wechseln, um zu verhindern, dass er sich in einem montierten (gemounteten) Verzeichnis aufhält, das dann beim Herunterfahren nicht demontiert werden könnte (wir haben hier wiederum `/tmp` gewählt). - -**Daemonizer: Daemonizer.c** - -Der Daemonizer macht aus dem aktuellen Prozess einen Daemon. Z.B. sollte er Signale (eine Art Softwareinterrupts) ignorieren: wenn Sie die CTRL-C Taste während dem Ausführen eines Vordergrundprozess drücken, erhält dieser vom Betriebssystem das Signal SIGINT und bricht seine Ausführung ab. Weiter sollte er die Dateierzeugungsmaske auf 0 setzen (Dateizugriffsrechte), damit kann er beim Öffnen von Dateien beliebige Zugriffsrechte verlangen (die Dateierzeugungsmaske erbt er vom Elternprozess). Am Schluss startet der Daemonizer das eigentliche Daemonprogramm: TimeDaemon.e. - -**Daemonprogramm: TimeDaemon.c** - -Das Daemonprogramm wartet in einer unendlichen Schleife auf Anfragen zur Zeit und schickt die Antwort an den Absender zurück. Die Datenkommunikation ist, wie schon erwähnt, mit Sockets implementiert, auf die wir aber im Rahmen dieses Praktikums nicht weiter eingehen wollen (wir stellen lediglich Hilfsfunktionen zur Verfügung). -___ - -### 4.2 Zusatzinformation zu Dämon Prozessen - -Dämonen oder englisch Daemons sind eine spezielle Art von Prozessen, die vollständig unabhängig arbeiten, d.h. ohne direkte Interaktion mit dem Anwender. Dämonen sind Hintergrundprozesse und terminieren i.A. nur, wenn das System heruntergefahren wird oder abstürzt. Dämonen erledigen meist Aufgaben, die periodisch ausgeführt werden müssen, z.B. Überwachung von Systemkomponenten, abfragen, ob neue Mails angekommen sind, etc. - -Ein typisches Beispiel unter Unix ist der Printer Daemon `lpd`, der periodisch nachschaut, ob ein Anwender eine Datei zum Ausdrucken hinterlegt hat. Wenn ja, schickt er die Datei auf den Drucker. - -Hier wird eine weitere Eigenschaft von Daemons ersichtlich: meist kann nur ein Dämon pro Aufgabe aktiv sein: stellen Sie sich vor, was passiert, wenn zwei Druckerdämonen gleichzeitig arbeiten. Andererseits muss aber auch dafür gesorgt werden, dass ein Dämon wieder gestartet wird, falls er stirbt. - -___ - -## 5. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| | Sie können die gestellten Fragen erklären. | | -| 1 | Dämon Prozesse | 4 | - - -___ -Version: 11.01.2022 \ No newline at end of file diff --git a/P07_Prozesse_und_Threads/daemon.png b/P07_Prozesse_und_Threads/daemon.png deleted file mode 100644 index 2dd1ae3..0000000 Binary files a/P07_Prozesse_und_Threads/daemon.png and /dev/null differ diff --git a/P07_Prozesse_und_Threads/daemon.svg b/P07_Prozesse_und_Threads/daemon.svg deleted file mode 100644 index f942a51..0000000 --- a/P07_Prozesse_und_Threads/daemon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/P07_Prozesse_und_Threads/ein_mann_orchester.png b/P07_Prozesse_und_Threads/ein_mann_orchester.png deleted file mode 100644 index 099e0eb..0000000 Binary files a/P07_Prozesse_und_Threads/ein_mann_orchester.png and /dev/null differ diff --git a/P07_Prozesse_und_Threads/ein_mann_orchester.svg b/P07_Prozesse_und_Threads/ein_mann_orchester.svg deleted file mode 100644 index 8276a72..0000000 --- a/P07_Prozesse_und_Threads/ein_mann_orchester.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.c deleted file mode 100644 index 5209c01..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.c +++ /dev/null @@ -1,178 +0,0 @@ -/****************************************************************************** -* File: Daemonizer.c -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: Einen Daemon-Prozess erzeugen -******************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//***************************************************************************** - -// Macro to write out all the PIDs... - -#define OutPutPIDs() /*printf("\nPID %d, PPID %d, GRP-ID %d\n", \ - getpid(), getppid(), getpgrp())*/ - - -//***************************************************************************** -// Function: Locks file with file descriptor fd -// Returns: 0 on success, -1 of file is already locked -// Exits: on fatal errors -//***************************************************************************** - -int lock(int fd) { - int retval, len; - struct flock lock; // data structure for file lock - char buffer[16]; - - // prepare lockfile - - lock.l_type = F_WRLCK; - lock.l_start = 0; - lock.l_whence = SEEK_SET; - lock.l_len = 0; - - retval = fcntl(fd, F_SETLK, &lock); // set file lock - if (retval < 0) { - if ((errno == EACCES) || (errno == EAGAIN)) { - return(-1); // Daemon already runs - } - else { - perror("fatal error when locking file"); - exit(-1); - } - } - - // empty the lockfile - - retval = ftruncate(fd, 0); - if (retval < 0) { - perror("fatal error when emptying lockfile"); - exit(-1); - } - - // write process ID to lockfile - - sprintf(buffer, "%d\n", getpid()); - len = strlen(buffer); - retval = write(fd, buffer, len) < len; - if (retval < 0) { - perror("fatal error when writing pid to lockfile"); - exit(-1); - } - - // set lockfile to close on exec - - retval = fcntl(fd, F_GETFD, 0); - if (retval < 0) { - perror("fatal error when reading lockfile flags"); - exit(-1); - } - retval = retval | FD_CLOEXEC; - retval = fcntl(fd, F_SETFD, retval); - if (retval < 0) { - perror("fatal error when setting lockfile flags"); - exit(-1); - } - return(0); -} - -//***************************************************************************** -// Function: Makes a deamon process and runs a daemon function -// Parameter: Daemon function -// data pointer to data to be passed to Daemonfunction -// LogFile, path of logfile, if NULL, no logfile is created -// LivDir, path, where daemon will live -// Returns: should not return -// Exits: if daemon is already runnung or on fatal errors -//***************************************************************************** - -int Daemonizer(void Daemon(void *), void *data, - const char *LockFile, const char *LogFile, const char *LivDir) { - - pid_t PID; - int fd, dummyfd, retval; - - // create a prozess and terminate parents -> parent is init - - OutPutPIDs(); - - PID = fork(); - if (PID < 0) { - perror("could not fork()"); - exit(-1); - } - else if (PID > 0) { - exit(0); // I have done my work an can exit - } - - // ---------------------------------------------------------------------- - // now I am a process detached from the parent - // an make the process -> a daemon process - - signal(SIGINT, SIG_IGN); // ignore CTRL-C - signal(SIGQUIT, SIG_IGN); // ignore quit - signal(SIGHUP, SIG_IGN); // ignore hangup of terminal - - OutPutPIDs(); - - setsid(); // make process session leader - // and processgroup leader - // no control terminal with pocess - OutPutPIDs(); - - chdir(LivDir); // change to secure directory - umask(0); // allow all access rights for files - - // set up lockfile, if required - - if (LockFile != NULL) { - fd = open(LockFile, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | - S_IRGRP | S_IROTH); - if (fd < 0) { - perror("fatal error when opening lockfile"); - exit(-1); - } - retval = lock(fd); - if (retval < 0) { - printf("\n*** daemon is already running ***\n"); - exit(0); - } - } - - // last message from daemon - - printf("\n*** daemon starts with process id: %d ***\n",getpid()); - - // close "communication" to outer world and set up logging, if required - - close(1); // close stdout - close(2); // close stderr - if (LogFile != NULL) { // open log file on stdout - enum {UserWrite=0644}; - dummyfd = open(LogFile, O_CREAT | O_APPEND | O_WRONLY,UserWrite); - if (dummyfd < 0) { - perror("could not open log file"); - exit(-1); - } - dup(1); // connect stderr to logfile - } - close(0); // now close stdin - - // now start the daemon funktion - Daemon(data); - - // should not come here - - return(0); -} - -//***************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.h b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.h deleted file mode 100644 index 3f03fab..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/Daemonizer.h +++ /dev/null @@ -1,15 +0,0 @@ -/********************************************************************* -* File: Daemonizer.h -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: einen Daemon-Prozess erzeugen -*********************************************************************/ - -#ifndef DAEMONIZER_H -#define DAEMONIZER_H - -int Daemonizer(void Daemon(void *), void *data, - const char *LockFile, const char *LogFile, const char *LivDir); - -#endif - -//------------------------------------------------------------------------ diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.c deleted file mode 100644 index af35c9f..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.c +++ /dev/null @@ -1,188 +0,0 @@ -//***************************************************************************** -// ipCom.c IP Socket Functions -// Original Author: M. Thaler, M. Pellaton (Modul BSY) -//***************************************************************************** - -//***************************************************************************** -// system includes -//***************************************************************************** - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -//***************************************************************************** -// local definitions -//***************************************************************************** - -#include "IPsockCom.h" - -//***************************************************************************** -// Function: send data buffer to host "host" with port "port" -// Parameter: hostname or IP address in dot format -// port number -// buffer -// size of buffer -// Returns: number of characters read on success, -1 if connection failed -// buffer: time data -// -//***************************************************************************** - -int getTimeFromServer(char *host, int port, char *buffer, int bufferLen) { - - int sfd, sysRet, timeOut, retval; - char stringPort[8]; - struct addrinfo hints, *aiList, *aiPtr = NULL; - - if (strcmp(host, "") == 0) { - printf("Need hostname or IP address\n"); - return(-1); - } - - sprintf(stringPort, "%d", port); - - memset(&hints, '\0', sizeof(hints)); - //hints.ai_flags = AI_CANONNAME; - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - sysRet = getaddrinfo(host, stringPort, &hints, &aiList); - if (sysRet != 0) { - printf("error getting network address for %s (%s)\n", - host, gai_strerror(sysRet)); - exit(-1); - } - - aiPtr = aiList; // search through list - while (aiPtr != 0) { - sfd = socket(aiPtr->ai_family, aiPtr->ai_socktype, aiPtr->ai_protocol); - if (sfd >= 0) { - timeOut = 100; - sysRet = 1; - while ((timeOut != 0) && (sysRet != 0)) { - sysRet = connect(sfd, aiPtr->ai_addr, aiPtr->ai_addrlen); - usleep(1000); - timeOut--; - } - if (sysRet == 0) - break; // connect successful - else - close(sfd); - } - aiPtr = aiPtr->ai_next; - } - freeaddrinfo(aiList); - if (aiPtr == NULL) { - printf("could not connect to %s\n", host); - retval = -1; - } - else - retval = 0; - - if (retval == 0) { - if (write(sfd, buffer, bufferLen) < 0) { - printf("error sending request to timer serveer\n"); - retval = -1; - } - else - retval = read(sfd, buffer, COM_BUF_SIZE); - } - close(sfd); - return(retval); -} - -//***************************************************************************** -// Function: starts "time" socket server -// Parameter: port number to listen to -// Returns: socket file descriptor if ok, -1 if error -// Exits: -//***************************************************************************** - -int StartTimeServer(int portNumber) { - - int sfd, sysRet, j; - char stringPort[8]; - struct addrinfo hints, *aiList, *aiPtr = NULL; - - sprintf(stringPort, "%d", portNumber); // portnumber to string - memset(&hints, '\0', sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = 0; - hints.ai_flags = AI_PASSIVE; - - sysRet = getaddrinfo(NULL, stringPort, &hints, &aiList); - if (sysRet != 0) { - printf("error getting network address (%s)\n", gai_strerror(sysRet)); - exit(-1); - } - - aiPtr = aiList; // search through list - while (aiPtr != 0) { - sfd = socket(aiPtr->ai_family, aiPtr->ai_socktype, aiPtr->ai_protocol); - if (sfd >= 0) { - j = 1; - sysRet = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &j, sizeof(j)); - if (sysRet < 0) - perror("cannot set socket options"); - - if (bind(sfd, aiPtr->ai_addr, aiPtr->ai_addrlen) < 0) { - perror("bind failed "); - close(sfd); - exit(-1); - } - if (listen(sfd, 5) < 0) { - close(sfd); - perror("listen failed "); - exit(-1); - } - else - break; - } - aiPtr = aiPtr->ai_next; - } - freeaddrinfo(aiList); - if (aiPtr == NULL) { - printf("could not set up a socket server\n"); - exit(-1); - } - return(sfd); -} - -//***************************************************************************** -// Function: Reads data from client -// Parameter: socket file descriptor -// buffer to place data -// Returns: current socket descriptor on success, < 0 on failure -// Exits: none -//***************************************************************************** - - -int WaitForClient(int sfd, char *buffer) { - - int cfd, retval, addrlen; - struct sockaddr_in addr; - - addrlen = sizeof(struct sockaddr_in); - cfd = accept(sfd,(struct sockaddr *)&addr,(socklen_t *)&addrlen); - if (cfd >= 0) { - retval = read(cfd, buffer, COM_BUF_SIZE); - retval = cfd; - } - else - retval = cfd; - return(retval); -} - -//***************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.h b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.h deleted file mode 100644 index 1fb8c83..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/IPsockCom.h +++ /dev/null @@ -1,20 +0,0 @@ -//***************************************************************************** -// ipCom.c IP Socket Functions -// Original Autor: M. Thaler, M. Pellaton (Modul BSY) -//***************************************************************************** - -#ifndef IP_COM_SOCKETS -#define IP_COM_SOCKETS - -#define COM_BUF_SIZE 512 - -#define PIDperror()\ - fprintf(stderr,"fatal error, daemon with PID %d: ",getpid()); - -int getTimeFromServer(char *host, int port, char *buffer, int bufferLen); -int StartTimeServer(int PortNumber); -int WaitForClient(int sfd, char *buffer); - -#endif - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/MrTimeDaemon.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/MrTimeDaemon.c deleted file mode 100644 index f84926f..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/MrTimeDaemon.c +++ /dev/null @@ -1,44 +0,0 @@ -/********************************************************************* -* File: MrTimeDaemon.c -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: einen Daemon-Prozess erzeugen -*********************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include "Daemonizer.h" -#include "TimeDaemon.h" - -#define STRING_LENGTH 128 - -//-------------------------------------------------------------------- - -int main(void) { - pid_t pid; - int status; - const char *lockfilePath = "/tmp/timeDaemon.lock"; - //const char *lockfilePath = NULL; - const char *logfilePath = "/tmp/timeDaemon.log"; - const char *livingPath = "/tmp"; - const char *myName = "I am Mr. Time Daemon on \n"; - - - if ((pid = fork()) == 0) - Daemonizer(TimeDaemon, (void *)myName, - lockfilePath, logfilePath, livingPath); - else { - assert(pid > 0); - wait(&status); // wait for Daemonizer to exit - // after having forked the "Daemon" - if (WEXITSTATUS(status) != 0) - printf("*** Daemonizer failed ***\n"); - } - -} - -//-------------------------------------------------------------------- diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/PlapperMaul.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/PlapperMaul.c deleted file mode 100644 index 2a2db97..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/PlapperMaul.c +++ /dev/null @@ -1,21 +0,0 @@ -/********************************************************************* -* File: PlapperMaul.c -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: plappern -*********************************************************************/ - -#include -#include -#include - -//-------------------------------------------------------------------- - -int main(void) { - - while (1) { - printf("Hallo, ich bins.... Pidi %d\n", getpid()); - usleep(500000); - } -} - -//-------------------------------------------------------------------- diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.c deleted file mode 100644 index fcbc568..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.c +++ /dev/null @@ -1,75 +0,0 @@ -/****************************************************************************** -* File: TimeDaemon.c -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: the daemon code -******************************************************************************/ - -//***************************************************************************** -// system includes -//***************************************************************************** - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//***************************************************************************** -// local includes -//***************************************************************************** - -#include "TimeDaemon.h" -#include "TimeDaemonDefs.h" -#include "IPsockCom.h" - -//***************************************************************************** -// Function: TimeDeamon -// Parameter: data: expects here pointer to string -//***************************************************************************** - -void TimeDaemon(void *data) { - - TimeData tData; - char buffer[COM_BUF_SIZE]; - struct tm MyTime; - time_t ActualTime; - int sfd, cfd; - - - printf("%s\n", (char *)data); - - // start server - sfd = StartTimeServer(TIME_PORT); - if (sfd < 0) { - perror("could not start socket server"); - exit(-1); - } - while (1) { - - cfd = WaitForClient(sfd, buffer); - if ((strcmp(buffer, REQUEST_STRING) == 0) && (cfd >= 0)) { - - time(&ActualTime); - MyTime = *localtime(&ActualTime); - - tData.hours = MyTime.tm_hour; - tData.minutes = MyTime.tm_min; - tData.seconds = MyTime.tm_sec; - tData.day = MyTime.tm_mday; - tData.month = MyTime.tm_mon + 1; - tData.year = MyTime.tm_year + 1900; - gethostname(tData.servername, HOST_NAM_LEN); - write(cfd, (char *)(&tData), sizeof(tData)); - } - } - // if we should somehow come here (how ?) - close(sfd); - exit(0); -} - -//***************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.h b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.h deleted file mode 100644 index ddc898a..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemon.h +++ /dev/null @@ -1,14 +0,0 @@ -/****************************************************************************** -* File: TimeDaemon.h -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: function prototype of time daemon -******************************************************************************/ - -#ifndef TIME_DAEMON -#define TIME_DAEMON - -void TimeDaemon(void *); - -#endif - -//***************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemonDefs.h b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemonDefs.h deleted file mode 100644 index d29f19d..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/TimeDaemonDefs.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** -* File: TimeDaemonDefs.h -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: Data Definitions for TimeDaemon -******************************************************************************/ - -#ifndef TIME_DAEMON_DEFS -#define TIME_DAEMON_DEFS - -#define HOST_NAM_LEN 32 - -#define TIME_PORT 65534 - -#define REQUEST_STRING "requestTimeFromServer" - -// data structure receiving from time daemon - -typedef struct { - int hours; - int minutes; - int seconds; - int day; - int month; - int year; - char servername[HOST_NAM_LEN]; -} TimeData, *TimeDataPtr; - -#endif - -//***************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/WhatsTheTimeMr.c b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/WhatsTheTimeMr.c deleted file mode 100644 index 5180382..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/WhatsTheTimeMr.c +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** -* File: WhatsTheTimeMr.c -* Original Autor: M. Thaler (Modul BSY) -* Aufgabe: Ask MrTimeDaemon for the time -******************************************************************************/ - -//***************************************************************************** -// system includes -//***************************************************************************** - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // required by inet_aton - -//***************************************************************************** -// local includes -//***************************************************************************** - -#include "TimeDaemon.h" -#include "TimeDaemonDefs.h" -#include "IPsockCom.h" - -//***************************************************************************** -// Function: main() -// Parameter: hostname or IP address in dot format -//***************************************************************************** - -int main(int argc, char *argv[]) { - - char buffer[COM_BUF_SIZE]; - char hostname[64]; - TimeDataPtr tDataPtr; - int j; - - if (argc < 2) { - printf("*** no hostname or IP-address -> using localhost ***\n"); - strcpy(hostname, "localhost"); - } else { - strcpy(hostname, argv[1]); - } - - strcpy(buffer,REQUEST_STRING); - j = getTimeFromServer(hostname, TIME_PORT, buffer, sizeof(buffer)); - if (j < 0) - printf("no response from %s\n", argv[1]); - else { - tDataPtr = (TimeDataPtr)(buffer); - printf("\nIt's "); - printf("%02d:%02d:%02d", - tDataPtr->hours, tDataPtr->minutes,tDataPtr->seconds); - printf(" the %d.%d.%d on \"%s\"\n\n", - tDataPtr->day, tDataPtr->month, - tDataPtr->year, tDataPtr->servername); - } - exit(0); -} - -//***************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/makefile b/P07_Prozesse_und_Threads/work/Daemon_Prozesse/makefile deleted file mode 100644 index 32af073..0000000 --- a/P07_Prozesse_und_Threads/work/Daemon_Prozesse/makefile +++ /dev/null @@ -1,35 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -g -std=gnu99 -EXENAMES= MrTimeDaemon.e -EXENAMEC= WhatsTheTimeMr.e -EXENAMEP= PlapperMaul.e -LIBNAME= - -compile: $(EXENAMES) $(EXENAMEC) $(EXENAMEP) - -$(EXENAMES): MrTimeDaemon.o IPsockCom.o Daemonizer.o TimeDaemon.o - $(CMP) $(CMPFLAGS) MrTimeDaemon.o IPsockCom.o Daemonizer.o TimeDaemon.o $(LIBNAME) -o $(EXENAMES) - -$(EXENAMEC): WhatsTheTimeMr.o IPsockCom.o - $(CMP) $(CMPFLAGS) WhatsTheTimeMr.o IPsockCom.o $(LIBNAME) -o $(EXENAMEC) - -$(EXENAMEP): PlapperMaul.o - $(CMP) $(CMPFLAGS) PlapperMaul.o $(LIBNAME) -o $(EXENAMEP) - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f $(EXENAMEC) $(EXENAMES) $(EXENAMEP) - rm -f *.o - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/ProcA1.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/ProcA1.c deleted file mode 100644 index 9b37481..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/ProcA1.c +++ /dev/null @@ -1,53 +0,0 @@ -//*************************************************************************** -// File: ProcA1.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - int status; - int i; - - i = 5; - - printf("\n\ni vor fork: %d\n\n", i); - - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - i++; - printf("\n... ich bin das Kind %d mit i=%d, ", getpid(),i); - printf("meine Eltern sind %d \n", getppid()); - break; - default: - i--; - printf("\n... wir sind die Eltern %d mit i=%d ", getpid(), i); - printf("und Kind %d,\n unsere Eltern sind %d\n", pid, getppid()); - wait(&status); - break; - } - printf("\n. . . . . und wer bin ich ?\n\n"); - exit(0); -} - -//*************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/makefile deleted file mode 100644 index fa951bf..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe01/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAM1= ProcA1.e -FNAM1= ProcA1 -LIBNAME= - -$(EXENAM1): $(FNAM1).o - $(CMP) $(FNAM1).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAM1) - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ChildProcA2.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ChildProcA2.c deleted file mode 100644 index 470bcde..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ChildProcA2.c +++ /dev/null @@ -1,38 +0,0 @@ -//*************************************************************************** -// File: ChildProcA3.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: arg[0]: Programmname, arg[1]: i -//*************************************************************************** - -int main(int argc, char *argv[]) { - - int i; - - if (argv[1] == NULL) { - printf("argument missing\n"); - exit(-1); - } - else - i = atoi(argv[1]); // convert string argv[1] to integer i - // argv[1] is a number passed to child - - printf("\n... ich bin das Kind %d mit i=%d, ", getpid(),i); - printf("meine Eltern sind %d \n", getppid()); - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ProcA2.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ProcA2.c deleted file mode 100644 index 1120825..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/ProcA2.c +++ /dev/null @@ -1,54 +0,0 @@ -//*************************************************************************** -// File: ProcA3.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - int status; - int i, retval; - char str[8]; - - i = 5; - - printf("\n\ni vor fork: %d\n\n", i); - - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - i++; - sprintf(str, "%d",i); // convert integer i to string str - retval = execl("./ChildProcA2.e", "ChildProcA2.e", str, NULL); - if (retval < 0) perror("\nexecl not successful"); - break; - default: - i--; - printf("\n... wir sind die Eltern %d mit i=%d ", getpid(), i); - printf("und Kind %d,\n unsere Eltern sind %d\n", pid, getppid()); - wait(&status); - break; - } - printf("\n. . . . . und wer bin ich ?\n\n"); - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/makefile deleted file mode 100644 index 4d23435..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe02/makefile +++ /dev/null @@ -1,34 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAME= ProcA2.e -FNAME= ProcA2 -EXENAMC= ChildProcA2.e -FNAMC= ChildProcA2 -LIBNAME= -LIBNAME= - -compile: $(EXENAME) $(EXENAMC) - -$(EXENAME): $(FNAME).o - $(CMP) $(FNAME).o $(LIBNAME) $(LDFLAGS) -o $@ - -$(EXENAMC): $(FNAMC).o - $(CMP) $(FNAMC).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAME) $(EXENAMC) - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/ProcA3.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/ProcA3.c deleted file mode 100644 index 3c29605..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/ProcA3.c +++ /dev/null @@ -1,31 +0,0 @@ -//*************************************************************************** -// File: ProcA4.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - fork(); - fork(); - fork(); - fork(); - printf("PID: %d\t PPID: %d\n", getpid(), getppid()); - sleep(10); // keep processes in system to display their "stammbaum" - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/makefile deleted file mode 100644 index af2c854..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe03/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAMES= ProcA3.e -FNAME= ProcA3 -LIBNAME= - -$(EXENAMES): $(FNAME).o - $(CMP) $(FNAME).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAMES) - -all: - @make clean - @make - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/ProcA4.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/ProcA4.c deleted file mode 100644 index 0554662..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/ProcA4.c +++ /dev/null @@ -1,61 +0,0 @@ -//*************************************************************************** -// File: ProcA5.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include -#include - -#include "workerUtils.h" -#include "selectCPU.h" - -#define ITERATIONS 20 -#define WORK_HARD 2000000 - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - int i; - - - pid = fork(); - selectCPU(0); // select CPU 0 - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - for (i = 0; i < ITERATIONS; i++) { - justWork(WORK_HARD); - printf("%d \t\tChild\n", i); - fflush(stdout); // force output - } - break; - default: - for (i = 0; i < ITERATIONS; i++) {; - justWork(WORK_HARD); - printf("%d \tMother\n", i); - fflush(stdout); // force output - } - } - printf("I go it ...\n"); - - if (pid > 0) // wait for child to terminate - waitpid(pid, NULL, 0); - - exit(0); -} -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/README_MAC b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/README_MAC deleted file mode 100644 index 84bd483..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/README_MAC +++ /dev/null @@ -1,2 +0,0 @@ - -setCPU() does not work on OSX diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/makefile deleted file mode 100644 index 8bc8dbd..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAM1= ProcA4.e -FNAM1= ProcA4.o workerUtils.o selectCPU.o -LIBNAME= - -$(EXENAM1): $(FNAM1) - $(CMP) $(FNAM1) $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAM1) - -all: - @make clean - @make - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.c deleted file mode 100644 index 8f5ddee..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.c +++ /dev/null @@ -1,41 +0,0 @@ -//*************************************************************************** -// File: setCPU.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -#define _GNU_SOURCE - -#include -#include -#include -#include - -#ifdef __linux -#include -#endif - -//****************************************************************************** - -#ifdef __linux - -void selectCPU(unsigned int n) { - cpu_set_t cpuset; - if (n >= sysconf(_SC_NPROCESSORS_ONLN)) { - printf("CPU %d not availble\n", n); - exit(0); - } - sched_getaffinity(0, sizeof(cpu_set_t), &cpuset); - CPU_ZERO(&cpuset); - CPU_SET(n, &cpuset); - sched_setaffinity(0, sizeof(cpu_set_t), &cpuset); -} -#endif - -#ifdef __APPLE__ -void selectCPU(unsigned int n) { - printf("Cannot set single CPU on OSX\n ... continue anyway"); -} -#endif - -//****************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.h b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.h deleted file mode 100644 index 87067b9..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/selectCPU.h +++ /dev/null @@ -1,15 +0,0 @@ -//******************************************************************* -// File: selectCPU.h -// Original Author: M. Thaler (Modul BSY) -//******************************************************************* - -#ifndef SET_CPUS_HEADER_FILE -#define SET_CPUS_HEADER_FILE - -//******************************************************************* - -void selectCPU(unsigned int n); - -//******************************************************************* - -#endif diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.c deleted file mode 100644 index 85368a0..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.c +++ /dev/null @@ -1,90 +0,0 @@ -//******************************************************************* -// File: workerUtils.c -// Original Author: M. Thaler (Modul BSY) -// Purpose: helper applications to consume cpu time -//******************************************************************* - -#include -#include -#include -#include -#include -#include -#include - -#include "workerUtils.h" - -//------------------------------------------------------------------------------ -#define MAX_CPUS 16 -//------------------------------------------------------------------------------ -pid_t worker[MAX_CPUS]; -int nCPUS; -//------------------------------------------------------------------------------ - -void launchWorkLoad() { - int i; - nCPUS = sysconf(_SC_NPROCESSORS_ONLN); // get number of available CPUs - nCPUS = (nCPUS > MAX_CPUS) ? MAX_CPUS : nCPUS; - for (i = 0; i < nCPUS; i++) // start workers -> random load - worker[i] = startWorker(); -} - -void stopWorkLoad() { - int i; - for (i = 0; i < nCPUS; i++) // stop worker - stopWorker(worker[i]); -} - - -void setRandom(void) { - srandom((unsigned int)time(NULL)); // new random sequence -} - -void justWork(unsigned int load) { - unsigned int j; - for (j = 0; j < load; j++) {}; // just work -} - -void workHard(unsigned int low, unsigned int high) { - double rv; - unsigned int us, j; - high = high - low; - rv = ((double)random())/RAND_MAX; // make random value (0..1) - us = low + (unsigned int)(rv * high); // between lower & higher limit - for (j = 0; j < us; j++) {}; // just work - setRandom(); // reseed random generator -} - -void randomSleep(unsigned int low, unsigned int high) { - double rv; - unsigned int us; - high = high - low; - rv = ((double)random())/RAND_MAX; // make random value (0..1) - us = low + (unsigned int)(rv * high); // between lower & higher limit - usleep(us*1000); -} - - -pid_t startWorker(void) { // make a hard working process - struct timeval tv; // limit run time to 60 secs - time_t st; - pid_t pid = fork(); - if (pid == 0) { // child: pid = 0 -> ifinite loop - gettimeofday(&tv, NULL); // take start time - st = tv.tv_sec; - while ((tv.tv_sec-st) < 60) { - workHard(50, 800); // work hard (random interval - gettimeofday(&tv, NULL); // between 50us and 800us) - } - - } - if (pid < 0) { // exit fork failed - printf("forking worker failed\n"); - exit(0); - } - return pid; // return pid if parent -} - -void stopWorker(pid_t worker) { - kill(worker, SIGKILL); // terminate worker process -} diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.h b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.h deleted file mode 100644 index ac5226f..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe04/workerUtils.h +++ /dev/null @@ -1,33 +0,0 @@ -//******************************************************************* -// File: workerUtils.h -// Original Author: M. Thaler (Modul BSY) -// Purpose: helper applications to consume cpu time -//******************************************************************* - -#include -#include -#include -#include -#include -#include -#include - -//------------------------------------------------------------------------------ -#define MAX_CPUS 16 -//------------------------------------------------------------------------------ - -void launchWorkLoad(); - -void stopWorkLoad(); - -void setRandom(void); - -void justWork(unsigned int load); - -void workHard(unsigned int low, unsigned int high); - -void randomSleep(unsigned int low, unsigned int high); - -pid_t startWorker(void); - -void stopWorker(pid_t worker); diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/ProcA5.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/ProcA5.c deleted file mode 100644 index a73c979..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/ProcA5.c +++ /dev/null @@ -1,51 +0,0 @@ -//*************************************************************************** -// File: ProcA6.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid, id; - char buf[64]; - int i; - - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - printf("\n... ich bin das Kind %d\n", getpid()); - for (i = 0; i < 10; i++) { - usleep(500000); // slow down a bit - printf("Mein Elternprozess ist %d\n", id = getppid()); - } - printf("... so das wars\n"); - break; - default: - sleep(2); // terminate - exit(0); - break; - } - printf("\n\n*** and here my new parent ****\n\n"); - sprintf(buf, "ps -p %d", id); - system(buf); - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/README b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/README deleted file mode 100644 index 23988f6..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/README +++ /dev/null @@ -1,3 +0,0 @@ -Reparenting -> new parent instead init (1): - -command prctl(PR_SET_CHILD_SUBREAPER, 1) diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/makefile deleted file mode 100644 index 00e05fc..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe05/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAMES= ProcA5.e -FNAME= ProcA5 -LIBNAME= - -$(EXENAMES): $(FNAME).o - $(CMP) $(FNAME).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAMES) - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/ProcA6.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/ProcA6.c deleted file mode 100644 index f5bb59f..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/ProcA6.c +++ /dev/null @@ -1,48 +0,0 @@ -//*************************************************************************** -// File: ProcA7.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - int j; - - for (j = 0; j < 3; j++) { // generate 3 processes - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - sleep(j+2); // process j sleeps for j+2 sec - exit(0); // then exits - break; - default: // parent - break; - } - } - sleep(8); // parent process sleeps for 6 sec - wait(NULL); // consult manual for "wait" - sleep(2); - wait(NULL); - sleep(2); - wait(NULL); - sleep(2); - exit(0); -} diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/makefile deleted file mode 100644 index f802333..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -LDFLAGS= -EXENAMES= aaaa.e -FNAME= ProcA6 -LIBNAME= - -$(EXENAMES): $(FNAME).o - $(CMP) $(FNAME).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAMES) - -all: - @make clean - @make - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/mtop b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/mtop deleted file mode 100644 index 04949bb..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe06/mtop +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# M. Thaler, InIT/ZHAW 11/2014 -# Version v.fs20 - -if test "$1" = "" -then - cmd="-a" -else - cmd="-C $1" -fi - -forever="1" -while test "$forever" = "1" -do - clear - ps $cmd - sleep 1 -done - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ChildProcA7.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ChildProcA7.c deleted file mode 100644 index 635d098..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ChildProcA7.c +++ /dev/null @@ -1,50 +0,0 @@ -//*************************************************************************** -// File: ChildProcA8.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: arg[0]: Programmname, arg[1]: i -//*************************************************************************** - -int main(int argc, char *argv[]) { - - int i = 0, *a = NULL; - - if (argc > 1) - i = atoi(argv[1]); // convert string argv[1] to integer i - // argv[1] is a number passed to child - - printf("\n*** I am the child having job nr. %d ***\n\n", i); - - switch(i) { - case 0: exit(0); // exit normally - break; - case 1: *a = i; // force segmentation error - break; - case 2: kill(getpid(), 30); // I send signal 30 to myself - break; - case 3: sleep(5); // sleep and wait for signal - break; - case 4: sleep(5); // just sleep - exit(222); // then exit - break; - default: - exit(-1); - } - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ProcA7.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ProcA7.c deleted file mode 100644 index 06b8cfd..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/ProcA7.c +++ /dev/null @@ -1,65 +0,0 @@ -//*************************************************************************** -// File: ProcA8.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(int argc, char *argv[]) { - pid_t pid; - int status, retval, whatToDo = 0; - char str[8]; - - if (argc > 1) - whatToDo = atoi(argv[1]); // get job number for child - - pid = fork(); // fork child - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - sprintf(str, "%d",whatToDo); - retval = execl("./ChildProcA7.e", "ChildProcA7.e", str, NULL); - if (retval < 0) perror("\nexecl not successful"); - break; - default: - if (whatToDo <= 3) { - if (whatToDo == 3) { - sleep(1); - kill(pid, SIGABRT); // send signal SIGABTR to child - } - wait(&status); - if (WIFEXITED(status)) - printf("Child exits with status %d\n", WEXITSTATUS(status)); - if (WIFSIGNALED(status)) { - printf("Child exits on signal %d\n", WTERMSIG(status)); - printf("Child exits with core dump %d\n", WCOREDUMP(status)); - } - } else { - usleep(500*1000); - while (!waitpid(pid, &status, WNOHANG)) { - printf(". . . child is playing\n"); - usleep(500*1000); - } - printf("Child has exited with 'exit(%d)'\n", WEXITSTATUS(status)); - } - break; - } - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/README b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/README deleted file mode 100644 index 9f27733..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/README +++ /dev/null @@ -1,21 +0,0 @@ - -Enable core dumps -> ulimit -c unlimited -Disable core dumps -> ulimit -c 0 - -Das core File lesen mit gdb: - - gdb -c core ChildProgA8.e - - -!!!! Wichtig !!!! - -Wenn sie ein Linux benutzen, das standardmaessig ABRT (Automatic Bug -Reporting Tool) verwendet (z.B. Fedora, Centos, etc.), muss -/proc/sys/kernel/core_pattern auf "core" gesetzt werden, damit ein -core File erzeugt wird - - echo core > /proc/sys/kernel/core_pattern - -Wenn ihr System SE-Linux verwendet (z.B. Fedora) , laesst sich core_pattern -nicht auf einfache Art setzen, verzichten sie in diesem Fall auf die -Erzeugung des "core" Files. diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/makefile deleted file mode 100644 index 6d8bc93..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe07/makefile +++ /dev/null @@ -1,34 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -CMPFLAGS= -Wall -g -LDFLAGS= -EXENAME= ProcA7.e -FNAME= ProcA7 -EXENAMC= ChildProcA7.e -FNAMC= ChildProcA7 -LIBNAME= -LIBNAME= - -compile: $(EXENAME) $(EXENAMC) - -$(EXENAME): $(FNAME).o - $(CMP) $(FNAME).o $(LIBNAME) $(LDFLAGS) -o $@ - -$(EXENAMC): $(FNAMC).o - $(CMP) $(FNAMC).o $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f core *.o $(EXENAME) $(EXENAMC) - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_1.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_1.c deleted file mode 100644 index 5fbe822..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_1.c +++ /dev/null @@ -1,45 +0,0 @@ -//*************************************************************************** -// File: ProcA9_1.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - - printf("\n"); - printf("\nHallo, I am on the way to fork now, ......lo"); - - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - printf("ok: I am the child\n"); - break; - default: - printf("ok: I am the parent\n"); - break; - } - printf("\nclear ?\n\n"); - exit(0); -} - -//*************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_2.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_2.c deleted file mode 100644 index a3bbdff..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_2.c +++ /dev/null @@ -1,87 +0,0 @@ -//*************************************************************************** -// File: ProcA9_2.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include -#include - -#define WAIT_TIME (200*1000) // 0.2 s with usleep - -// globaler array - -#define ARRAY_SIZE 8 -char GArray[ARRAY_SIZE][ARRAY_SIZE]; - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pid_t pid; - int i,j; - - // flip coin to select "child first" or "parent first" - struct timeval tv; - gettimeofday(&tv, NULL); - srandom(tv.tv_usec); // evaluate seed - int head = (int)(random()) >> 7; // flip coin - head &= 0x1; - - // fill global array with '-' and print array value - for (i = 0; i < ARRAY_SIZE; i++) { - for (j = 0; j < ARRAY_SIZE; j++) { - GArray[i][j] = '-'; - printf("%c ", GArray[i][j]); - } - printf("\n"); - } - fflush(stdout); - - pid = fork(); - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: // --- child fills upper half of array with 'c' - if (head) usleep(WAIT_TIME); - for (i = ARRAY_SIZE / 2; i < ARRAY_SIZE; i++) - for (j = 0; j < ARRAY_SIZE; j++) - GArray[i][j] = 'c'; - break; - default: // --- parent fills lower half of array with 'p' - if (! head) usleep(WAIT_TIME); - for (i = 0; i < ARRAY_SIZE / 2; i++) - for (j = 0; j < ARRAY_SIZE; j++) - GArray[i][j] = 'p'; - break; - } - - if (pid == 0) - printf("\nKinderarray\n\n"); - else - printf("\nElternarray\n\n"); - - for (i = 0; i < ARRAY_SIZE; i++) { - for (j = 0; j < ARRAY_SIZE; j++) - printf("%c ", GArray[i][j]); - printf("\n"); - } - fflush(stdout); - - if (pid > 0) wait(NULL); - - exit(0); -} - -//*************************************************************************** diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_3.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_3.c deleted file mode 100644 index b2786bc..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/ProcA8_3.c +++ /dev/null @@ -1,74 +0,0 @@ -//*************************************************************************** -// File: ProcA9_3.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include -#include - - -#include "workerUtils.h" - - -#define ANZAHL 15 -#define WORK_HARD 1000000 - -//***************************************************************************** -// Function: main(), parameter: none -//***************************************************************************** - -int main(void) { - - FILE *fdes; - pid_t pid; - int i; - - launchWorkLoad(); // start CPU load to force context switches - fdes = fopen("AnyOutPut.txt", "w"); - if (fdes == NULL) perror("Cannot open file"); - - usleep(500000); - - pid = fork(); - - switch (pid) { - case -1: - perror("Could not fork"); - break; - case 0: - for (i = 1; i <= ANZAHL; i++) { - fprintf(fdes, "Fritzli\t%d\n", i); - fflush(fdes); // make sure date is written to file - justWork(WORK_HARD); - } - break; - default: - for (i = 1; i <= ANZAHL; i++) { - fprintf(fdes, "Mami\t%d\n", i); - fflush(fdes); // make sure date is written to file - justWork(WORK_HARD); - } - fflush(stdout); - stopWorkLoad(); - break; - } - printf("We are done\n"); - if (pid > 0) { - waitpid(pid, NULL, 0); - printf("See file AnyOutPut.txt\n"); - } - fflush(stdout); - exit(0); -} - -//***************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/makefile deleted file mode 100644 index e5921ff..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/makefile +++ /dev/null @@ -1,38 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -std=gnu99 -CMPFLAGS= -Wall -LDFLAGS= -EXENAME1= ProcA8_1.e -FNAM1= ProcA8_1.o -EXENAME2= ProcA8_2.e -FNAM2= ProcA8_2.o -EXENAME3= ProcA8_3.e -FNAM3= ProcA8_3.o workerUtils.o -LIBNAME= - -compile: $(EXENAME1) $(EXENAME2) $(EXENAME3) - -$(EXENAME1): $(FNAM1) - $(CMP) $(CMPFLAGS) $(FNAM1) $(LIBNAME) $(LDFLAGS) -o $@ - -$(EXENAME2): $(FNAM2) - $(CMP) $(CMPFLAGS) $(FNAM2) $(LIBNAME) $(LDFLAGS) -o $@ - -$(EXENAME3): $(FNAM3) - $(CMP) $(CMPFLAGS) $(FNAM3) $(LIBNAME) $(LDFLAGS) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAME1) $(EXENAME2) $(EXENAME3) - -all: - @make clean - @make diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.c deleted file mode 100644 index 1fb8a5d..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.c +++ /dev/null @@ -1,90 +0,0 @@ -//******************************************************************* -// File workerUtils.c -// Original Author: M. Thaler (Modul BSY) -// Purpose: helper applications to consume cpu time -//******************************************************************* - -#include -#include -#include -#include -#include -#include -#include - -#include "workerUtils.h" - -//------------------------------------------------------------------------------ -#define MAX_CPUS 16 -//------------------------------------------------------------------------------ -pid_t worker[MAX_CPUS]; -int nCPUS; -//------------------------------------------------------------------------------ - -void launchWorkLoad() { - int i; - nCPUS = sysconf(_SC_NPROCESSORS_ONLN); // get number of available CPUs - nCPUS = (nCPUS > MAX_CPUS) ? MAX_CPUS : nCPUS; - for (i = 0; i < nCPUS; i++) // start workers -> random load - worker[i] = startWorker(); -} - -void stopWorkLoad() { - int i; - for (i = 0; i < nCPUS; i++) // stop worker - stopWorker(worker[i]); -} - - -void setRandom(void) { - srandom((unsigned int)time(NULL)); // new random sequence -} - -void justWork(unsigned int load) { - unsigned int j; - for (j = 0; j < load; j++) {}; // just work -} - -void workHard(unsigned int low, unsigned int high) { - double rv; - unsigned int us, j; - high = high - low; - rv = ((double)random())/RAND_MAX; // make random value (0..1) - us = low + (unsigned int)(rv * high); // between lower & higher limit - for (j = 0; j < us; j++) {}; // just work - setRandom(); // reseed random generator -} - -void randomSleep(unsigned int low, unsigned int high) { - double rv; - unsigned int us; - high = high - low; - rv = ((double)random())/RAND_MAX; // make random value (0..1) - us = low + (unsigned int)(rv * high); // between lower & higher limit - usleep(us*1000); -} - - -pid_t startWorker(void) { // make a hard working process - struct timeval tv; // limit run time to 60 secs - time_t st; - pid_t pid = fork(); - if (pid == 0) { // child: pid = 0 -> ifinite loop - gettimeofday(&tv, NULL); // take start time - st = tv.tv_sec; - while ((tv.tv_sec-st) < 60) { - workHard(50, 800); // work hard (random interval - gettimeofday(&tv, NULL); // between 50us and 800us) - } - - } - if (pid < 0) { // exit fork failed - printf("forking worker failed\n"); - exit(0); - } - return pid; // return pid if parent -} - -void stopWorker(pid_t worker) { - kill(worker, SIGKILL); // terminate worker process -} diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.h b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.h deleted file mode 100644 index c944cda..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe08/workerUtils.h +++ /dev/null @@ -1,25 +0,0 @@ -//******************************************************************* -// File: workerUtils.h -// Original Author: M. Thaler (Modul BSY) -//******************************************************************* - -#ifndef WORKER_UTILS -#define WORKER_UTILS - -void launchWorkLoad(); - -void stopWorkLoad(); - -void setRandom(void); - -void justWork(unsigned int load); - -void workHard(unsigned int low, unsigned int high); - -void randomSleep(unsigned int low, unsigned int high); - -pid_t startWorker(void); - -void stopWorker(pid_t worker); - -#endif diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/ProcA9.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/ProcA9.c deleted file mode 100644 index ded9dad..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/ProcA9.c +++ /dev/null @@ -1,112 +0,0 @@ -//*************************************************************************** -// File: ProcA9.c -// Original Author: M. Thaler (Modul BSY) -//*************************************************************************** - -//*************************************************************************** -// system includes -//*************************************************************************** - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "selectCPU.h" - -//************************************************************************** -// global data -#define ARRAY_SIZE 8 -char GArray[ARRAY_SIZE][ARRAY_SIZE]; - -//************************************************************************** - -void *ThreadF(void *letter) { - int i,j; - int LowLim, HighLim; - char letr; - - letr = *(char *)letter; - if (letr == 'p') { // paremeter = p: fill lower half of array - LowLim = 0; HighLim = ARRAY_SIZE / 2; - } - else { // paremeter != p: fill upper half of array - LowLim = ARRAY_SIZE / 2; HighLim = ARRAY_SIZE; - } - - for (i = LowLim; i < HighLim; i++) { // fill own half - for (j = 0; j < ARRAY_SIZE; j++) - GArray[i][j] = letr; - } - - for (i = 0; i < ARRAY_SIZE; i++) { // print whole array - for (j = 0; j < ARRAY_SIZE; j++) - printf("%c ", GArray[i][j]); - printf("\n"); - } - printf("\n"); - fflush(stdout); - pthread_exit(0); -} - -//*************************************************************************** -// Function: main(), parameter: none -//*************************************************************************** - -int main(void) { - - pthread_t thread1, thread2; - int i,j, pthr; - char letter1, letter2; - - selectCPU(0); // run on CPU 0 - - // flip coin to select p or c first - struct timeval tv; - gettimeofday(&tv, NULL); - srandom(tv.tv_usec); // evaluate seed - int head = (int)(random()) >> 7; // flip coin - head &= 0x1; - if (head) { - letter1 = 'p'; - letter2 = 'c'; - } - else { - letter1 = 'c'; - letter2 = 'p'; - } - - for (i = 0; i < ARRAY_SIZE; i++) - for (j = 0; j < ARRAY_SIZE; j++) - GArray[i][j] = '-'; - - printf("\nArray vor Threads\n\n"); - for (i = 0; i < ARRAY_SIZE; i++) { - for (j = 0; j < ARRAY_SIZE; j++) - printf("%c ", GArray[i][j]); - printf("\n"); - } - printf("\n"); - - pthr = pthread_create(&thread1, NULL, ThreadF, (void *)&letter1); - if (pthr != 0) perror("Could not create thread"); - pthr = pthread_create(&thread2, NULL, ThreadF, (void *)&letter2); - if (pthr != 0) perror("Could not create thread"); - - pthread_join(thread1, NULL); - pthread_join(thread2, NULL); - - printf("\n... nach Threads\n"); - for (i = 0; i < ARRAY_SIZE; i++) { - for (j = 0; j < ARRAY_SIZE; j++) - printf("%c ", GArray[i][j]); - printf("\n"); - } -} - -//*************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/makefile b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/makefile deleted file mode 100644 index f29cbb6..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# ************************************************************* -# Original Autor: M. Thaler (Modul BSY) -# ************************************************************* - -CMP= gcc -std=gnu99 -pthread -CMPFLAGS= -Wall -LDFLAGS= -EXENAME1= ProcA9.e -FNAM1= ProcA9.o selectCPU.o -LIBNAME= - -$(EXENAME1): $(FNAM1) - $(CMP) $(FNAM1) $(LDFLAGS) $(LIBNAME) -o $@ - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -clean: - rm -f *.o $(EXENAME1) - -all: - @make clean - @make - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.c b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.c deleted file mode 100644 index ad67886..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.c +++ /dev/null @@ -1,41 +0,0 @@ -//****************************************************************************** -// File: setCPU.c -// Original Author: M. Thaler (Modul BSY) -//****************************************************************************** - -#define _GNU_SOURCE - -#include -#include -#include -#include - -#ifdef __linux -#include -#endif - -//****************************************************************************** - -#ifdef __linux - -void selectCPU(unsigned int n) { - cpu_set_t cpuset; - if (n >= sysconf(_SC_NPROCESSORS_ONLN)) { - printf("CPU %d not availble\n", n); - exit(0); - } - sched_getaffinity(0, sizeof(cpu_set_t), &cpuset); - CPU_ZERO(&cpuset); - CPU_SET(n, &cpuset); - sched_setaffinity(0, sizeof(cpu_set_t), &cpuset); -} -#endif - -#ifdef __APPLE__ -void selectCPU(unsigned int n) { - printf("Cannot set single CPU on OSX\n ... continue anyway"); -} -#endif - -//****************************************************************************** - diff --git a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.h b/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.h deleted file mode 100644 index 1079489..0000000 --- a/P07_Prozesse_und_Threads/work/Prozesse_und_Threads/Aufgabe09/selectCPU.h +++ /dev/null @@ -1,15 +0,0 @@ -//****************************************************************************** -// File: setCPU.h -// Original Author: M. Thaler (Modul BSY) -//****************************************************************************** - -#ifndef SET_CPUS_HEADER_FILE -#define SET_CPUS_HEADER_FILE - -//****************************************************************************** - -void selectCPU(unsigned int n); - -//****************************************************************************** - -#endif diff --git a/P08_Sync/P10.uxf b/P08_Sync/P10.uxf deleted file mode 100644 index b7544ec..0000000 --- a/P08_Sync/P10.uxf +++ /dev/null @@ -1,242 +0,0 @@ - - - 10 - - UMLClass - - 90 - 370 - 200 - 200 - - lt=.. -*Kaffee-Automat* - - - - Text - - 90 - 690 - 150 - 110 - - while (1) { - ... - sem_wait(coin); - sem_post(coffee); - ... -} -style=wordwrap - - - - Text - - 420 - 690 - 150 - 110 - - while (1) { - ... - sem_post(coin); - sem_wait(coffee); - ... -} -style=wordwrap - - - - Relation - - 230 - 710 - 200 - 40 - - lt=<. -coin - 10.0;20.0;180.0;20.0 - - - Relation - - 230 - 730 - 200 - 40 - - lt=<. -coffee - 180.0;20.0;10.0;20.0 - - - UMLClass - - 130 - 430 - 120 - 30 - - auf Geld warten - - - - UMLClass - - 130 - 490 - 120 - 30 - - Kaffee ausgeben - - - - Relation - - 180 - 390 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 180 - 450 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 180 - 510 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 100 - 400 - 110 - 150 - - lt=<- - 90.0;10.0;10.0;10.0;10.0;130.0;90.0;130.0 - - - UMLClass - - 380 - 370 - 200 - 200 - - lt=.. -*Kunde* - - - - UMLClass - - 420 - 430 - 120 - 30 - - Geld einwerfen - - - - UMLClass - - 420 - 490 - 120 - 30 - - auf Kaffee warten - - - - Relation - - 470 - 390 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 470 - 450 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 470 - 510 - 30 - 60 - - lt=<- - 10.0;40.0;10.0;10.0 - - - Relation - - 470 - 400 - 110 - 150 - - lt=<- - 10.0;10.0;90.0;10.0;90.0;130.0;10.0;130.0 - - - Relation - - 240 - 430 - 200 - 40 - - lt=<. -coin - 10.0;20.0;180.0;20.0 - - - Relation - - 240 - 490 - 200 - 40 - - lt=<. -coffee - 180.0;20.0;10.0;20.0 - - diff --git a/P08_Sync/P10_Sync.docx b/P08_Sync/P10_Sync.docx deleted file mode 100644 index 612b9a4..0000000 Binary files a/P08_Sync/P10_Sync.docx and /dev/null differ diff --git a/P08_Sync/P10_Sync.pdf b/P08_Sync/P10_Sync.pdf deleted file mode 100644 index b5ec1fb..0000000 Binary files a/P08_Sync/P10_Sync.pdf and /dev/null differ diff --git a/P08_Sync/README.md b/P08_Sync/README.md deleted file mode 100644 index e66b5c2..0000000 --- a/P08_Sync/README.md +++ /dev/null @@ -1,187 +0,0 @@ -# 08 - Synchronisationsprobleme - -___ - -## 1. Übersicht - -![](./synchronisationsprobleme.png) - -[Quelle: https://commons.wikimedia.org/wiki/File:Velgast-suedbahn.jpg](https://commons.wikimedia.org/wiki/File:Velgast-suedbahn.jpg) - -In diesem Praktikum lernen sie zuerst am Beispiel eines Kaffee-Automaten verschiedene grundlegende Synchronisationsprobleme kennen und mit Hilfe von Locks (Mutexes) und Semaphoren lösen: - - gegenseitiger Ausschluss mit einem Lock - - Erzwingen einer einfachen Reihenfolge - - Erzwingen einer erweiterten Reihenfolge - -Im zweiten Teil werden sie auf Basis dieser Grundlagen ein komplexeres Synchronisationsproblem bearbeiten, diesmal am Beispiel von Bank Transaktionen. -___ - -### 1.1 Nachweis -Dieses Praktikum ist eine leicht abgewandelte Variante des Sync Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins-zu-ein übernommen. - -Als Autor des BSY Praktikums ist genannt: M. Thaler. - -___ - -## 2. Lernziele -In diesem Praktikum werden sie Synchronisationsprobleme lösen -- Sie wissen wie man systematisch Synchronisationsprobleme analysiert -- Sie wissen wann ein potentieller Deadlock entstehen kann -- Sie können Mutex mit Threads anwenden -- Sie können Semaphoren mit Prozessen anwenden - -___ - -## 3. Einführung -Das Lösen von Synchronisationsproblemen ist oft nicht einfach, weil Prozesse bzw. Threads gleichzeitig ablaufen, ihre Aktivitäten jedoch nach Vorgaben koordiniert werden müssen: man verliert schnell den Überblick. Systematisches Vorgehen mit Aufzeichnen der Abläufe und Synchronisationsbedingungen bewährt ich sich in diesem Fall. - -___ - -### 3.1 Wie löst man Synchronisationsprobleme? -Gehen sie beim Lösen von Synchronisationsproblemen in folgenden Schritten vor: - -- **Schritt 1: Prozesse (Threads) der Problemstellung identifizieren.** - Prozesse sind die Aktivitäten, die gleichzeitig ausgeführt werden. In diesem Sinne sind sie eigenständige Ausführungs-Einheiten, deren zeitliches Verhalten synchronisiert werden muss. -- **Schritt 2: Ausführungsschritte der einzelnen Prozesse (Threads) ermitteln.** - Erstellen sie eine Liste mit einer Spalte für jeden Prozess. Notieren sie für jeden Prozess stichwortartig die wesentlichen Aktionen in der gewünschten zeitlichen Reihenfolge. Tragen sie noch keine Synchronisationsoperationen ein, sondern Texte wie warten auf Geld, etc. Übertragen sie anschliessend die Liste in einen Ablaufgraphen (Siehe Beispiel in Abbildung 1). -- **Schritt 3: Synchronisationsbedingungen ermitteln.** - Eine Synchronisationsbedingung ist eine zeitliche Beziehung (Abhängigkeit) zwischen Aktionen verschiedener Prozesse, die für das korrekte Arbeiten erforderlich ist. Zeichnen sie diese Beziehungen mit Pfeilen in den Ablaufgraphen aus Schritt 2 ein (Siehe Abbildung 1). -- **Schritt 4: Benötigte Semaphore definieren.** - Für jede Synchronisationsbedingung wird ein eigener Semaphor benötigt. Notieren sie für jeden Semaphor einen Namen und den Wert, mit dem er initialisiert werden muss. -- **Schritt 5: Prozesse mit Semaphore Operationen ergänzen.** - Erweitern sie nun alle Prozesse aus Schritt 2 mit den notwendigen Semaphore Operati-onen (Siehe Pseudocode in Abbildung 1). -- **Schritt 6: Implementation.** - Implementieren und testen sie das vollständige Programm. - -![](./coffee_customer.png) - - -```c -coin = sem_open(...,0); -coffee = sem_open(...,0); -``` - -Ablaufgraph und Pseudocode für 2 Prozesse und zwei Semaphore -![](./sequence_graph.png) - - - - -## 4. Der Kaffee-Automat -Als Beispiel verwenden wir einen Automaten, der Kaffee verkauft. Der Kunde muss zum Kauf eines Kaffees zuerst eine bzw. mehrere Münzen einwerfen und anschliessend den gewünsch-ten Kaffee wählen. Der Automat gibt dann das entsprechende Getränk aus. - -Im ersten Beispiel werden der Automat und die Kunden mit Threads modelliert und tauschen Daten über gemeinsame Speichervariablen aus. Im zweiten und dritten Beispiel werden der Automat und die Kunden mit Prozessen modelliert, dabei wird der Ablauf mit Hilfe von Sema-phoren gesteuert bzw. erzwungen. - -**Hinweis:** die Programme zu den folgenden Aufgaben können alle mit **startApp.e** gestartet werden. Dieses Programm startet und stoppt Threads und Prozesse, alloziert und dealloziert die Ressourcen (Mutexes, Semaphore). - -___ - -### 4.1 Aufgabe: Mutual Exclusion -Greifen mehrere Threads (oder Prozesse) auf gemeinsame Daten zu, können sogenannte Race Conditions entstehen. Das Resultat ist in diesem Fall abhängig von der Reihenfolge, in der die Threads (Prozesse) ausgeführt werden. - -Im vorliegenden Beispiel wirft der Kunde eine 1 Euro Münze ein und drückt anschliessend auf eine von zwei Kaffeewahltasten. Dabei wird die Anzahl Münzen (*coinCount*) und die gewählte Kaffeesorte (*selCount1*, *selCount2*) inkrementiert. Diese Variablen sind in der Datenstruktur *cData* abgelegt, auf die gemeinsam Kaffee-Automat und Kunden zugreifen können. Der Auto-mat überprüft, ob die Anzahl Münzen und die Anzahl der Kaffeewahlen gleich gross sind, falls nicht, wird eine Fehlermeldung ausgegeben und alle Zähler auf *Null* gesetzt. - -#### Aufgaben - -1. Übersetzen sie die Programme im Verzeichnis *mutex* mit *make* und starten sie den Kaffee-Automaten mit **startApp.e** mehrmals hintereinander. - Analysieren sie die Datenwerte in den Fehlermeldungen, beschreiben sie was die Gründe dafür sind bzw. sein können. - -2. Schützen sie nun den Zugriff auf die gemeinsamen Daten mit einem Mutex so, dass alle Threads eine konsistente Sicht der Daten haben. -Wir haben für sie einen Mutex vorbereitet: die Datenstruktur *cData* enthält die Mutex-Variable *mutex*, die in **startApp.c** initialisiert wird. Die Funktionen für das Schliessen und das Öffnen des Mutex (Locks) aus der *pthread* Bibliothek sind: -```c -pthread mutex lock(&(cD->lock)); -``` - - und -```c -pthread mutex unlock(&(cD->lock)); -``` -Überprüfen sie, ob der Kaffee-Automat nun keine Fehlermeldungen mehr ausgibt. Erhö-hen sie dazu auch die Anzahl Kunden *CUSTOMERS* in **commonDefs.h**, z.B. auf 10. - -3. Im Thread des Kaffee-Automaten wird an verschiedenen Orten mehrmals auf die gemeinsamen Daten in *cD* zugegriffen. Wenn sie die gemeinsamen Daten in lokale Variablen kopieren und dann nur noch auf diese lokalen Variablen zugreifen würden, könn-ten sie dann auf die Synchronisation mit dem Mutex verzichten? - -4. Wie oft kann ein einzelner Kunde einen Kaffee beziehen, bis der nächste Kunde an die Reihe kommt? Hier reicht eine qualitative Aussage. - -### 4.2 Aufgabe: Einfache Reihenfolge -Wie sie im ersten Beispiel festgestellt haben, verhindert ein Mutex zwar, dass Race Conditions auftreten, die Verarbeitungsreihenfolge der Threads lässt sich jedoch nicht beeinflussen und ist zufällig. -Im Folgenden soll eine erzwungene Verarbeitungsreihenfolge implementiert werden: -- Ein Kunde benutzt den Automat für einen Kaffeekauf exklusiv, d.h. alle Schritte des Kunden werden innerhalb eines Mutexes ausgeführt. Ist ein Kunde an der Reihe, wartet er bis der Automat bereit ist, wirft eine Münze ein, wartet auf den Kaffee und gibt anschlies-send den Automaten für den nächsten Kunden frei. - -- Der Automat meldet zuerst in einer Endlos-Schleife, dass er für die Geld-Eingabe bereit ist, wartet dann auf die Eingabe einer Münze, gibt den Kaffee aus und meldet anschliessend wieder, wenn er bereit ist, etc. - -Für die Lösung dieses Problems benötigen wir Semaphore, die, im Gegensatz zu Mutexes, auch in verschiedenen Prozessen gesetzt bzw. zurückgesetzt werden dürfen. Den Kaffee-Automat und die Kunden implementieren wir mit Prozessen. sie finden die entsprechenden Prozesse im Verzeichnis **basicSequence**. - -#### Aufgaben -1. Beschreiben sie den Kaffee-Automaten mit Hilfe der 6 Schritte aus Abschnitt 3 auf Papier, dokumentieren sie dabei alle Schritte schriftlich. -2. Implementieren sie nun den Kaffee-Automaten. Ergänzen sie dazu den *coffeeTeller* und den *customer* Prozess so mit vier Semaphoren, dass die vorgegebenen Ablaufbedingungen eingehalten werden. Mit welchen Werten müssen die Semaphore initialisiert werden? -Wir haben für sie vier Semaphore vorbereitet: Achtung, sie sind aber noch auskommentiert (siehe commonDefs.h und startApp.c. Die benötigten Semaphor-Funktionen aus der POSIX Bibliothek sind: -```c -sem_wait(&semaphor); -``` -und -```c -sem_post(&semaphor); -``` -Analysieren sie die Ausgabe der Prozesse (mehrmals starten). Was fällt auf? - -3. Gibt Ihr Programm den Output in der korrekten Reihenfolge aus? Falls nicht, wie könnte das gelöst werden? - -### 4.3 Aufgabe: Erweiterte Reihenfolge -Die Preise steigen dauernd ... auch der Kaffee wird immer teurer, er kostet nun 3 Euro. Da der Automat nur 1 Euro Stücke annehmen kann, muss der Kunde 3 Münzen einwerfen. Erweitern sie die Prozesse aus Aufgabe 4.2 so, dass eine vordefinierte Anzahl Münzen eingegeben werden muss (die Anzahl Münzen ist in *commonDefs.h* als *NUM_COINS* definiert). Verwenden sie keine zusätzlichen Semaphore, sondern nutzen sie, dass wir Counting Semaphore verwenden. Die vordefinierten Prozesse finden sie im Verzeichnis *advancedSequence*. -#### Aufgabe -- Passen sie den coffeeTeller und den customer Prozess so an, dass der Kunde mehrere Münzen einwerfen muss, bis der Automat einen Kaffee ausgeben kann. - -**Hinweis:** POSIX Semaphore sind Counting Semaphore, können aber nicht auf vordefinierte Werte gesetzt werden (ausser bei der Initialisierung). Abhilfe schafft hier das mehrmalige Aufrufen von *sem_post()*, z.B. in einer for-Schleife. - -### 4.4 Zusammenfassung -Wir haben drei grundlegenden Typen von Synchronisationsproblemen kennen gelernt: -- **Mutex** nur ein Prozess bzw. Thread kann gleichzeitig auf gemeinsame Daten zugreifen. - - Beispiel: entweder liest der Kaffee-Automat die Daten oder ein Kunde verändert sie. -- **Einfache Reihenfolge** ein Prozess wartet auf die Freigabe durch einen anderen Prozess. - - Beispiel: der Kaffee-Automat wartet auf die Eingabe einer Münze. -- **Erweiterte Reihenfolge** ein Prozess wartet auf mehrere Freigaben durch einen anderen Pro-zess. - - Beispiel: der Kaffee-Automat wartet auf die Eingabe von drei Münzen. - -___ - -## 5. International Banking -Die International Bank of Transfer (IBT) besitzt in 128 Ländern Filialen und stellt für 2048 spezielle Handels-Kunden in jeder Filiale ein Konto zur Verfügung. Gelder dieser Kunden werden dauernd zwischen den Filialen hin und her transferiert, dazu beschäftigt die Bank sogenannte Pusher. Pusher heben Geldbeträge von Konten in einer Filiale ab und buchen sie auf den entsprechenden Konten in irgendeiner (auch in der eigenen) Filiale wieder ein. Die Beträge liegen zwischen 1000 und 100’000 Dollar und werden zufällig ausgewählt, die Wahl der beiden Filialen ist ebenfalls zufällig. - -### 5.1 Implementation -Im Folgenden arbeiten wir mit einer *pthread*-basierten Implementation der IBT, die Pusher werden dabei mit Threads implementiert. Die Filialen der Bank sind als Array von Strukturen implementiert, wobei pro Filiale ein Lock (*branchLock*) und ein Array von Konten (Accounts) definiert ist. Die Konten sind wiederum Strukturen mit dem Kontostand (*account*) und dem Lock (*acntLock*), siehe dazu auch den Source Code. Die Zugriffe auf die Gelder sind imple-mentiert (Funktionen *withdraw()*, *deposit()*, *transfer()*), aber nicht synchronisiert. -**Hinweis:** es ist von Vorteil hier mit mehreren CPUs zu arbeiten. Falls sie eine VM verwenden, setzen sie die Anzahl CPUs auf das Maximum. - - -### 5.2 Aufgabe: Konto Synchronisation -1. Wechseln sie ins Verzeichnis **banking/a1**, übersetzen sie das Programm und starten sie es mit dem Skript `./startApp`. Analysieren und erklären sie die Resultate. Notie-ren sie sich zudem die Laufzeiten für 1, 2 und 4 Threads. -2. Synchronisieren sie die Kontenzugriffe so, dass möglichst viele Zugriffe gleichzeitig ausgeführt werden können und die Zugriffe atomar sind. Sie dürfen nur eines der beiden Locks *branchLock* bzw. *acntLock* verwenden: welches wählen sie und wieso? Be-gründen sie ihre Antwort und testen sie ihre Lösung. - -### 5.3 Aufgabe: Filialen Zugriff in Critical Section -Ihr Chef meint, dass es wohl aus Sicherheitsgründen besser wäre, sowohl die Filialen und die jeweiligen Kontenzugriffen zu ”locken”. - 1. Wechseln sie ins Verzeichnis banking/a2 und kopieren sie banking.c aus Aufgabe 5.2. Implementieren sie diese zusätzlichen Anforderungen. Analysieren sie die Resultate. Was stellen sie fest im Vergleich mit den Resultaten aus der Aufgabe 5.2? Was raten sie ihrem Chef? - 2. Ein Kollege meint, es wäre effizienter beim Abheben des Betrags zuerst das Konto zu locken und dann die Filiale, hingegen beim Einbuchen zuerst die die Filiale und dann das Konto. Was für eine Antwort geben sie ihrem Kollegen?**Hinweis:** falls sie nicht sicher sind: probieren sie es aus. - -### 5.4 Aufgabe: Refactoring der Synchronisation -Das International Banking Committe (IBC) erlässt neue Richtlinien, die unter anderem fordern, dass die Gesamtbilanz einer Bank über sämtliche Filialen zu jeder Zeit konsistent sein muss. -1. Erklären sie wieso die Implementationen aus Aufgabe 5.2 und 5.3 diese Anforderungen nicht erfüllen. -2. Ihr Entwicklungsteam kommt zum Schluss, dass den Pushern neu nur noch eine Funktion *transfer()* für die Überweisung von Beträgen zwischen den Filialen und Konten zur Verfügung gestellt werden darf. -Welche Locks bzw. welches Lock muss verwendet werden, damit die Forderung des IBC erfüllt werden kann? Wechseln sie ins Verzeichnis *banking/a3* und ergänzen sie die Funktion *transfer()* in banking.c um die entsprechenden Lock-Funktionen. -Wichtiger -**Hinweis:** es darf kein neues Lock eingeführt werden und die Gesamtbilanz über sämtliche Filialen muss jederzeit konsistent sein. -3. Testen und analysieren sie das Programm und vergleichen sie die Resultate (Funktionalität, Laufzeit) mit den Lösungen aus Aufgabe 5.2 und 5.3. Notieren sie sich, was ihnen bei dieser Aufgabe wichtig erscheint. -4. -___ - - -## 6. Bewertung - -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. -| Aufgabe | Kriterium | Gewicht | -| :-- | :-- | :-- | -| | Sie können die gestellten Fragen erklären. | | -| 4 | 4.1 Aufgabe: Mutual Exclusion
4.2 Aufgabe: Einfache Reihenfolge
4.3 Aufgabe: Erweiterte Reihenfolge | 4 | -| 5 | 5.2 Aufgabe: Konto Synchronisation
5.3 Aufgabe: Filialen Zugriff in Critical Section
5.4 Aufgabe: Refactoring der Synchronisation | 4 | - - -___ -___ -Version: 18.08.2021 diff --git a/P08_Sync/coffee_customer.png b/P08_Sync/coffee_customer.png deleted file mode 100644 index 37d6274..0000000 Binary files a/P08_Sync/coffee_customer.png and /dev/null differ diff --git a/P08_Sync/coffee_customer.svg b/P08_Sync/coffee_customer.svg deleted file mode 100644 index 9ae8144..0000000 --- a/P08_Sync/coffee_customer.svg +++ /dev/null @@ -1,129 +0,0 @@ - - -auf Kaffee wartenGeld einwerfenKundeKaffee ausgebenauf Geld wartenKaffee-Automatcoffeecoin diff --git a/P08_Sync/sequence_graph.png b/P08_Sync/sequence_graph.png deleted file mode 100644 index e551d22..0000000 Binary files a/P08_Sync/sequence_graph.png and /dev/null differ diff --git a/P08_Sync/sequence_graph.svg b/P08_Sync/sequence_graph.svg deleted file mode 100644 index d25e346..0000000 --- a/P08_Sync/sequence_graph.svg +++ /dev/null @@ -1,64 +0,0 @@ - - -while (1) { ... sem_post(coin); sem_wait(coffee); ...}while (1) { ... sem_wait(coin); sem_post(coffee); ...}coffeecoin diff --git a/P08_Sync/synchronisationsprobleme.png b/P08_Sync/synchronisationsprobleme.png deleted file mode 100644 index da2334c..0000000 Binary files a/P08_Sync/synchronisationsprobleme.png and /dev/null differ diff --git a/P08_Sync/synchronisationsprobleme.svg b/P08_Sync/synchronisationsprobleme.svg deleted file mode 100644 index c9a5478..0000000 --- a/P08_Sync/synchronisationsprobleme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/P08_Sync/work/Sync/advancedSequence/coffeeTeller.c b/P08_Sync/work/Sync/advancedSequence/coffeeTeller.c deleted file mode 100644 index 4b96adb..0000000 --- a/P08_Sync/work/Sync/advancedSequence/coffeeTeller.c +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* -* File: coffeTeller.c -* Purpose: simple sequence with semaphores -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(void) { - - int i; - sem_t *coin, *coffee, *ready; - - // set up a semaphore - coin = sem_open(COIN_SEMAPHOR, 0); - coffee = sem_open(COFFEE_SEMAPHOR, 0); - ready = sem_open(READY_SEMAPHOR, 0); - - // start teller machine - printf("\nCoffee teller machine starting\n\n"); - - i = 0; - while (i < ITERS) { - printf("teller (%d): waiting for coin\n", i); - printf(" (%d): got coin\n", i); - printf(" (%d): dispense coffee\n", i); - i++; - } -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/advancedSequence/commonDefs.h b/P08_Sync/work/Sync/advancedSequence/commonDefs.h deleted file mode 100644 index 597278d..0000000 --- a/P08_Sync/work/Sync/advancedSequence/commonDefs.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef MY_DEFINITIONS_HEADER -#define MY_DEFINITIONS_HEADER - -/******************************************************************************* -* File: commonDefs.h -* Purpose: common definitions -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013, 4/2014 -* Version: v.fs20 -*******************************************************************************/ - -#define MYTURN_SEMAPHOR "/my_semaphor_1_name_advaneced_seq" -#define COIN_SEMAPHOR "/my_semaphor_2_name_advaneced_seq" -#define COFFEE_SEMAPHOR "/my_semaphor_3_name_advaneced_seq" -#define READY_SEMAPHOR "/my_semaphor_4_name_advaneced_seq" - -#define ITERS (100*1000*1000) -#define CUSTOMERS 4 -#define NUM_COIN 3 - -//****************************************************************************** - -#define checkSem(X) {if (X == SEM_FAILED) {perror("sem_open"); exit(-1);}} - -#define drinkingCoffee(X) {usleep((((1+X)*rand())+100000)&0xFFFFF);} - -//****************************************************************************** - -#endif - diff --git a/P08_Sync/work/Sync/advancedSequence/customer.c b/P08_Sync/work/Sync/advancedSequence/customer.c deleted file mode 100644 index a4609e5..0000000 --- a/P08_Sync/work/Sync/advancedSequence/customer.c +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* -* File: customer.c -* Purpose: simple sequence with semaphores -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(int argc, char *argv[]) { - - int i, myID; - sem_t *myTurn, *coin, *coffee, *ready; - - if (argc > 1) - myID = atoi(argv[1]); - else - myID = 0; - - // set up a semaphore - myTurn = sem_open(MYTURN_SEMAPHOR, 0); - coin = sem_open(COIN_SEMAPHOR, 0); - coffee = sem_open(COFFEE_SEMAPHOR, 0); - ready = sem_open(READY_SEMAPHOR, 0); - - // start customer - printf("Customer starting (%d)\n", myID); - - // now check the sum - for (i = 0; i < ITERS; i++) { - printf("\t\t\t\tcustomer(%d) put coin %d\n", myID, i); - printf("\t\t\t\tcustomer(%d) waiting for coffee %d\n", myID, i); - printf("\t\t\t\tcustomer(%d) got coffee %d\n", myID, i); - drinkingCoffee(myID); - } -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/advancedSequence/makefile b/P08_Sync/work/Sync/advancedSequence/makefile deleted file mode 100644 index 2891669..0000000 --- a/P08_Sync/work/Sync/advancedSequence/makefile +++ /dev/null @@ -1,40 +0,0 @@ -# BSy M. Thaler -# Version v.fs20 - -CMP= gcc -std=gnu99 -CMPFLAGS= -Wall -g -LIB= -pthread -EXENAME0= startApp.e -EXENAME1= coffeeTeller.e -EXENAME2= customer.e - -doit: - @make --no-print-directory clean - @make --no-print-directory startApp - @make --no-print-directory coffeeTeller - @make --no-print-directory customer - -startApp: startApp.o - $(CMP) $(CMPFLAGS) startApp.o $(LIB) -o $(EXENAME0) - -coffeeTeller: coffeeTeller.o - $(CMP) $(CMPFLAGS) coffeeTeller.o $(LIB) -o $(EXENAME1) - -customer: customer.o - $(CMP) $(CMPFLAGS) customer.o $(LIB) -o $(EXENAME2) - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -all: - @make clean - make doit - -clean: - @rm -f *.e *.o - -purge: - @make clean diff --git a/P08_Sync/work/Sync/advancedSequence/startApp.c b/P08_Sync/work/Sync/advancedSequence/startApp.c deleted file mode 100644 index a1f3a6b..0000000 --- a/P08_Sync/work/Sync/advancedSequence/startApp.c +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* -* File: startApp.c -* Purpose: ice cream teller, basic sequence -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(void) { - - int j; - char string[8]; - sem_t *access, *coin, *coffee, *ready; - pid_t tellerPID; - - sem_unlink(MYTURN_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(COIN_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(COFFEE_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(READY_SEMAPHOR); // delete seamphor if it still exists - - // set up a semaphore (? -> initial value of semaphor) - // checkSem() -> macro defined in commonDefs.h - - /* - access = sem_open(MYTURN_SEMAPHOR, O_CREAT, 0700, ?); checkSem(access); - coin = sem_open(COIN_SEMAPHOR, O_CREAT, 0700, ?); checkSem(coin); - coffee = sem_open(COFFEE_SEMAPHOR, O_CREAT, 0700, ?); checkSem(coffee); - ready = sem_open(READY_SEMAPHOR, O_CREAT, 0700, ?); checkSem(ready); - */ - - // now that the resources are set up, the supervisor can be started - for (j = 1; j <= CUSTOMERS; j++) { - if (fork() == 0) { - sprintf(string, "%d", j); - execl("./customer.e", "customer.e", string, NULL); - printf("*** could not start customer.e ***\n"); - } - } - - if ((tellerPID = fork()) == 0) { - execl("./coffeeTeller.e", "coffeeTeller.e", "0", NULL); - printf("*** could not start coffeTeller ***\n"); - } - - waitpid(tellerPID, NULL, 0); - system("killall coffeeTeller.e"); - system("killall customer.e"); // kill all customers - - // clean up resources - sem_unlink(MYTURN_SEMAPHOR); - sem_unlink(COIN_SEMAPHOR); - sem_unlink(COFFEE_SEMAPHOR); - sem_unlink(READY_SEMAPHOR); - printf("\n"); -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/banking-solution/a3/banking.c b/P08_Sync/work/Sync/banking-solution/a3/banking.c deleted file mode 100644 index a10758c..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/banking.c +++ /dev/null @@ -1,142 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include -#include - -#include "banking.h" - -//****************************************************************************** - -#define MAX( a, b ) ( ( a > b) ? a : b ) -#define MIN( a, b ) ( ( a <= b) ? a : b ) - -typedef struct account_struct_ { - long int balance; - pthread_mutex_t acntLock; -} Account; - -typedef struct branch_struct { - Account *accounts; - pthread_mutex_t branchLock; -} Branch; - -//****************************************************************************** - -static Branch *bank; -static int nBranches, nAccounts; - -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts) { - nBranches = num_branches; - nAccounts = num_accounts; - bank = (Branch *)malloc(nBranches * sizeof(Branch)); - - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); - - for (int i = 0; i < nBranches; i++) { - bank[i].accounts = (Account *)malloc(nAccounts * sizeof(Account)); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_init(&bank[i].accounts[j].acntLock, NULL); - bank[i].accounts[j].balance = 0; - } - } -} - -void deletebank(void) { - for (int i = 0; i < nBranches; i++) - free(bank[i].accounts); - free(bank); - nBranches = nAccounts = 0; -} - -long int withdraw(int branchNr, int accountNr, long int value) { - int rv, tmp; - rv = 0; - tmp = bank[branchNr].accounts[accountNr].balance - value; - if (tmp >= 0) { - bank[branchNr].accounts[accountNr].balance = tmp; - rv = value; - }; - return rv; -} - -void deposit(int branchNr, int accountNr, long int value) { - bank[branchNr].accounts[accountNr].balance += value; -} - -void transfer(int fromB, int toB, int accountNr, long int value) { - if (fromB == toB) { - return; - } - - int first = MIN(fromB, toB); - int second = MAX(fromB, toB); - pthread_mutex_lock(&bank[first].accounts[accountNr].acntLock); - pthread_mutex_lock(&bank[second].accounts[accountNr].acntLock); - - int money = withdraw(fromB, accountNr, value); - deposit(toB, accountNr, money); - - pthread_mutex_unlock(&bank[first].accounts[accountNr].acntLock); - pthread_mutex_unlock(&bank[second].accounts[accountNr].acntLock); -} - -void checkAssets(void) { - static long assets = 0; - long int sum = 0; - for (int i = 0; i < nBranches; i++) { - for (int j = 0; j < nAccounts; j++) { - sum += (long int)bank[i].accounts[j].balance; - } - } - if (assets == 0) { - assets = sum; - printf("Balance of accounts is: %ld\n", sum); - } - else { - if (sum != assets) { - printf("Balance of accounts is: %ld ... not correct\n", sum); - } - else - printf("Balance of accounts is: %ld ... correct\n", assets); - } -} - -int checkIBC(void) { - static long ibcError = 0; - long sum = 0; - - for (int i = 0; i < nBranches; i++) { - pthread_mutex_lock(&bank[i].branchLock); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_lock(&bank[i].accounts[j].acntLock); - } - } - for (int i = 0; i < nBranches; i++) { - for (int j = 0; j < nAccounts; j++) { - sum += (long)bank[i].accounts[j].balance; - } - } - for (int i = nBranches - 1; i >= 0; i--) { - pthread_mutex_unlock(&bank[i].branchLock); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_unlock(&bank[i].accounts[j].acntLock); - } - } - if (ibcError == 0) ibcError = sum; - return (ibcError != sum); -} -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking-solution/a3/banking.h b/P08_Sync/work/Sync/banking-solution/a3/banking.h deleted file mode 100644 index e8a4017..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/banking.h +++ /dev/null @@ -1,20 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.h -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts); -void deleteBank(void); - -long withdraw(int branch, int account, long int value) ; -void deposit(int branch, int account, long int value); -void transfer(int fromB, int toB, int account, long int value); -void checkAssets(void); -int checkIBC(void); - -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking-solution/a3/main.c b/P08_Sync/work/Sync/banking-solution/a3/main.c deleted file mode 100644 index 7f96596..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/main.c +++ /dev/null @@ -1,107 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: main.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include - -#include "banking.h" -#include "mtimer.h" -#include "mrandom.h" - -//****************************************************************************** -// constant values - -#define MAX_THREADS 16 -#define NUM_THREADS 2 - -#define TRANSFERS (16*1024*1024L) -#define ACCOUNTS (2048) -#define BRANCHES (128) - -//****************************************************************************** -// globals - -int nThreads; -int ibc = 0; - -//****************************************************************************** -// customers - -void *pusher(void *arg) { - int idx = (int)(long)(arg); - mrand_t rand; - unsigned int seed = 17*idx; - mrandInit(seed, &rand); - int account, from, to, val; - int count = TRANSFERS / nThreads; - for (int i = 0; i < count; i++) { - account = (int)(mrandUInt(&rand) % ACCOUNTS); - from = (int)(mrandUInt(&rand) % BRANCHES); - to = (int)(mrandUInt(&rand) % BRANCHES); - val = (int)(mrandRange(1000, 100000, &rand)); - transfer(from, to, account, val); - } -} - -void *checker(void *arg) { - for (int i = 0; i < 1000; i = i) { - ibc += checkIBC(); - usleep(100*1000); - } -} - -//****************************************************************************** -// main program - -int main(int argc, char *argv[]) { - - gtimer_t timer; - mrand_t ranvar; - long assets; - - // thread id's - pthread_t th[MAX_THREADS]; - - // get number of threads or default - if (argc > 1) - nThreads = atoi(argv[1]); - else - nThreads = NUM_THREADS; - nThreads = (nThreads > MAX_THREADS) ? MAX_THREADS : nThreads; - - mrandInit((MAX_THREADS + 1)*333, &ranvar); - - printf("\nRunning %d threads\n", nThreads); - makeBank(BRANCHES, ACCOUNTS); - for (int i = 0; i < ACCOUNTS; i++) - deposit(0, i, mrandRange(10, 1000*1000, &ranvar)); - checkAssets(); - - startGTimer(timer); - // create threads and pass thread number - pthread_create(&th[0], NULL, checker, (void *)0); - sleep(1); - for (long i = 1; i < nThreads; i++) - pthread_create(&th[i], NULL, pusher, (void *)i); - // wait for threads to terminate - for (int i = 1; i < nThreads; i++) - pthread_join(th[i], NULL); - stopGTimer(timer); - - checkAssets(); - printGTime(timer); - - if (ibc) - printf("\n\033[41mYou do not comply with the IBC rules \033[0m\n\n"); - else - printf("\n\033[42mYou do comply with the IBC rules \033[0m\n\n"); - -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/banking-solution/a3/makefile b/P08_Sync/work/Sync/banking-solution/a3/makefile deleted file mode 100644 index 889b1e5..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/makefile +++ /dev/null @@ -1,32 +0,0 @@ -# --------------------------------------------------------------------------- -# Makefile -# Course: BSy -# Date: M. Thaler, 1/2016 -# File: makefile -# Version: v.fs20 -# --------------------------------------------------------------------------- -#macros - -CC = gcc -CFLGS = -std=gnu99 -LIBS = -pthread -OFILES = main.o banking.o -HFILES = banking.h - -main: $(OFILES) $(HFILES) - $(CC) $(CFLGS) $(LIBS) $(OFILES) -o $@.e - -.c.o: - $(CC) $(CFLGS) -c $< - -.cc.o: - $(CC) $(CFLGS) -c $< - -clean: - rm -f *.o *.e - @echo "directory cleaned" - -all: - @rm -f *.o - make --no-print-directory main -#----------------------------------------------------------------------------- diff --git a/P08_Sync/work/Sync/banking-solution/a3/mrandom.h b/P08_Sync/work/Sync/banking-solution/a3/mrandom.h deleted file mode 100644 index 3d91f4d..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/mrandom.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef MY_RANDOMGENERATOR_DEFINITIONS -#define MY_RANDOMGENERATOR_DEFINITIONS - -#include -#include - -//****************************************************************************** -// Course: BSy -// File: mrandom.h -// Author: M. Thaler, ZHAW -// Purpose: thread safe random functions (reentrant) -// Version: v.fs20 -//****************************************************************************** -// date type: mrand_t -// -// functions: -// - void mrandInit(mrand_t *mrt) -> initialize with fixed seed -// - unsigned int mrandUInt(mrand_t *mrt) -> unsigned random number -// - unsigned int mrandRange(int low, int high, mrand_t *mrt) -// -> random number within range -// -/******************************************************************************/ -// constanst for ecuyer generator: length approx 8 x 10^12 - -#define M1 2147483563 -#define M2 2147483399 -#define A1 40014 -#define A2 40692 -#define Q1 53668 -#define Q2 52774 -#define R1 12211 -#define R2 3791 -#define MRAND_MAX M1-1 - -/******************************************************************************/ -typedef struct mrand_t { unsigned int s1; \ - unsigned int s2; } mrand_t; - -void mrandInit(unsigned int seed, mrand_t *mrt) { - mrt->s1 = 33777 + seed * 777; - mrt->s2 = 9777572 + seed * 33775; -} - -unsigned int mrandUInt(mrand_t *mrt) { - unsigned int rv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - return rv; -} - -double mrandDouble(mrand_t *mrt) { - unsigned int rv; - double dv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - dv = (double)rv / ((double)(M1-1)); - return dv; -} - -unsigned int mrandRange(unsigned int low, unsigned int high, mrand_t *mrt) { - assert(low <= high); - double drv = mrandDouble(mrt); - unsigned int av = (unsigned int)(drv * (double)(high-low) + 0.5); - return low + av; -} - -/******************************************************************************/ -#endif diff --git a/P08_Sync/work/Sync/banking-solution/a3/mtimer.h b/P08_Sync/work/Sync/banking-solution/a3/mtimer.h deleted file mode 100644 index 63aa950..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/mtimer.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef TIMER_MACRO_DEFINITIONS -#define TIMER_MACRO_DEFINITIONS - -/******************************************************************************/ -// Course: BSy -// File: mtimer.h -// Purpose: timer functions gettimeofday() -// Author: M. Thaler, ZHAW, 1/2016 -// Version: v.fs20 -/******************************************************************************/ -// gettimeofday() -// function: elapsed time: between start and stop -// data type: gtimer_t -// functions: startGTimer(gtimer_t tdata) -> start timer -// stopGTimer(gtimer_t tdata) -> stop timer -// double getWallGTime(gtimer_t tdata) -> get time in s -// printGTime(X) -> print time in s -// -// -> see also "man gettimeofday" -/******************************************************************************/ - -#include -#include -#include -#include - - -/******************************************************************************/ - -typedef struct gtimer_t { struct timeval sT; \ - struct timeval eT; } gtimer_t; - -#define startGTimer(X) gettimeofday(&X.sT, NULL) -#define stopGTimer(X) gettimeofday(&X.eT, NULL) -#define getGTime(X) ((double)(X.eT.tv_sec) - (double)(X.sT.tv_sec)) +\ - ((double)X.eT.tv_usec - (double)X.sT.tv_usec)/1e6 -#define printGTime(X) printf("Run time %3.2lfs\n", getGTime(X)) - -/******************************************************************************/ - -#endif - diff --git a/P08_Sync/work/Sync/banking-solution/a3/startApp b/P08_Sync/work/Sync/banking-solution/a3/startApp deleted file mode 100644 index 211c509..0000000 --- a/P08_Sync/work/Sync/banking-solution/a3/startApp +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -./main.e 1 -./main.e 2 -./main.e 4 diff --git a/P08_Sync/work/Sync/banking/a1/banking.c b/P08_Sync/work/Sync/banking/a1/banking.c deleted file mode 100644 index fbf20c1..0000000 --- a/P08_Sync/work/Sync/banking/a1/banking.c +++ /dev/null @@ -1,103 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include -#include - -#include "banking.h" - -//****************************************************************************** - -typedef struct account_struct_ { - long int balance; - pthread_mutex_t acntLock; -} Account; - -typedef struct branch_struct { - Account *accounts; - pthread_mutex_t branchLock; -} Branch; - -//****************************************************************************** - -static Branch *Bank; -static int nBranches, nAccounts; - -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts) { - nBranches = num_branches; - nAccounts = num_accounts; - Bank = (Branch *)malloc(nBranches * sizeof(Branch)); - - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - - for (int i = 0; i < nBranches; i++) { - Bank[i].accounts = (Account *)malloc(nAccounts * sizeof(Account)); - pthread_mutex_init(&(Bank[i].branchLock), &attr); - for (int j = 0; j < nAccounts; j++) { - Bank[i].accounts[j].balance = 0; - pthread_mutex_init((&(Bank[i].accounts[j].acntLock)), &attr); - } - } -} - -void deleteBank(void) { - for (int i = 0; i < nBranches; i++) - free(Bank[i].accounts); - free(Bank); - nBranches = nAccounts = 0; -} - -long int withdraw(int branchNr, int accountNr, long int value) { - int rv, tmp; - rv = 0; - tmp = Bank[branchNr].accounts[accountNr].balance - value; - if (tmp >= 0) { - Bank[branchNr].accounts[accountNr].balance = tmp; - rv = value; - } - return rv; -} - -void deposit(int branchNr, int accountNr, long int value) { - Bank[branchNr].accounts[accountNr].balance += value; -} - -void transfer(int fromB, int toB, int accountNr, long int value) { - int money = withdraw(fromB, accountNr, value); - if (money >= 0) - deposit(toB, accountNr, money); -} - -void checkAssets(void) { - static long assets = 0; - long sum = 0; - for (int i = 0; i < nBranches; i++) { - for (int j = 0; j < nAccounts; j++) { - sum += (long)Bank[i].accounts[j].balance; - } - } - if (assets == 0) { - assets = sum; - printf("Balance of accounts is: %ld\n", sum); - } - else { - if (sum != assets) - printf("Balance of accounts is: %ld ... not correct\n", sum); - else - printf("Balance of accounts is: %ld ... correct\n", assets); - } -} - -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking/a1/banking.h b/P08_Sync/work/Sync/banking/a1/banking.h deleted file mode 100644 index 1b8ea98..0000000 --- a/P08_Sync/work/Sync/banking/a1/banking.h +++ /dev/null @@ -1,19 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.h -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts); -void deleteBank(void); - -long int withdraw(int branchNr, int accountNr, long int value) ; -void deposit(int branchNr, int accountNr, long int value); -void transfer(int fromB, int toB, int accountNr, long int value); -void checkAssets(void); - -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking/a1/main.c b/P08_Sync/work/Sync/banking/a1/main.c deleted file mode 100644 index 4efe5c6..0000000 --- a/P08_Sync/work/Sync/banking/a1/main.c +++ /dev/null @@ -1,93 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: main.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include - -#include "banking.h" -#include "mtimer.h" -#include "mrandom.h" - -//****************************************************************************** -// constant values - -#define MAX_THREADS 16 -#define NUM_THREADS 4 - -#define TRANSFERS (16*1024*1024) -#define ACCOUNTS (2048) -#define BRANCHES (128) - -//****************************************************************************** -// globals - -int nThreads; - -//****************************************************************************** -// pusher - -void *pusher(void *arg) { - int idx = (int)(long)(arg); - mrand_t rand; - unsigned int seed = 17*idx; - mrandInit(seed, &rand); - int account, from, to, val; - int count = TRANSFERS / nThreads; - for (int i = 0; i < count; i++) { - account = (int)(mrandUInt(&rand) % ACCOUNTS); - from = (int)(mrandUInt(&rand) % BRANCHES); - to = (int)(mrandUInt(&rand) % BRANCHES); - val = (int)(mrandRange(1000, 100000, &rand)); - val = withdraw(from, account, val); - if (val > 0) - deposit(to, account, val); - } -} - -//****************************************************************************** -// main program - -int main(int argc, char *argv[]) { - - gtimer_t timer; - mrand_t ranvar; - long assets; - - // thread id's - pthread_t th[MAX_THREADS]; - - // get number of threads or default - if (argc > 1) - nThreads = atoi(argv[1]); - else - nThreads = NUM_THREADS; - nThreads = (nThreads > MAX_THREADS) ? MAX_THREADS : nThreads; - - mrandInit((MAX_THREADS + 1)*333, &ranvar); - - printf("\nRunning %d threads\n", nThreads); - makeBank(BRANCHES, ACCOUNTS); - for (int i = 0; i < ACCOUNTS; i++) - deposit(0, i, mrandRange(10, 1000*1000, &ranvar)); - checkAssets(); - - startGTimer(timer); - // create threads and pass thread number - for (long i = 0; i < nThreads; i++) - pthread_create(&th[i], NULL, pusher, (void *)i); - // wait for threads to terminate - for (int i = 0; i < nThreads; i++) - pthread_join(th[i], NULL); - stopGTimer(timer); - - checkAssets(); - printGTime(timer); -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/banking/a1/makefile b/P08_Sync/work/Sync/banking/a1/makefile deleted file mode 100644 index 889b1e5..0000000 --- a/P08_Sync/work/Sync/banking/a1/makefile +++ /dev/null @@ -1,32 +0,0 @@ -# --------------------------------------------------------------------------- -# Makefile -# Course: BSy -# Date: M. Thaler, 1/2016 -# File: makefile -# Version: v.fs20 -# --------------------------------------------------------------------------- -#macros - -CC = gcc -CFLGS = -std=gnu99 -LIBS = -pthread -OFILES = main.o banking.o -HFILES = banking.h - -main: $(OFILES) $(HFILES) - $(CC) $(CFLGS) $(LIBS) $(OFILES) -o $@.e - -.c.o: - $(CC) $(CFLGS) -c $< - -.cc.o: - $(CC) $(CFLGS) -c $< - -clean: - rm -f *.o *.e - @echo "directory cleaned" - -all: - @rm -f *.o - make --no-print-directory main -#----------------------------------------------------------------------------- diff --git a/P08_Sync/work/Sync/banking/a1/mrandom.h b/P08_Sync/work/Sync/banking/a1/mrandom.h deleted file mode 100644 index 3d91f4d..0000000 --- a/P08_Sync/work/Sync/banking/a1/mrandom.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef MY_RANDOMGENERATOR_DEFINITIONS -#define MY_RANDOMGENERATOR_DEFINITIONS - -#include -#include - -//****************************************************************************** -// Course: BSy -// File: mrandom.h -// Author: M. Thaler, ZHAW -// Purpose: thread safe random functions (reentrant) -// Version: v.fs20 -//****************************************************************************** -// date type: mrand_t -// -// functions: -// - void mrandInit(mrand_t *mrt) -> initialize with fixed seed -// - unsigned int mrandUInt(mrand_t *mrt) -> unsigned random number -// - unsigned int mrandRange(int low, int high, mrand_t *mrt) -// -> random number within range -// -/******************************************************************************/ -// constanst for ecuyer generator: length approx 8 x 10^12 - -#define M1 2147483563 -#define M2 2147483399 -#define A1 40014 -#define A2 40692 -#define Q1 53668 -#define Q2 52774 -#define R1 12211 -#define R2 3791 -#define MRAND_MAX M1-1 - -/******************************************************************************/ -typedef struct mrand_t { unsigned int s1; \ - unsigned int s2; } mrand_t; - -void mrandInit(unsigned int seed, mrand_t *mrt) { - mrt->s1 = 33777 + seed * 777; - mrt->s2 = 9777572 + seed * 33775; -} - -unsigned int mrandUInt(mrand_t *mrt) { - unsigned int rv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - return rv; -} - -double mrandDouble(mrand_t *mrt) { - unsigned int rv; - double dv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - dv = (double)rv / ((double)(M1-1)); - return dv; -} - -unsigned int mrandRange(unsigned int low, unsigned int high, mrand_t *mrt) { - assert(low <= high); - double drv = mrandDouble(mrt); - unsigned int av = (unsigned int)(drv * (double)(high-low) + 0.5); - return low + av; -} - -/******************************************************************************/ -#endif diff --git a/P08_Sync/work/Sync/banking/a1/mtimer.h b/P08_Sync/work/Sync/banking/a1/mtimer.h deleted file mode 100644 index 63aa950..0000000 --- a/P08_Sync/work/Sync/banking/a1/mtimer.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef TIMER_MACRO_DEFINITIONS -#define TIMER_MACRO_DEFINITIONS - -/******************************************************************************/ -// Course: BSy -// File: mtimer.h -// Purpose: timer functions gettimeofday() -// Author: M. Thaler, ZHAW, 1/2016 -// Version: v.fs20 -/******************************************************************************/ -// gettimeofday() -// function: elapsed time: between start and stop -// data type: gtimer_t -// functions: startGTimer(gtimer_t tdata) -> start timer -// stopGTimer(gtimer_t tdata) -> stop timer -// double getWallGTime(gtimer_t tdata) -> get time in s -// printGTime(X) -> print time in s -// -// -> see also "man gettimeofday" -/******************************************************************************/ - -#include -#include -#include -#include - - -/******************************************************************************/ - -typedef struct gtimer_t { struct timeval sT; \ - struct timeval eT; } gtimer_t; - -#define startGTimer(X) gettimeofday(&X.sT, NULL) -#define stopGTimer(X) gettimeofday(&X.eT, NULL) -#define getGTime(X) ((double)(X.eT.tv_sec) - (double)(X.sT.tv_sec)) +\ - ((double)X.eT.tv_usec - (double)X.sT.tv_usec)/1e6 -#define printGTime(X) printf("Run time %3.2lfs\n", getGTime(X)) - -/******************************************************************************/ - -#endif - diff --git a/P08_Sync/work/Sync/banking/a1/startApp b/P08_Sync/work/Sync/banking/a1/startApp deleted file mode 100644 index 211c509..0000000 --- a/P08_Sync/work/Sync/banking/a1/startApp +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -./main.e 1 -./main.e 2 -./main.e 4 diff --git a/P08_Sync/work/Sync/banking/a2/banking.h b/P08_Sync/work/Sync/banking/a2/banking.h deleted file mode 100644 index 1b8ea98..0000000 --- a/P08_Sync/work/Sync/banking/a2/banking.h +++ /dev/null @@ -1,19 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.h -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts); -void deleteBank(void); - -long int withdraw(int branchNr, int accountNr, long int value) ; -void deposit(int branchNr, int accountNr, long int value); -void transfer(int fromB, int toB, int accountNr, long int value); -void checkAssets(void); - -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking/a2/main.c b/P08_Sync/work/Sync/banking/a2/main.c deleted file mode 100644 index a7645e5..0000000 --- a/P08_Sync/work/Sync/banking/a2/main.c +++ /dev/null @@ -1,92 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: main.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include - -#include "banking.h" -#include "mtimer.h" -#include "mrandom.h" - -//****************************************************************************** -// constant values - -#define MAX_THREADS 16 -#define NUM_THREADS 4 - -#define TRANSFERS (16*1024*1024) -#define ACCOUNTS (2048) -#define BRANCHES (128) - -//****************************************************************************** -// globals - -int nThreads; - -//****************************************************************************** -// pusher - -void *pusher(void *arg) { - int idx = (int)(long)(arg); - mrand_t rand; - unsigned int seed = 17*idx; - mrandInit(seed, &rand); - int account, from, to, val; - int count = TRANSFERS / nThreads; - for (int i = 0; i < count; i++) { - account = (int)(mrandUInt(&rand) % ACCOUNTS); - from = (int)(mrandUInt(&rand) % BRANCHES); - to = (int)(mrandUInt(&rand) % BRANCHES); - val = (int)(mrandRange(1000, 100000, &rand)); - val = withdraw(from, account, val); - deposit(to, account, val); - } -} - -//****************************************************************************** -// main program - -int main(int argc, char *argv[]) { - - gtimer_t timer; - mrand_t ranvar; - long assets; - - // thread id's - pthread_t th[MAX_THREADS]; - - // get number of threads or default - if (argc > 1) - nThreads = atoi(argv[1]); - else - nThreads = NUM_THREADS; - nThreads = (nThreads > MAX_THREADS) ? MAX_THREADS : nThreads; - - mrandInit((MAX_THREADS + 1)*333, &ranvar); - - printf("\nRunning %d threads\n", nThreads); - makeBank(BRANCHES, ACCOUNTS); - for (int i = 0; i < ACCOUNTS; i++) - deposit(0, i, mrandRange(10, 1000*1000, &ranvar)); - checkAssets(); - - startGTimer(timer); - // create threads and pass thread number - for (long i = 0; i < nThreads; i++) - pthread_create(&th[i], NULL, pusher, (void *)i); - // wait for threads to terminate - for (int i = 0; i < nThreads; i++) - pthread_join(th[i], NULL); - stopGTimer(timer); - - checkAssets(); - printGTime(timer); -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/banking/a2/makefile b/P08_Sync/work/Sync/banking/a2/makefile deleted file mode 100644 index 889b1e5..0000000 --- a/P08_Sync/work/Sync/banking/a2/makefile +++ /dev/null @@ -1,32 +0,0 @@ -# --------------------------------------------------------------------------- -# Makefile -# Course: BSy -# Date: M. Thaler, 1/2016 -# File: makefile -# Version: v.fs20 -# --------------------------------------------------------------------------- -#macros - -CC = gcc -CFLGS = -std=gnu99 -LIBS = -pthread -OFILES = main.o banking.o -HFILES = banking.h - -main: $(OFILES) $(HFILES) - $(CC) $(CFLGS) $(LIBS) $(OFILES) -o $@.e - -.c.o: - $(CC) $(CFLGS) -c $< - -.cc.o: - $(CC) $(CFLGS) -c $< - -clean: - rm -f *.o *.e - @echo "directory cleaned" - -all: - @rm -f *.o - make --no-print-directory main -#----------------------------------------------------------------------------- diff --git a/P08_Sync/work/Sync/banking/a2/mrandom.h b/P08_Sync/work/Sync/banking/a2/mrandom.h deleted file mode 100644 index 3d91f4d..0000000 --- a/P08_Sync/work/Sync/banking/a2/mrandom.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef MY_RANDOMGENERATOR_DEFINITIONS -#define MY_RANDOMGENERATOR_DEFINITIONS - -#include -#include - -//****************************************************************************** -// Course: BSy -// File: mrandom.h -// Author: M. Thaler, ZHAW -// Purpose: thread safe random functions (reentrant) -// Version: v.fs20 -//****************************************************************************** -// date type: mrand_t -// -// functions: -// - void mrandInit(mrand_t *mrt) -> initialize with fixed seed -// - unsigned int mrandUInt(mrand_t *mrt) -> unsigned random number -// - unsigned int mrandRange(int low, int high, mrand_t *mrt) -// -> random number within range -// -/******************************************************************************/ -// constanst for ecuyer generator: length approx 8 x 10^12 - -#define M1 2147483563 -#define M2 2147483399 -#define A1 40014 -#define A2 40692 -#define Q1 53668 -#define Q2 52774 -#define R1 12211 -#define R2 3791 -#define MRAND_MAX M1-1 - -/******************************************************************************/ -typedef struct mrand_t { unsigned int s1; \ - unsigned int s2; } mrand_t; - -void mrandInit(unsigned int seed, mrand_t *mrt) { - mrt->s1 = 33777 + seed * 777; - mrt->s2 = 9777572 + seed * 33775; -} - -unsigned int mrandUInt(mrand_t *mrt) { - unsigned int rv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - return rv; -} - -double mrandDouble(mrand_t *mrt) { - unsigned int rv; - double dv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - dv = (double)rv / ((double)(M1-1)); - return dv; -} - -unsigned int mrandRange(unsigned int low, unsigned int high, mrand_t *mrt) { - assert(low <= high); - double drv = mrandDouble(mrt); - unsigned int av = (unsigned int)(drv * (double)(high-low) + 0.5); - return low + av; -} - -/******************************************************************************/ -#endif diff --git a/P08_Sync/work/Sync/banking/a2/mtimer.h b/P08_Sync/work/Sync/banking/a2/mtimer.h deleted file mode 100644 index 63aa950..0000000 --- a/P08_Sync/work/Sync/banking/a2/mtimer.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef TIMER_MACRO_DEFINITIONS -#define TIMER_MACRO_DEFINITIONS - -/******************************************************************************/ -// Course: BSy -// File: mtimer.h -// Purpose: timer functions gettimeofday() -// Author: M. Thaler, ZHAW, 1/2016 -// Version: v.fs20 -/******************************************************************************/ -// gettimeofday() -// function: elapsed time: between start and stop -// data type: gtimer_t -// functions: startGTimer(gtimer_t tdata) -> start timer -// stopGTimer(gtimer_t tdata) -> stop timer -// double getWallGTime(gtimer_t tdata) -> get time in s -// printGTime(X) -> print time in s -// -// -> see also "man gettimeofday" -/******************************************************************************/ - -#include -#include -#include -#include - - -/******************************************************************************/ - -typedef struct gtimer_t { struct timeval sT; \ - struct timeval eT; } gtimer_t; - -#define startGTimer(X) gettimeofday(&X.sT, NULL) -#define stopGTimer(X) gettimeofday(&X.eT, NULL) -#define getGTime(X) ((double)(X.eT.tv_sec) - (double)(X.sT.tv_sec)) +\ - ((double)X.eT.tv_usec - (double)X.sT.tv_usec)/1e6 -#define printGTime(X) printf("Run time %3.2lfs\n", getGTime(X)) - -/******************************************************************************/ - -#endif - diff --git a/P08_Sync/work/Sync/banking/a2/startApp b/P08_Sync/work/Sync/banking/a2/startApp deleted file mode 100644 index 211c509..0000000 --- a/P08_Sync/work/Sync/banking/a2/startApp +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -./main.e 1 -./main.e 2 -./main.e 4 diff --git a/P08_Sync/work/Sync/banking/a3/banking.c b/P08_Sync/work/Sync/banking/a3/banking.c deleted file mode 100644 index 7e4434c..0000000 --- a/P08_Sync/work/Sync/banking/a3/banking.c +++ /dev/null @@ -1,127 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include -#include - -#include "banking.h" - -//****************************************************************************** - -typedef struct account_struct_ { - long int balance; - pthread_mutex_t acntLock; -} Account; - -typedef struct branch_struct { - Account *accounts; - pthread_mutex_t branchLock; -} Branch; - -//****************************************************************************** - -static Branch *bank; -static int nBranches, nAccounts; - -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts) { - nBranches = num_branches; - nAccounts = num_accounts; - bank = (Branch *)malloc(nBranches * sizeof(Branch)); - - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); - - for (int i = 0; i < nBranches; i++) { - bank[i].accounts = (Account *)malloc(nAccounts * sizeof(Account)); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_init(&bank[i].accounts[j].acntLock, NULL); - bank[i].accounts[j].balance = 0; - } - } -} - -void deletebank(void) { - for (int i = 0; i < nBranches; i++) - free(bank[i].accounts); - free(bank); - nBranches = nAccounts = 0; -} - -long int withdraw(int branchNr, int accountNr, long int value) { - int rv, tmp; - rv = 0; - tmp = bank[branchNr].accounts[accountNr].balance - value; - if (tmp >= 0) { - bank[branchNr].accounts[accountNr].balance = tmp; - rv = value; - }; - return rv; -} - -void deposit(int branchNr, int accountNr, long int value) { - bank[branchNr].accounts[accountNr].balance += value; -} - -void transfer(int fromB, int toB, int accountNr, long int value) { - int money = withdraw(fromB, accountNr, value); - deposit(toB, accountNr, money); -} - -void checkAssets(void) { - static long assets = 0; - long int sum = 0; - for (int i = 0; i < nBranches; i++) { - for (int j = 0; j < nAccounts; j++) { - sum += (long int)bank[i].accounts[j].balance; - } - } - if (assets == 0) { - assets = sum; - printf("Balance of accounts is: %ld\n", sum); - } - else { - if (sum != assets) { - printf("Balance of accounts is: %ld ... not correct\n", sum); - } - else - printf("Balance of accounts is: %ld ... correct\n", assets); - } -} - -int checkIBC(void) { - static long ibcError = 0; - long sum = 0; - - for (int i = 0; i < nBranches; i++) { - pthread_mutex_lock(&bank[i].branchLock); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_lock(&bank[i].accounts[j].acntLock); - } - } - for (int i = 0; i < nBranches; i++) { - for (int j = 0; j < nAccounts; j++) { - sum += (long)bank[i].accounts[j].balance; - } - } - for (int i = nBranches - 1; i >= 0; i--) { - pthread_mutex_unlock(&bank[i].branchLock); - for (int j = 0; j < nAccounts; j++) { - pthread_mutex_unlock(&bank[i].accounts[j].acntLock); - } - } - if (ibcError == 0) ibcError = sum; - return (ibcError != sum); -} -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking/a3/banking.h b/P08_Sync/work/Sync/banking/a3/banking.h deleted file mode 100644 index e8a4017..0000000 --- a/P08_Sync/work/Sync/banking/a3/banking.h +++ /dev/null @@ -1,20 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: banking.h -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** -// banking functions - -void makeBank(int num_branches, int num_accounts); -void deleteBank(void); - -long withdraw(int branch, int account, long int value) ; -void deposit(int branch, int account, long int value); -void transfer(int fromB, int toB, int account, long int value); -void checkAssets(void); -int checkIBC(void); - -//****************************************************************************** - diff --git a/P08_Sync/work/Sync/banking/a3/main.c b/P08_Sync/work/Sync/banking/a3/main.c deleted file mode 100644 index 623de36..0000000 --- a/P08_Sync/work/Sync/banking/a3/main.c +++ /dev/null @@ -1,107 +0,0 @@ -//****************************************************************************** -// Course: BSy -// File: main.c -// Author: M. Thaler, ZHAW -// Purpose: locking mechanisms -// Version: v.fs20 -//****************************************************************************** - -#include -#include -#include - -#include "banking.h" -#include "mtimer.h" -#include "mrandom.h" - -//****************************************************************************** -// constant values - -#define MAX_THREADS 16 -#define NUM_THREADS 5 - -#define TRANSFERS (16*1024*1024L) -#define ACCOUNTS (2048) -#define BRANCHES (128) - -//****************************************************************************** -// globals - -int nThreads; -int ibc = 0; - -//****************************************************************************** -// customers - -void *pusher(void *arg) { - int idx = (int)(long)(arg); - mrand_t rand; - unsigned int seed = 17*idx; - mrandInit(seed, &rand); - int account, from, to, val; - int count = TRANSFERS / nThreads; - for (int i = 0; i < count; i++) { - account = (int)(mrandUInt(&rand) % ACCOUNTS); - from = (int)(mrandUInt(&rand) % BRANCHES); - to = (int)(mrandUInt(&rand) % BRANCHES); - val = (int)(mrandRange(1000, 100000, &rand)); - transfer(from, to, account, val); - } -} - -void *checker(void *arg) { - for (int i = 0; i < 1000; i = i) { - ibc += checkIBC(); - usleep(100*1000); - } -} - -//****************************************************************************** -// main program - -int main(int argc, char *argv[]) { - - gtimer_t timer; - mrand_t ranvar; - long assets; - - // thread id's - pthread_t th[MAX_THREADS]; - - // get number of threads or default - if (argc > 1) - nThreads = atoi(argv[1]); - else - nThreads = NUM_THREADS; - nThreads = (nThreads > MAX_THREADS) ? MAX_THREADS : nThreads; - - mrandInit((MAX_THREADS + 1)*333, &ranvar); - - printf("\nRunning %d threads\n", nThreads); - makeBank(BRANCHES, ACCOUNTS); - for (int i = 0; i < ACCOUNTS; i++) - deposit(0, i, mrandRange(10, 1000*1000, &ranvar)); - checkAssets(); - - startGTimer(timer); - // create threads and pass thread number - pthread_create(&th[0], NULL, checker, (void *)0); - sleep(1); - for (long i = 1; i < nThreads; i++) - pthread_create(&th[i], NULL, pusher, (void *)i); - // wait for threads to terminate - for (int i = 1; i < nThreads; i++) - pthread_join(th[i], NULL); - stopGTimer(timer); - - checkAssets(); - printGTime(timer); - - if (ibc) - printf("\n\033[41mYou do not comply with the IBC rules \033[0m\n\n"); - else - printf("\n\033[42mYou do comply with the IBC rules \033[0m\n\n"); - -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/banking/a3/makefile b/P08_Sync/work/Sync/banking/a3/makefile deleted file mode 100644 index 889b1e5..0000000 --- a/P08_Sync/work/Sync/banking/a3/makefile +++ /dev/null @@ -1,32 +0,0 @@ -# --------------------------------------------------------------------------- -# Makefile -# Course: BSy -# Date: M. Thaler, 1/2016 -# File: makefile -# Version: v.fs20 -# --------------------------------------------------------------------------- -#macros - -CC = gcc -CFLGS = -std=gnu99 -LIBS = -pthread -OFILES = main.o banking.o -HFILES = banking.h - -main: $(OFILES) $(HFILES) - $(CC) $(CFLGS) $(LIBS) $(OFILES) -o $@.e - -.c.o: - $(CC) $(CFLGS) -c $< - -.cc.o: - $(CC) $(CFLGS) -c $< - -clean: - rm -f *.o *.e - @echo "directory cleaned" - -all: - @rm -f *.o - make --no-print-directory main -#----------------------------------------------------------------------------- diff --git a/P08_Sync/work/Sync/banking/a3/mrandom.h b/P08_Sync/work/Sync/banking/a3/mrandom.h deleted file mode 100644 index 3d91f4d..0000000 --- a/P08_Sync/work/Sync/banking/a3/mrandom.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef MY_RANDOMGENERATOR_DEFINITIONS -#define MY_RANDOMGENERATOR_DEFINITIONS - -#include -#include - -//****************************************************************************** -// Course: BSy -// File: mrandom.h -// Author: M. Thaler, ZHAW -// Purpose: thread safe random functions (reentrant) -// Version: v.fs20 -//****************************************************************************** -// date type: mrand_t -// -// functions: -// - void mrandInit(mrand_t *mrt) -> initialize with fixed seed -// - unsigned int mrandUInt(mrand_t *mrt) -> unsigned random number -// - unsigned int mrandRange(int low, int high, mrand_t *mrt) -// -> random number within range -// -/******************************************************************************/ -// constanst for ecuyer generator: length approx 8 x 10^12 - -#define M1 2147483563 -#define M2 2147483399 -#define A1 40014 -#define A2 40692 -#define Q1 53668 -#define Q2 52774 -#define R1 12211 -#define R2 3791 -#define MRAND_MAX M1-1 - -/******************************************************************************/ -typedef struct mrand_t { unsigned int s1; \ - unsigned int s2; } mrand_t; - -void mrandInit(unsigned int seed, mrand_t *mrt) { - mrt->s1 = 33777 + seed * 777; - mrt->s2 = 9777572 + seed * 33775; -} - -unsigned int mrandUInt(mrand_t *mrt) { - unsigned int rv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - return rv; -} - -double mrandDouble(mrand_t *mrt) { - unsigned int rv; - double dv; - mrt->s1 = A1 * (mrt->s1 % Q1) - mrt->s1 * (mrt->s1/Q1); - if (mrt->s1 <= 0) mrt->s1 += M1; - mrt->s2 = A2 * (mrt->s2 % Q2) - mrt->s2 * (mrt->s2/Q2); - if (mrt->s2 <= 0) mrt->s2 += M2; - rv = (mrt->s1 + mrt->s2) % M1; - dv = (double)rv / ((double)(M1-1)); - return dv; -} - -unsigned int mrandRange(unsigned int low, unsigned int high, mrand_t *mrt) { - assert(low <= high); - double drv = mrandDouble(mrt); - unsigned int av = (unsigned int)(drv * (double)(high-low) + 0.5); - return low + av; -} - -/******************************************************************************/ -#endif diff --git a/P08_Sync/work/Sync/banking/a3/mtimer.h b/P08_Sync/work/Sync/banking/a3/mtimer.h deleted file mode 100644 index 63aa950..0000000 --- a/P08_Sync/work/Sync/banking/a3/mtimer.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef TIMER_MACRO_DEFINITIONS -#define TIMER_MACRO_DEFINITIONS - -/******************************************************************************/ -// Course: BSy -// File: mtimer.h -// Purpose: timer functions gettimeofday() -// Author: M. Thaler, ZHAW, 1/2016 -// Version: v.fs20 -/******************************************************************************/ -// gettimeofday() -// function: elapsed time: between start and stop -// data type: gtimer_t -// functions: startGTimer(gtimer_t tdata) -> start timer -// stopGTimer(gtimer_t tdata) -> stop timer -// double getWallGTime(gtimer_t tdata) -> get time in s -// printGTime(X) -> print time in s -// -// -> see also "man gettimeofday" -/******************************************************************************/ - -#include -#include -#include -#include - - -/******************************************************************************/ - -typedef struct gtimer_t { struct timeval sT; \ - struct timeval eT; } gtimer_t; - -#define startGTimer(X) gettimeofday(&X.sT, NULL) -#define stopGTimer(X) gettimeofday(&X.eT, NULL) -#define getGTime(X) ((double)(X.eT.tv_sec) - (double)(X.sT.tv_sec)) +\ - ((double)X.eT.tv_usec - (double)X.sT.tv_usec)/1e6 -#define printGTime(X) printf("Run time %3.2lfs\n", getGTime(X)) - -/******************************************************************************/ - -#endif - diff --git a/P08_Sync/work/Sync/banking/a3/startApp b/P08_Sync/work/Sync/banking/a3/startApp deleted file mode 100644 index 211c509..0000000 --- a/P08_Sync/work/Sync/banking/a3/startApp +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -./main.e 1 -./main.e 2 -./main.e 4 diff --git a/P08_Sync/work/Sync/basicSequence/coffeeTeller.c b/P08_Sync/work/Sync/basicSequence/coffeeTeller.c deleted file mode 100644 index 4b96adb..0000000 --- a/P08_Sync/work/Sync/basicSequence/coffeeTeller.c +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* -* File: coffeTeller.c -* Purpose: simple sequence with semaphores -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(void) { - - int i; - sem_t *coin, *coffee, *ready; - - // set up a semaphore - coin = sem_open(COIN_SEMAPHOR, 0); - coffee = sem_open(COFFEE_SEMAPHOR, 0); - ready = sem_open(READY_SEMAPHOR, 0); - - // start teller machine - printf("\nCoffee teller machine starting\n\n"); - - i = 0; - while (i < ITERS) { - printf("teller (%d): waiting for coin\n", i); - printf(" (%d): got coin\n", i); - printf(" (%d): dispense coffee\n", i); - i++; - } -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/basicSequence/commonDefs.h b/P08_Sync/work/Sync/basicSequence/commonDefs.h deleted file mode 100644 index bf53a72..0000000 --- a/P08_Sync/work/Sync/basicSequence/commonDefs.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef MY_DEFINITIONS_HEADER -#define MY_DEFINITIONS_HEADER - -/******************************************************************************* -* File: commonDefs.h -* Purpose: common definitions -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013, 4/2014 -* Version: v.fs20 -*******************************************************************************/ - -#define MYTURN_SEMAPHOR "/my_semaphor_1_name_simple_seq" -#define COIN_SEMAPHOR "/my_semaphor_2_name_simple_seq" -#define COFFEE_SEMAPHOR "/my_semaphor_3_name_simple_seq" -#define READY_SEMAPHOR "/my_semaphor_4_name_simple_seq" - -#define ITERS (100*1000*1000) -#define CUSTOMERS 4 - -//****************************************************************************** - -#define checkSem(X) {if (X == SEM_FAILED) {perror("sem_open"); exit(-1);}} - -#define drinkingCoffee(X) {usleep((((1+X)*rand())+100000)&0xFFFFF);} - -//****************************************************************************** - -#endif - diff --git a/P08_Sync/work/Sync/basicSequence/customer.c b/P08_Sync/work/Sync/basicSequence/customer.c deleted file mode 100644 index a4609e5..0000000 --- a/P08_Sync/work/Sync/basicSequence/customer.c +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* -* File: customer.c -* Purpose: simple sequence with semaphores -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(int argc, char *argv[]) { - - int i, myID; - sem_t *myTurn, *coin, *coffee, *ready; - - if (argc > 1) - myID = atoi(argv[1]); - else - myID = 0; - - // set up a semaphore - myTurn = sem_open(MYTURN_SEMAPHOR, 0); - coin = sem_open(COIN_SEMAPHOR, 0); - coffee = sem_open(COFFEE_SEMAPHOR, 0); - ready = sem_open(READY_SEMAPHOR, 0); - - // start customer - printf("Customer starting (%d)\n", myID); - - // now check the sum - for (i = 0; i < ITERS; i++) { - printf("\t\t\t\tcustomer(%d) put coin %d\n", myID, i); - printf("\t\t\t\tcustomer(%d) waiting for coffee %d\n", myID, i); - printf("\t\t\t\tcustomer(%d) got coffee %d\n", myID, i); - drinkingCoffee(myID); - } -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/basicSequence/makefile b/P08_Sync/work/Sync/basicSequence/makefile deleted file mode 100644 index 4b2726a..0000000 --- a/P08_Sync/work/Sync/basicSequence/makefile +++ /dev/null @@ -1,40 +0,0 @@ -# Author M. Thaler InIT/ZHAW -# Version v.fs20 - -CMP= gcc -std=gnu99 -CMPFLAGS= -Wall -g -LIB= -pthread -EXENAME0= startApp.e -EXENAME1= coffeeTeller.e -EXENAME2= customer.e - -doit: - @make --no-print-directory clean - @make --no-print-directory startApp - @make --no-print-directory coffeeTeller - @make --no-print-directory customer - -startApp: startApp.o - $(CMP) $(CMPFLAGS) startApp.o $(LIB) -o $(EXENAME0) - -coffeeTeller: coffeeTeller.o - $(CMP) $(CMPFLAGS) coffeeTeller.o $(LIB) -o $(EXENAME1) - -customer: customer.o - $(CMP) $(CMPFLAGS) customer.o $(LIB) -o $(EXENAME2) - -.c.o: - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: - $(CMP) -c $(CMPFLAGS) $< - -all: - @make clean - make doit - -clean: - @rm -f *.e *.o - -purge: - @make clean diff --git a/P08_Sync/work/Sync/basicSequence/startApp.c b/P08_Sync/work/Sync/basicSequence/startApp.c deleted file mode 100644 index 06717b6..0000000 --- a/P08_Sync/work/Sync/basicSequence/startApp.c +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* -* File: startApp.c -* Purpose: ice cream teller, basic sequence -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012, 7/2013 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "commonDefs.h" - -//****************************************************************************** - -int main(void) { - - int j; - char string[8]; - sem_t *myTurn, *coin, *coffee, *ready; - pid_t tellerPID; - - sem_unlink(MYTURN_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(COIN_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(COFFEE_SEMAPHOR); // delete seamphor if it still exists - sem_unlink(READY_SEMAPHOR); // delete seamphor if it still exists - - // set up a semaphore (? -> initial value of semaphor) - // checkSem() -> macro defined in commonDefs.h - - /* - myTurn = sem_open(MYTURN_SEMAPHOR, O_CREAT, 0700, ?); checkSem(myTurn); - coin = sem_open(COIN_SEMAPHOR, O_CREAT, 0700, ?); checkSem(coin); - coffee = sem_open(COFFEE_SEMAPHOR, O_CREAT, 0700, ?); checkSem(coffee); - ready = sem_open(READY_SEMAPHOR, O_CREAT, 0700, ?); checkSem(ready); - */ - - // now that the resources are set up, the supervisor can be started - for (j = 1; j <= CUSTOMERS; j++) { - if (fork() == 0) { - sprintf(string, "%d", j); - execl("./customer.e", "customer.e", string, NULL); - printf("*** could not start customer.e ***\n"); - } - } - - if ((tellerPID = fork()) == 0) { - execl("./coffeeTeller.e", "coffeeTeller.e", "0", NULL); - printf("*** could not start coffeTeller ***\n"); - } - - waitpid(tellerPID, NULL, 0); - system("killall coffeeTeller.e"); - system("killall customer.e"); // kill all customers - - // clean up resources - sem_unlink(MYTURN_SEMAPHOR); - sem_unlink(COIN_SEMAPHOR); - sem_unlink(COFFEE_SEMAPHOR); - sem_unlink(READY_SEMAPHOR); - printf("\n"); -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/multiCPUs b/P08_Sync/work/Sync/multiCPUs deleted file mode 100644 index f7cd5bc..0000000 --- a/P08_Sync/work/Sync/multiCPUs +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash -#****************************************************************************** -# Purpose: turn off all CPU's but one (CPU 0), turn on all CPU's -# Linux only -# Author: M. Thaler, BSy 4/2014 - -# Usage: multiCPUs off: turn off all CPUs but one -# multiCPUs on: turn all CPUs on -# -# Version: v.fs20 -#****************************************************************************** - -theDir="/sys/devices/system/cpu" - -# check if sys exists -if test ! -d $theDir -then - echo "*** cannot set to single CPU ***" - exit 1 -fi - -# figure out what to do: multi CPUs off (single CPU) or all CPU's on -let status=1 -if test "$1" = "on" -then - let status=1 -else - if test "$1" = "off" - then - let status=0 - else - echo "*** what do you want: ... on or off? ***" - exit 1 - fi -fi - -# turn CPU's on or off - -cd $theDir - -CPUs=`ls -d cpu* | grep 'cpu[0-9][0-9]*'` -for CPU in $CPUs -do - if test ! "$CPU" = "cpu0" - then - echo "$CPU on = $status" - currVal=`cat ./$CPU/online` - # only change if different ... avoid error message - if test ! "$currVal" = "$status" - then - echo "$status" > "./$CPU/online" - fi - fi -done - -#****************************************************************************** diff --git a/P08_Sync/work/Sync/mutex/README_MAC_OSX b/P08_Sync/work/Sync/mutex/README_MAC_OSX deleted file mode 100644 index fdf5c02..0000000 --- a/P08_Sync/work/Sync/mutex/README_MAC_OSX +++ /dev/null @@ -1,7 +0,0 @@ -For Mac users - -"pthread_mutex_lock(&lock)" is slow on MACs compared to Linux: - -use instead: "while (pthread_mutex_trylock(&lock) > 0) {} ;" - -which implements a spin lock diff --git a/P08_Sync/work/Sync/mutex/coffeeTeller.c b/P08_Sync/work/Sync/mutex/coffeeTeller.c deleted file mode 100644 index 818fdcf..0000000 --- a/P08_Sync/work/Sync/mutex/coffeeTeller.c +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* -* File: coffeTeller.c -* Purpose: coffe teller with pthreads -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include - -#include - -#include "commonDefs.h" - -//****************************************************************************** - -void *coffeeTeller(void* data) { - - int i; - cData *cD = (cData *) data; - - // now start selling coffee - printf("\nCoffee teller machine starting\n\n"); - - i = 0; - while (i < ITERATIONS) { - if (cD->coinCount != cD->selCount1 + cD->selCount2) { - printf("error c = %5d s1 =%6d s2 =%6d diff: %4d\ti = %d\n", - cD->coinCount, cD->selCount1, cD->selCount2, - cD->coinCount - cD->selCount1 - cD->selCount2, - i); - cD->coinCount = 0; - cD->selCount1 = cD->selCount2 = 0; - } - if (i%1000000 == 0) printf("working %d\n", i); - i++; - } - pthread_exit(0); -} - -//****************************************************************************** diff --git a/P08_Sync/work/Sync/mutex/coffeeTeller.h b/P08_Sync/work/Sync/mutex/coffeeTeller.h deleted file mode 100644 index 3cf9274..0000000 --- a/P08_Sync/work/Sync/mutex/coffeeTeller.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef MY_DEFINITIONS_TELLER_H -#define MY_DEFINITIONS_TELLER_H - -/******************************************************************************* -* File: coffeTeller.h -* Purpose: coffe teller with pthreads -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -void *coffeeTeller(void* data); - -//****************************************************************************** - -#endif diff --git a/P08_Sync/work/Sync/mutex/commonDefs.h b/P08_Sync/work/Sync/mutex/commonDefs.h deleted file mode 100644 index 074dc86..0000000 --- a/P08_Sync/work/Sync/mutex/commonDefs.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MY_DEFINITIONS_HEADER -#define MY_DEFINITIONS_HEADER - -/******************************************************************************* -* File: commonDefs.h -* Purpose: header file for common definitions -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -#define ITERATIONS (100*1000*1000) - -//****************************************************************************** - -#define CUSTOMERS 4 // number of customers to be started - -//****************************************************************************** -// common data - -typedef struct { - int coinCount; // number of paid coffees - int selCount1; // number of chosen coffees of type 1 - int selCount2; // number of chosen coffees of type 2 - pthread_mutex_t lock; // common lock -} cData; - -//****************************************************************************** - -#endif - diff --git a/P08_Sync/work/Sync/mutex/customer.c b/P08_Sync/work/Sync/mutex/customer.c deleted file mode 100644 index f340905..0000000 --- a/P08_Sync/work/Sync/mutex/customer.c +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* -* File: customer.c -* Purpose: customer thread -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include - -#include - -#include "commonDefs.h" -#include "mrand.h" - -//***************************************************************************** - -void *customer(void* data) { - float ranNum; - int i; - rand_t randnum; - - cData *cD = (cData *) data; - - rand_seed(&randnum, 0); - - // put coin and select coffee - for (i = 0; i < ITERATIONS; i++) { - ranNum = rand_float(&randnum); - cD->coinCount += 1; - if (ranNum < 0.5) - cD->selCount1 += 1; - else - cD->selCount2 += 1; - } - - pthread_exit(0); -} - -//***************************************************************************** diff --git a/P08_Sync/work/Sync/mutex/customer.h b/P08_Sync/work/Sync/mutex/customer.h deleted file mode 100644 index 58a2298..0000000 --- a/P08_Sync/work/Sync/mutex/customer.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef MY_DEFINITIONS_CUSTOMER_H -#define MY_DEFINITIONS_CUSTOMER_H - -/******************************************************************************* -* File: customer.h -* Purpose: customer thread -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -void *customer(void* data); - -//****************************************************************************** -#endif diff --git a/P08_Sync/work/Sync/mutex/makefile b/P08_Sync/work/Sync/mutex/makefile deleted file mode 100644 index 744e460..0000000 --- a/P08_Sync/work/Sync/mutex/makefile +++ /dev/null @@ -1,33 +0,0 @@ -# Author M. Thaler -# Version v.fs20 - -CMP= gcc -std=gnu99 -CMPFLAGS= -Wall -g -LIB= -pthread -EXENAME1= startApp.e - -INCLS= commonDefs.h -FILES= startApp.o coffeeTeller.o customer.o - -doit: - @make --no-print-directory clean - @make --no-print-directory coffeeTeller - -coffeeTeller: $(FILES) - $(CMP) $(CMPFLAGS) $(FILES) $(LIB) -o $(EXENAME1) - -.c.o: $(INCLS) - $(CMP) -c $(CMPFLAGS) $< - -.cc.o: $(INCLS) - $(CMP) -c $(CMPFLAGS) $< - -all: - @make clean - make doit - -clean: - @rm -f *.e *.o - -purge: - @make clean diff --git a/P08_Sync/work/Sync/mutex/mrand.h b/P08_Sync/work/Sync/mutex/mrand.h deleted file mode 100644 index 0535f7f..0000000 --- a/P08_Sync/work/Sync/mutex/mrand.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef MY_THREADSAVE_RANDOM_GENERATOR -#define MY_THREADSAVE_RANDOM_GENERATOR - -/****************************************************************************** -* File: mrand.h -* Purpose: simple portable thread save random generator -* ccording to Schrage -* Author: M. Thaler, 5/2012, BSy -* Version: v.fs20 -******************************************************************************/ - -#include - -//****************************************************************************** - -#define MMM_MR 2147483563 -#define AAA_MR 40014 -#define QQQ_MR 53668 -#define RRR_MR 12211 - -#define MRAND_MAX (MMM_MR-1) - -//****************************************************************************** - -typedef int rand_t; - -// seed ------------------------------------------------------------------------ - -void rand_seed(rand_t *srand, int seed) { - struct timeval prandom_seed; - gettimeofday(&prandom_seed, NULL); - if (seed > 0) - *srand = seed; - else - *srand = (prandom_seed.tv_usec); - -} - -// integer random value ------------------------------------------------------- -// range 0 .. MRAND_MAX (inclusive) - -int rand_int(rand_t *srand) { - int nx; - nx = AAA_MR * (*srand % QQQ_MR) - RRR_MR * (*srand / QQQ_MR); - *srand = (nx > 0) ? nx : nx + MMM_MR; - return (*srand); -} - -// float random value --------------------------------------------------------- -// range 0.0 .. 1.0 (inclusive) - -float rand_float(rand_t *srand) { - float fx; - *srand = rand_int(srand); - fx = (float)(*srand) / ((float)MRAND_MAX); - return (fx); -} - -// double random value -------------------------------------------------------- -// range 0.0 .. 1.0 (inclusive) - -double rand_double(rand_t *srand) { - double fx; - *srand = rand_int(srand); - fx = (double)(*srand) / ((double)MRAND_MAX); - return (fx); -} - -// unsigned int random range -------------------------------------------------- -// range low .. high - -unsigned int rand_range(unsigned int low, unsigned int high, rand_t *srand) { - unsigned int rv; - double prop; - prop = ((double)(high - low)) * rand_double(srand); - rv = low + ((unsigned int) prop); - return(rv); -} - -// unsigned int probability --------------------------------------------------- -// returns 0 or 1 - -unsigned int rand_prob(double prob, rand_t *srand) { - if (rand_double(srand) >= 1.0-prob) - return 1; - else - return 0; -} - -// unsigned int toss coin ----------------------------------------------------- -// returns 0 or 1 - -unsigned int toss_coin(rand_t *srand) { - if (rand_float(srand) >= 0.5) - return 1; - else - return 0; -} - -//****************************************************************************** - -#endif diff --git a/P08_Sync/work/Sync/mutex/startApp.c b/P08_Sync/work/Sync/mutex/startApp.c deleted file mode 100644 index 13ef658..0000000 --- a/P08_Sync/work/Sync/mutex/startApp.c +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* -* File: startApp.c -* Purpose: mutex with locks -* Course: bsy -* Author: M. Thaler, 2011 -* Revision: 5/2012 -* Version: v.fs20 -*******************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include - -#include "commonDefs.h" -#include "coffeeTeller.h" -#include "customer.h" - -//****************************************************************************** -// common data - -cData cD; - -//****************************************************************************** - -int main(void) { - - unsigned int j; - int pthr; - - pthread_t tellerThread, customerThreads[CUSTOMERS]; - - cD.coinCount = 0; - cD.selCount1 = 0; - cD.selCount2 = 0; - pthread_mutex_init(&(cD.lock), NULL); - - // start teller and customers now that everything is set up - pthr = pthread_create(&tellerThread, NULL, coffeeTeller, &cD); - assert(pthr == 0); - for (j = 0; j < CUSTOMERS; j++) { - pthr = pthread_create(&(customerThreads[j]), NULL, customer, &cD); - assert(pthr == 0); - } - - // wait for all threads to terminate - pthread_join(tellerThread, NULL); - - for (j = 0; j < CUSTOMERS; j++) { - pthr = pthread_join(customerThreads[j], NULL); - assert(pthr == 0); - } -} - -//****************************************************************************** diff --git a/P09_File_Operations/README.md b/P09_File_Operations/README.md deleted file mode 100644 index 8ecb004..0000000 --- a/P09_File_Operations/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# 09 - File Operations - -___ - - -___ - -## 1. Übersicht - - -___ - -## 2. Lernziele - - - -___ - -## 3. Aufgabe 1: - -___ - -## 4. Bewertung -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| 1 | - | - | - - - -___ -Version: 16.02.2022 diff --git a/P10_IPC/README.md b/P10_IPC/README.md deleted file mode 100644 index bacd4fa..0000000 --- a/P10_IPC/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# 10 - IPC - -___ - -## 1. Übersicht - - -___ - -## 2. Lernziele - - - -___ - -## 3. Aufgabe 1: - -___ - -## 4. Bewertung -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - -| Aufgabe | Kriterium | Punkte | -| :-- | :-- | :-- | -| | Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. | | -| 1 | - | - | - - - -___ -Version: 16.02.2022 diff --git a/README.md b/README.md deleted file mode 100644 index 8f28a8f..0000000 --- a/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# SNP - Laboratory Planning - - -### Description -TODO - -### Views -[Github-Pages](https://github.zhaw.ch/pages/SNP/snp/) - -[.pdf](https://github.zhaw.ch/SNP/snp-lab-code/blob/master/main.pdf) diff --git a/TicTacToe.png b/TicTacToe.png deleted file mode 100644 index 728da54..0000000 Binary files a/TicTacToe.png and /dev/null differ diff --git a/Wochentagsberechnung.jpg b/Wochentagsberechnung.jpg deleted file mode 100644 index cd3abd0..0000000 Binary files a/Wochentagsberechnung.jpg and /dev/null differ diff --git a/a.png b/a.png deleted file mode 100644 index 925d567..0000000 Binary files a/a.png and /dev/null differ diff --git a/b.png b/b.png deleted file mode 100644 index 1c7d260..0000000 Binary files a/b.png and /dev/null differ diff --git a/c.png b/c.png deleted file mode 100644 index 0b42e10..0000000 Binary files a/c.png and /dev/null differ diff --git a/coffee_customer.png b/coffee_customer.png deleted file mode 100644 index 37d6274..0000000 Binary files a/coffee_customer.png and /dev/null differ diff --git a/d.png b/d.png deleted file mode 100644 index 43daab4..0000000 Binary files a/d.png and /dev/null differ diff --git a/ein_mann_orchester.png b/ein_mann_orchester.png deleted file mode 100644 index 099e0eb..0000000 Binary files a/ein_mann_orchester.png and /dev/null differ diff --git a/en-zhaw-ines-rgb.png b/en-zhaw-ines-rgb.png deleted file mode 100644 index 782bfdf..0000000 Binary files a/en-zhaw-ines-rgb.png and /dev/null differ diff --git a/kalender-108_v-ARDFotogalerie.jpg b/kalender-108_v-ARDFotogalerie.jpg deleted file mode 100644 index 9f221af..0000000 Binary files a/kalender-108_v-ARDFotogalerie.jpg and /dev/null differ diff --git a/latexmkjarc b/latexmkjarc deleted file mode 100644 index 6e36b19..0000000 --- a/latexmkjarc +++ /dev/null @@ -1,22 +0,0 @@ -$latex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S'; -$dvipdf = 'dvipdfmx %O -o %D %S'; -$makeindex = 'internal mendex %S %B %D'; -sub mendex { - my ($source, $basename, $destination) = @_; - my $dictfile = $basename . ".dic"; - unlink($destination); - system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source); - if ($? > 0) { - print("mendex exited with error code $? (ignored)\n"); - } - if (!-e $destination) { - # create an empty .ind file if nothing - open(FH, ">" . $destination); - close(FH); - } - return 0; -} -add_cus_dep( "glo", "gls", 0, "makeglo" ); -sub makeglo { - return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); -} \ No newline at end of file diff --git a/latexmkrc b/latexmkrc deleted file mode 100644 index bba17fa..0000000 --- a/latexmkrc +++ /dev/null @@ -1,9 +0,0 @@ -$latex = 'latex ' . $ENV{'LATEXOPTS'} . ' %O %S'; -$pdflatex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; -$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; -$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S'; -$makeindex = 'makeindex -s python.ist %O -o %D %S'; -add_cus_dep( "glo", "gls", 0, "makeglo" ); -sub makeglo { - return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); -} \ No newline at end of file diff --git a/linked_list.png b/linked_list.png deleted file mode 100644 index ee01144..0000000 Binary files a/linked_list.png and /dev/null differ diff --git a/main.aux b/main.aux deleted file mode 100644 index d9b1c58..0000000 --- a/main.aux +++ /dev/null @@ -1,295 +0,0 @@ -\relax -\providecommand\hyper@newdestlabel[2]{} -\providecommand{\transparent@use}[1]{} -\providecommand\babel@aux[2]{} -\@nameuse{bbl@beforestart} -\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} -\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined -\global\let\oldcontentsline\contentsline -\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} -\global\let\oldnewlabel\newlabel -\gdef\newlabel#1#2{\newlabelxx{#1}#2} -\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} -\AtEndDocument{\ifx\hyper@anchor\@undefined -\let\contentsline\oldcontentsline -\let\newlabel\oldnewlabel -\fi} -\fi} -\global\let\hyper@last\relax -\gdef\HyperFirstAtBeginDocument#1{#1} -\providecommand\HyField@AuxAddToFields[1]{} -\providecommand\HyField@AuxAddToCoFields[2]{} -\babel@aux{english}{} -\@writefile{toc}{\contentsline {chapter}{Table of contents}{i}{chapter*.1}\protected@file@percent } -\newlabel{index::doc}{{}{1}{\contentsname }{section*.2}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {1}01 \sphinxhyphen {} Erste Schritte mit C}{1}{chapter.1}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P01_Erste_Schritte_mit_C/README:erste-schritte-mit-c}{{1}{1}{01 \sphinxhyphen {} Erste Schritte mit C}{chapter.1}{}} -\newlabel{P01_Erste_Schritte_mit_C/README::doc}{{1}{1}{01 \sphinxhyphen {} Erste Schritte mit C}{chapter.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.1}1. Übersicht}{1}{section.1.1}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:ubersicht}{{1.1}{1}{1. Übersicht}{section.1.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.2}2. Lernziele}{1}{section.1.2}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:lernziele}{{1.2}{1}{2. Lernziele}{section.1.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.3}3. Aufgabe 1: virtuelle Maschine}{1}{section.1.3}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:aufgabe-1-virtuelle-maschine}{{1.3}{1}{3. Aufgabe 1: virtuelle Maschine}{section.1.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.4}4. Aufgabe 2: Hello World}{2}{section.1.4}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:aufgabe-2-hello-world}{{1.4}{2}{4. Aufgabe 2: Hello World}{section.1.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.5}5. Aufgabe 3: Tabellenausgabe}{2}{section.1.5}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:aufgabe-3-tabellenausgabe}{{1.5}{2}{5. Aufgabe 3: Tabellenausgabe}{section.1.5}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.6}6. Aufgabe 4: Zeichen und Wörter zählen}{3}{section.1.6}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:aufgabe-4-zeichen-und-worter-zahlen}{{1.6}{3}{6. Aufgabe 4: Zeichen und Wörter zählen}{section.1.6}{}} -\@writefile{toc}{\contentsline {section}{\numberline {1.7}7. Bewertung}{3}{section.1.7}\protected@file@percent } -\newlabel{P01_Erste_Schritte_mit_C/README:bewertung}{{1.7}{3}{7. Bewertung}{section.1.7}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {2}02: Funktionen, Datentyp “enum”}{4}{chapter.2}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P02_Funktionen_Datentyp_enum/README:funktionen-datentyp-enum}{{2}{4}{02: Funktionen, Datentyp “enum”}{chapter.2}{}} -\newlabel{P02_Funktionen_Datentyp_enum/README::doc}{{2}{4}{02: Funktionen, Datentyp “enum”}{chapter.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.1}1. Übersicht}{4}{section.2.1}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:ubersicht}{{2.1}{4}{1. Übersicht}{section.2.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.2}2. Lernziele}{5}{section.2.2}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:lernziele}{{2.2}{5}{2. Lernziele}{section.2.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.3}3. Aufgaben}{5}{section.2.3}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:aufgaben}{{2.3}{5}{3. Aufgaben}{section.2.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.1}3.1 Aufgabe 1 Tage pro Monat}{6}{subsection.2.3.1}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:aufgabe-1-tage-pro-monat}{{2.3.1}{6}{3.1 Aufgabe 1 Tage pro Monat}{subsection.2.3.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.2}3.2 Aufgabe 2 Bestimmen des Wochentags}{7}{subsection.2.3.2}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:aufgabe-2-bestimmen-des-wochentags}{{2.3.2}{7}{3.2 Aufgabe 2 Bestimmen des Wochentags}{subsection.2.3.2}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2.1}3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen}{7}{subsubsection.2.3.2.1}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen}{{2.3.2.1}{7}{3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen}{subsubsection.2.3.2.1}{}} -\@writefile{toc}{\contentsline {paragraph}{3.2.1.1 Argument Format}{7}{paragraph*.3}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:argument-format}{{2.3.2.1}{7}{3.2.1.1 Argument Format}{paragraph*.3}{}} -\@writefile{toc}{\contentsline {paragraph}{3.2.1.2 Korrektes Datum}{7}{paragraph*.4}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:korrektes-datum}{{2.3.2.1}{7}{3.2.1.2 Korrektes Datum}{paragraph*.4}{}} -\@writefile{toc}{\contentsline {paragraph}{3.2.1.3 Vorgaben an die Umsetzung}{7}{paragraph*.5}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:vorgaben-an-die-umsetzung}{{2.3.2.1}{7}{3.2.1.3 Vorgaben an die Umsetzung}{paragraph*.5}{}} -\@writefile{toc}{\contentsline {paragraph}{3.2.1.4 Hinweise}{8}{paragraph*.6}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:hinweise}{{2.3.2.1}{8}{3.2.1.4 Hinweise}{paragraph*.6}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2.2}3.2.2 Teilaufgabe Wochentag Berechnung}{8}{subsubsection.2.3.2.2}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:teilaufgabe-wochentag-berechnung}{{2.3.2.2}{8}{3.2.2 Teilaufgabe Wochentag Berechnung}{subsubsection.2.3.2.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.4}4. Bewertung}{8}{section.2.4}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:bewertung}{{2.4}{8}{4. Bewertung}{section.2.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.5}5. Anhang}{9}{section.2.5}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:anhang}{{2.5}{9}{5. Anhang}{section.2.5}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.5.1}5.1 Sprach Element}{9}{subsection.2.5.1}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:sprach-element}{{2.5.1}{9}{5.1 Sprach Element}{subsection.2.5.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.5.2}5.2 Beschreibung}{9}{subsection.2.5.2}\protected@file@percent } -\newlabel{P02_Funktionen_Datentyp_enum/README:beschreibung}{{2.5.2}{9}{5.2 Beschreibung}{subsection.2.5.2}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {3}03 \sphinxhyphen {} Bit Operationen, Struct, Typedef}{10}{chapter.3}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P03_Bit_Operation_struct_typedef/README:bit-operationen-struct-typedef}{{3}{10}{03 \sphinxhyphen {} Bit Operationen, Struct, Typedef}{chapter.3}{}} -\newlabel{P03_Bit_Operation_struct_typedef/README::doc}{{3}{10}{03 \sphinxhyphen {} Bit Operationen, Struct, Typedef}{chapter.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {3.1}1. Bit Operationen}{10}{section.3.1}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:bit-operationen}{{3.1}{10}{1. Bit Operationen}{section.3.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}1.1 Übungen}{11}{subsection.3.1.1}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:ubungen}{{3.1.1}{11}{1.1 Übungen}{subsection.3.1.1}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1.1}1. Basis Operationen}{11}{subsubsection.3.1.1.1}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:basis-operationen}{{3.1.1.1}{11}{1. Basis Operationen}{subsubsection.3.1.1.1}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1.2}2. Variablen tauschen (ohne Dritt\sphinxhyphen {}Variable)}{11}{subsubsection.3.1.1.2}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:variablen-tauschen-ohne-dritt-variable}{{3.1.1.2}{11}{2. Variablen tauschen (ohne Dritt\sphinxhyphen {}Variable)}{subsubsection.3.1.1.2}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1.3}3. Lower\sphinxhyphen {} / Uppercase}{12}{subsubsection.3.1.1.3}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:lower-uppercase}{{3.1.1.3}{12}{3. Lower\sphinxhyphen {} / Uppercase}{subsubsection.3.1.1.3}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1.4}4. Prüfen auf 2\sphinxhyphen {}er Potenz}{12}{subsubsection.3.1.1.4}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:prufen-auf-2-er-potenz}{{3.1.1.4}{12}{4. Prüfen auf 2\sphinxhyphen {}er Potenz}{subsubsection.3.1.1.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {3.2}2. Struct \& typedef}{13}{section.3.2}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:struct-typedef}{{3.2}{13}{2. Struct \& typedef}{section.3.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}2.1 Übungen}{13}{subsection.3.2.1}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:id1}{{3.2.1}{13}{2.1 Übungen}{subsection.3.2.1}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1.1}1. Bit Operationen Rechner}{13}{subsubsection.3.2.1.1}\protected@file@percent } -\newlabel{P03_Bit_Operation_struct_typedef/README:bit-operationen-rechner}{{3.2.1.1}{13}{1. Bit Operationen Rechner}{subsubsection.3.2.1.1}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {4}04 \sphinxhyphen {} Modularisieren von C Code}{14}{chapter.4}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:modularisieren-von-c-code}{{4}{14}{04 \sphinxhyphen {} Modularisieren von C Code}{chapter.4}{}} -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code::doc}{{4}{14}{04 \sphinxhyphen {} Modularisieren von C Code}{chapter.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.1}1. Übersicht}{14}{section.4.1}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:ubersicht}{{4.1}{14}{1. Übersicht}{section.4.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.2}2. Lernziele}{14}{section.4.2}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:lernziele}{{4.2}{14}{2. Lernziele}{section.4.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.3}3. Aufgabe 1: Modularisieren}{15}{section.4.3}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-1-modularisieren}{{4.3}{15}{3. Aufgabe 1: Modularisieren}{section.4.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.1}3.1 Teilaufgabe Modules einbinden, Header Files schreiben}{15}{subsection.4.3.1}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:teilaufgabe-modules-einbinden-header-files-schreiben}{{4.3.1}{15}{3.1 Teilaufgabe Modules einbinden, Header Files schreiben}{subsection.4.3.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.4}4. Aufgabe 2: Makefile Regeln}{16}{section.4.4}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-2-makefile-regeln}{{4.4}{16}{4. Aufgabe 2: Makefile Regeln}{section.4.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.4.1}4.1 Neue Regeln hinzufügen}{16}{subsection.4.4.1}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:neue-regeln-hinzufugen}{{4.4.1}{16}{4.1 Neue Regeln hinzufügen}{subsection.4.4.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.5}5. Aufgabe 3}{16}{section.4.5}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-3}{{4.5}{16}{5. Aufgabe 3}{section.4.5}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.6}6. Bewertung}{16}{section.4.6}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:bewertung}{{4.6}{16}{6. Bewertung}{section.4.6}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.7}7. Erweiterung Doxyfile für Abhängigkeitsanalyse}{16}{section.4.7}\protected@file@percent } -\newlabel{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:erweiterung-doxyfile-fur-abhangigkeitsanalyse}{{4.7}{16}{7. Erweiterung Doxyfile für Abhängigkeitsanalyse}{section.4.7}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {5}05 \sphinxhyphen {} Arrays/Strings/TicTacToe}{18}{chapter.5}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P05_TicTacToe/README:arrays-strings-tictactoe}{{5}{18}{05 \sphinxhyphen {} Arrays/Strings/TicTacToe}{chapter.5}{}} -\newlabel{P05_TicTacToe/README::doc}{{5}{18}{05 \sphinxhyphen {} Arrays/Strings/TicTacToe}{chapter.5}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5.1}1. Übersicht}{18}{section.5.1}\protected@file@percent } -\newlabel{P05_TicTacToe/README:ubersicht}{{5.1}{18}{1. Übersicht}{section.5.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5.2}2. Lernziele}{18}{section.5.2}\protected@file@percent } -\newlabel{P05_TicTacToe/README:lernziele}{{5.2}{18}{2. Lernziele}{section.5.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5.3}3. Aufgabe 1: Sortieren von Strings}{18}{section.5.3}\protected@file@percent } -\newlabel{P05_TicTacToe/README:aufgabe-1-sortieren-von-strings}{{5.3}{18}{3. Aufgabe 1: Sortieren von Strings}{section.5.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5.4}4. Aufgabe 2: TicTacToe}{19}{section.5.4}\protected@file@percent } -\newlabel{P05_TicTacToe/README:aufgabe-2-tictactoe}{{5.4}{19}{4. Aufgabe 2: TicTacToe}{section.5.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.1}4.1 Teilaufgabe test\_model\_init}{20}{subsection.5.4.1}\protected@file@percent } -\newlabel{P05_TicTacToe/README:teilaufgabe-test-model-init}{{5.4.1}{20}{4.1 Teilaufgabe test\_model\_init}{subsection.5.4.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.2}4.2 Teilaufgabe test\_model\_get\_state und test\_model\_get\_winner}{21}{subsection.5.4.2}\protected@file@percent } -\newlabel{P05_TicTacToe/README:teilaufgabe-test-model-get-state-und-test-model-get-winner}{{5.4.2}{21}{4.2 Teilaufgabe test\_model\_get\_state und test\_model\_get\_winner}{subsection.5.4.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.3}4.3 Teilaufgabe test\_model\_can\_move}{22}{subsection.5.4.3}\protected@file@percent } -\newlabel{P05_TicTacToe/README:teilaufgabe-test-model-can-move}{{5.4.3}{22}{4.3 Teilaufgabe test\_model\_can\_move}{subsection.5.4.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.4}4.4 Teilaufgabe test\_model\_move und test\_model\_get\_win\_line}{22}{subsection.5.4.4}\protected@file@percent } -\newlabel{P05_TicTacToe/README:teilaufgabe-test-model-move-und-test-model-get-win-line}{{5.4.4}{22}{4.4 Teilaufgabe test\_model\_move und test\_model\_get\_win\_line}{subsection.5.4.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5.5}5. Bewertung}{23}{section.5.5}\protected@file@percent } -\newlabel{P05_TicTacToe/README:bewertung}{{5.5}{23}{5. Bewertung}{section.5.5}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {6}06 \sphinxhyphen {} Personen Verwaltung \textendash {} Linked List}{24}{chapter.6}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P06_Personen_Verwaltung_Linked_List/README:personen-verwaltung-linked-list}{{6}{24}{06 \sphinxhyphen {} Personen Verwaltung \textendash {} Linked List}{chapter.6}{}} -\newlabel{P06_Personen_Verwaltung_Linked_List/README::doc}{{6}{24}{06 \sphinxhyphen {} Personen Verwaltung \textendash {} Linked List}{chapter.6}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.1}1. Übersicht}{24}{section.6.1}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:ubersicht}{{6.1}{24}{1. Übersicht}{section.6.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.2}2. Lernziele}{25}{section.6.2}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:lernziele}{{6.2}{25}{2. Lernziele}{section.6.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.3}3. Personenverwaltung}{25}{section.6.3}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:personenverwaltung}{{6.3}{25}{3. Personenverwaltung}{section.6.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.1}3.1 Programmfunktion}{25}{subsection.6.3.1}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:programmfunktion}{{6.3.1}{25}{3.1 Programmfunktion}{subsection.6.3.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.2}3.2 Designvorgaben}{25}{subsection.6.3.2}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:designvorgaben}{{6.3.2}{25}{3.2 Designvorgaben}{subsection.6.3.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.3}3.3 Bestehender Programmrahmen}{28}{subsection.6.3.3}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:bestehender-programmrahmen}{{6.3.3}{28}{3.3 Bestehender Programmrahmen}{subsection.6.3.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.4}4. Aufgabe 1: Modularisierung \textendash {} API und Implementation main.c}{28}{section.6.4}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:aufgabe-1-modularisierung-api-und-implementation-main-c}{{6.4}{28}{4. Aufgabe 1: Modularisierung \textendash {} API und Implementation main.c}{section.6.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.5}5. Aufgabe 2: Implementierung von person.c und list.c}{29}{section.6.5}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:aufgabe-2-implementierung-von-person-c-und-list-c}{{6.5}{29}{5. Aufgabe 2: Implementierung von person.c und list.c}{section.6.5}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.5.1}5.1 Teilaufgabe: Implementierung von person.c}{29}{subsection.6.5.1}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:teilaufgabe-implementierung-von-person-c}{{6.5.1}{29}{5.1 Teilaufgabe: Implementierung von person.c}{subsection.6.5.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.5.2}5.2 Teilaufgabe: Implementierung von list.c}{29}{subsection.6.5.2}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:teilaufgabe-implementierung-von-list-c}{{6.5.2}{29}{5.2 Teilaufgabe: Implementierung von list.c}{subsection.6.5.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.6}6. Aufgabe 3: Unit Tests}{29}{section.6.6}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:aufgabe-3-unit-tests}{{6.6}{29}{6. Aufgabe 3: Unit Tests}{section.6.6}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.7}7. Bewertung}{29}{section.6.7}\protected@file@percent } -\newlabel{P06_Personen_Verwaltung_Linked_List/README:bewertung}{{6.7}{29}{7. Bewertung}{section.6.7}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {7}07 \sphinxhyphen {} Prozesse und Threads}{31}{chapter.7}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P07_Prozesse_und_Threads/README:prozesse-und-threads}{{7}{31}{07 \sphinxhyphen {} Prozesse und Threads}{chapter.7}{}} -\newlabel{P07_Prozesse_und_Threads/README::doc}{{7}{31}{07 \sphinxhyphen {} Prozesse und Threads}{chapter.7}{}} -\@writefile{toc}{\contentsline {section}{\numberline {7.1}1. Übersicht}{32}{section.7.1}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:ubersicht}{{7.1}{32}{1. Übersicht}{section.7.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.1}1.1 Nachweis}{32}{subsection.7.1.1}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:nachweis}{{7.1.1}{32}{1.1 Nachweis}{subsection.7.1.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {7.2}2. Lernziele}{32}{section.7.2}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:lernziele}{{7.2}{32}{2. Lernziele}{section.7.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {7.3}3. Aufgaben}{32}{section.7.3}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgaben}{{7.3}{32}{3. Aufgaben}{section.7.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.1}3.1 Aufgabe 1: Prozess mit fork() erzeugen}{33}{subsection.7.3.1}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-1-prozess-mit-fork-erzeugen}{{7.3.1}{33}{3.1 Aufgabe 1: Prozess mit fork() erzeugen}{subsection.7.3.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.2}3.2 Aufgabe 2: Prozess mit fork() und exec(): Programm Image ersetzen}{33}{subsection.7.3.2}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-2-prozess-mit-fork-und-exec-programm-image-ersetzen}{{7.3.2}{33}{3.2 Aufgabe 2: Prozess mit fork() und exec(): Programm Image ersetzen}{subsection.7.3.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.3}3.3 Aufgabe 3: Prozesshierarchie analysieren}{33}{subsection.7.3.3}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-3-prozesshierarchie-analysieren}{{7.3.3}{33}{3.3 Aufgabe 3: Prozesshierarchie analysieren}{subsection.7.3.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.4}3.4 Aufgabe 4: Zeitlicher Ablauf von Prozessen}{34}{subsection.7.3.4}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-4-zeitlicher-ablauf-von-prozessen}{{7.3.4}{34}{3.4 Aufgabe 4: Zeitlicher Ablauf von Prozessen}{subsection.7.3.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.5}3.5 Aufgabe 5: Waisenkinder (Orphan Processes)}{34}{subsection.7.3.5}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-5-waisenkinder-orphan-processes}{{7.3.5}{34}{3.5 Aufgabe 5: Waisenkinder (Orphan Processes)}{subsection.7.3.5}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.6}3.6 Aufgabe 6: Terminierte, halbtote Prozesse (Zombies)}{34}{subsection.7.3.6}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-6-terminierte-halbtote-prozesse-zombies}{{7.3.6}{34}{3.6 Aufgabe 6: Terminierte, halbtote Prozesse (Zombies)}{subsection.7.3.6}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.7}3.7 Aufgabe 7: Auf Terminieren von Kindprozessen warten}{35}{subsection.7.3.7}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-7-auf-terminieren-von-kindprozessen-warten}{{7.3.7}{35}{3.7 Aufgabe 7: Auf Terminieren von Kindprozessen warten}{subsection.7.3.7}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.8}3.8 Aufgabe 8: Kindprozess als Kopie des Elternprozesses}{36}{subsection.7.3.8}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-8-kindprozess-als-kopie-des-elternprozesses}{{7.3.8}{36}{3.8 Aufgabe 8: Kindprozess als Kopie des Elternprozesses}{subsection.7.3.8}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.9}3.9 Aufgabe 9: Unterschied von Threads gegenüber Prozessen}{36}{subsection.7.3.9}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-9-unterschied-von-threads-gegenuber-prozessen}{{7.3.9}{36}{3.9 Aufgabe 9: Unterschied von Threads gegenüber Prozessen}{subsection.7.3.9}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.10}3.10 Aufgabe 10 (optional):}{37}{subsection.7.3.10}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-10-optional}{{7.3.10}{37}{3.10 Aufgabe 10 (optional):}{subsection.7.3.10}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {7.3.10.1}3.10.1 Übersicht}{37}{subsubsection.7.3.10.1}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:id1}{{7.3.10.1}{37}{3.10.1 Übersicht}{subsubsection.7.3.10.1}{}} -\@writefile{toc}{\contentsline {paragraph}{3.10.1.1 Nachweis}{37}{paragraph*.7}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:id2}{{7.3.10.1}{37}{3.10.1.1 Nachweis}{paragraph*.7}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {7.3.10.2}3.10.2 Lernziele}{37}{subsubsection.7.3.10.2}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:id3}{{7.3.10.2}{37}{3.10.2 Lernziele}{subsubsection.7.3.10.2}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {7.3.10.3}3.10.3 Aufgabe: Dämon Prozesse}{37}{subsubsection.7.3.10.3}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:aufgabe-damon-prozesse}{{7.3.10.3}{37}{3.10.3 Aufgabe: Dämon Prozesse}{subsubsection.7.3.10.3}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {7.3.10.4}3.10.4 Zusatzinformationen}{38}{subsubsection.7.3.10.4}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:zusatzinformationen}{{7.3.10.4}{38}{3.10.4 Zusatzinformationen}{subsubsection.7.3.10.4}{}} -\@writefile{toc}{\contentsline {paragraph}{3.10.4.1 Diese Implementation}{38}{paragraph*.8}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:diese-implementation}{{7.3.10.4}{38}{3.10.4.1 Diese Implementation}{paragraph*.8}{}} -\@writefile{toc}{\contentsline {paragraph}{3.10.4.2 Zusatzinformation zu Dämon Prozessen}{39}{paragraph*.9}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:zusatzinformation-zu-damon-prozessen}{{7.3.10.4}{39}{3.10.4.2 Zusatzinformation zu Dämon Prozessen}{paragraph*.9}{}} -\@writefile{toc}{\contentsline {section}{\numberline {7.4}4. Bewertung}{39}{section.7.4}\protected@file@percent } -\newlabel{P07_Prozesse_und_Threads/README:bewertung}{{7.4}{39}{4. Bewertung}{section.7.4}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {8}08 \sphinxhyphen {} Synchronisationsprobleme}{41}{chapter.8}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P08_Sync/README:synchronisationsprobleme}{{8}{41}{08 \sphinxhyphen {} Synchronisationsprobleme}{chapter.8}{}} -\newlabel{P08_Sync/README::doc}{{8}{41}{08 \sphinxhyphen {} Synchronisationsprobleme}{chapter.8}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.1}1. Übersicht}{41}{section.8.1}\protected@file@percent } -\newlabel{P08_Sync/README:ubersicht}{{8.1}{41}{1. Übersicht}{section.8.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.1.1}1.1 Nachweis}{42}{subsection.8.1.1}\protected@file@percent } -\newlabel{P08_Sync/README:nachweis}{{8.1.1}{42}{1.1 Nachweis}{subsection.8.1.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.2}2. Lernziele}{42}{section.8.2}\protected@file@percent } -\newlabel{P08_Sync/README:lernziele}{{8.2}{42}{2. Lernziele}{section.8.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.3}3. Einführung}{42}{section.8.3}\protected@file@percent } -\newlabel{P08_Sync/README:einfuhrung}{{8.3}{42}{3. Einführung}{section.8.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.3.1}3.1 Wie löst man Synchronisationsprobleme?}{42}{subsection.8.3.1}\protected@file@percent } -\newlabel{P08_Sync/README:wie-lost-man-synchronisationsprobleme}{{8.3.1}{42}{3.1 Wie löst man Synchronisationsprobleme?}{subsection.8.3.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.4}4. Der Kaffee\sphinxhyphen {}Automat}{43}{section.8.4}\protected@file@percent } -\newlabel{P08_Sync/README:der-kaffee-automat}{{8.4}{43}{4. Der Kaffee\sphinxhyphen {}Automat}{section.8.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.4.1}4.1 Aufgabe: Mutual Exclusion}{44}{subsection.8.4.1}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-mutual-exclusion}{{8.4.1}{44}{4.1 Aufgabe: Mutual Exclusion}{subsection.8.4.1}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.1.1}Aufgaben}{44}{subsubsection.8.4.1.1}\protected@file@percent } -\newlabel{P08_Sync/README:aufgaben}{{8.4.1.1}{44}{Aufgaben}{subsubsection.8.4.1.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.4.2}4.2 Aufgabe: Einfache Reihenfolge}{44}{subsection.8.4.2}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-einfache-reihenfolge}{{8.4.2}{44}{4.2 Aufgabe: Einfache Reihenfolge}{subsection.8.4.2}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.2.1}Aufgaben}{45}{subsubsection.8.4.2.1}\protected@file@percent } -\newlabel{P08_Sync/README:id1}{{8.4.2.1}{45}{Aufgaben}{subsubsection.8.4.2.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.4.3}4.3 Aufgabe: Erweiterte Reihenfolge}{45}{subsection.8.4.3}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-erweiterte-reihenfolge}{{8.4.3}{45}{4.3 Aufgabe: Erweiterte Reihenfolge}{subsection.8.4.3}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {8.4.3.1}Aufgabe}{45}{subsubsection.8.4.3.1}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe}{{8.4.3.1}{45}{Aufgabe}{subsubsection.8.4.3.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.4.4}4.4 Zusammenfassung}{45}{subsection.8.4.4}\protected@file@percent } -\newlabel{P08_Sync/README:zusammenfassung}{{8.4.4}{45}{4.4 Zusammenfassung}{subsection.8.4.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.5}5. International Banking}{46}{section.8.5}\protected@file@percent } -\newlabel{P08_Sync/README:international-banking}{{8.5}{46}{5. International Banking}{section.8.5}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.5.1}5.1 Implementation}{46}{subsection.8.5.1}\protected@file@percent } -\newlabel{P08_Sync/README:implementation}{{8.5.1}{46}{5.1 Implementation}{subsection.8.5.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.5.2}5.2 Aufgabe: Konto Synchronisation}{46}{subsection.8.5.2}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-konto-synchronisation}{{8.5.2}{46}{5.2 Aufgabe: Konto Synchronisation}{subsection.8.5.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.5.3}5.3 Aufgabe: Filialen Zugriff in Critical Section}{46}{subsection.8.5.3}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-filialen-zugriff-in-critical-section}{{8.5.3}{46}{5.3 Aufgabe: Filialen Zugriff in Critical Section}{subsection.8.5.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.5.4}5.4 Aufgabe: Refactoring der Synchronisation}{46}{subsection.8.5.4}\protected@file@percent } -\newlabel{P08_Sync/README:aufgabe-refactoring-der-synchronisation}{{8.5.4}{46}{5.4 Aufgabe: Refactoring der Synchronisation}{subsection.8.5.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8.6}6. Bewertung}{47}{section.8.6}\protected@file@percent } -\newlabel{P08_Sync/README:bewertung}{{8.6}{47}{6. Bewertung}{section.8.6}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {9}09 \sphinxhyphen {} File Operations}{48}{chapter.9}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P09_File_Operations/README:file-operations}{{9}{48}{09 \sphinxhyphen {} File Operations}{chapter.9}{}} -\newlabel{P09_File_Operations/README::doc}{{9}{48}{09 \sphinxhyphen {} File Operations}{chapter.9}{}} -\@writefile{toc}{\contentsline {section}{\numberline {9.1}1. Übersicht}{48}{section.9.1}\protected@file@percent } -\newlabel{P09_File_Operations/README:ubersicht}{{9.1}{48}{1. Übersicht}{section.9.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {9.2}2. Lernziele}{48}{section.9.2}\protected@file@percent } -\newlabel{P09_File_Operations/README:lernziele}{{9.2}{48}{2. Lernziele}{section.9.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {9.3}3. Aufgabe 1:}{48}{section.9.3}\protected@file@percent } -\newlabel{P09_File_Operations/README:aufgabe-1}{{9.3}{48}{3. Aufgabe 1:}{section.9.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {9.4}4. Bewertung}{48}{section.9.4}\protected@file@percent } -\newlabel{P09_File_Operations/README:bewertung}{{9.4}{48}{4. Bewertung}{section.9.4}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {10}10 \sphinxhyphen {} IPC}{49}{chapter.10}\protected@file@percent } -\@writefile{lof}{\addvspace {10\p@ }} -\@writefile{lot}{\addvspace {10\p@ }} -\newlabel{P10_IPC/README:ipc}{{10}{49}{10 \sphinxhyphen {} IPC}{chapter.10}{}} -\newlabel{P10_IPC/README::doc}{{10}{49}{10 \sphinxhyphen {} IPC}{chapter.10}{}} -\@writefile{toc}{\contentsline {section}{\numberline {10.1}1. Übersicht}{49}{section.10.1}\protected@file@percent } -\newlabel{P10_IPC/README:ubersicht}{{10.1}{49}{1. Übersicht}{section.10.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {10.2}2. Lernziele}{49}{section.10.2}\protected@file@percent } -\newlabel{P10_IPC/README:lernziele}{{10.2}{49}{2. Lernziele}{section.10.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {10.3}3. Aufgabe 1:}{49}{section.10.3}\protected@file@percent } -\newlabel{P10_IPC/README:aufgabe-1}{{10.3}{49}{3. Aufgabe 1:}{section.10.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {10.4}4. Bewertung}{49}{section.10.4}\protected@file@percent } -\newlabel{P10_IPC/README:bewertung}{{10.4}{49}{4. Bewertung}{section.10.4}{}} -\gdef \@abspage@last{53} diff --git a/main.fdb_latexmk b/main.fdb_latexmk deleted file mode 100644 index 2b11739..0000000 --- a/main.fdb_latexmk +++ /dev/null @@ -1,218 +0,0 @@ -# Fdb version 3 -["makeindex main.idx"] 1645024877 "main.idx" "main.ind" "main" 1645084636 - "main.idx" 1645084635 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" - (generated) - "main.ilg" - "main.ind" -["pdflatex"] 1645084634 "main.tex" "main.pdf" "main" 1645084636 - "135oALYhkYyXB2aG0F-qrwA.jpeg" 1644933039 28796 f9cef91ae7a04013ca14640f35187599 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map" 1644474942 123072 4dfec00f36c42e8f2db702e61ef5862a "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecbx1000.pk" 1644474959 25420 b1b863c5175ccd2a9a60bbcd0e07aec7 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecbx1200.pk" 1644474955 31952 a08b7c23b9d95a70bd956de9e30f758b "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecbx1440.pk" 1644474962 40136 86f2bd3c6b4564d84b54d6621ebe96c1 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecbx2074.pk" 1644474957 59008 131236bef7192b1be43caa07e4981c9e "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecbx2488.pk" 1644474964 72288 41615f73245b77d5ff98e3014ff72ebc "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecit1000.pk" 1644474949 26728 f42cf8151a404c2d9bae3ab9e9c6023b "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecrm0800.pk" 1644474947 19080 2b1eea2e535e11d98a202141c1b0e935 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecrm0900.pk" 1644474961 21356 b52f161ff6876516265c4e7f48c5165e "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecrm1000.pk" 1644474958 23808 7e7929695c466f92ed0c8f45f373c2b0 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecss1000.pk" 1644474950 19932 a83ca62b8d19276d4dd16b36b7c613b2 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecti0900.pk" 1644474960 28820 366a24d5ffd435b4b93b0566c01a73d7 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ecti1000.pk" 1644474954 31892 54481007e6fbe225dfaa98331c87cd34 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/ectt1000.pk" 1644474953 20028 07b9d27d05a3c1d587f5d3bf61d9e041 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/tcrm1000.pk" 1644474952 11548 0b0d56ec4dada4d64b236d26d8259ea3 "" - "C:/Users/Thor/AppData/Local/MiKTeX/fonts/pk/ljfour/jknappen/ec/dpi600/tctt1000.pk" 1644474944 9492 b32fae978048c63bed8b8ea5b4c01e26 "" - "C:/Users/Thor/AppData/Local/MiKTeX/miktex/data/le/pdftex/pdflatex.fmt" 1641968746 9769493 e69ef452068a007dd8a62918dcf32fd8 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecbx1000.tfm" 993058356 3200 328792ff19833a39406f06fa0555a6dc "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecbx1200.tfm" 993058358 3200 b8d69bc738e5ef3e08cefeef3109ff56 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecbx1440.tfm" 993058360 3196 0b37fa3083e15c57cfa8c4ff52f2807a "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecbx2074.tfm" 993058364 3208 da5ec29ca7c2f5f55c296dd6713d4a74 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecbx2488.tfm" 993058366 3192 b0a07ba84fb3fb36d088c4f796e254b9 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecit1000.tfm" 993058448 1356 26b6ae61ed8e8f2b58dad9f0a3f033b4 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm0800.tfm" 993058518 3152 11ecf5aad6aacf00ff18f394ab23a8b5 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm0900.tfm" 993058520 3156 6d4f5755d77638125f6f89de4f3bb757 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm1000.tfm" 993058522 3148 7e594c8240c71e432203f65ab5f95a51 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm1200.tfm" 993058526 3152 4850ff0163852b7fab34bd55e1197f28 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm1440.tfm" 993058528 3168 3bd7b08ba4330af81521911744311212 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm2074.tfm" 993058530 3184 b2541675eba9fa86d240ec0ecc913558 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecrm2488.tfm" 993058532 3184 93c67f4c0884ba9e31b75d469978f63b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecss1000.tfm" 993058634 3140 7eb06dfefee71119860002af13820d26 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecti0900.tfm" 993058718 2840 ee8ddc1ae849c174661b3a0424c5b864 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ecti1000.tfm" 993058720 2840 5606e1a681c23005308de9d61c09a8ff "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ectt0800.tfm" 993058738 1348 ad6a25e9916b0e5ddfcc7ffcb8d43448 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/ectt1000.tfm" 993058740 1348 d70ddf2d5d512b838e50a335e385e919 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/tcrm1000.tfm" 993058908 1436 c7f957a372ef2fbe93c0982f96625e12 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/jknappen/ec/tctt1000.tfm" 993058964 1284 ebe6f6da538d21a08b8f29b6479c4f22 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1233951848 1004 54797486969f23fa377b128694d548df "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1233951854 916 f87d7c45f9c908e672703b83b72241a3 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msam5.tfm" 1233951854 924 9904cf1d39e9767e7a3622f2a125a565 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1233951854 928 2dc8d444221b7a635bb58038579b861a "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1233951854 908 2921f8a10601f252058503cc6570e581 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msbm5.tfm" 1233951854 940 75ac932a52f80982a9f8ea75d03a34cf "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1233951854 940 228d6584342e91276bf566bcf9716b83 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmmi5.pfb" 1247593067 37912 07513ec114ac737ab54cea0152f4424b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmsy5.pfb" 1247593066 32915 7bf7720c61a5b3a7ff25b0964421c9b6 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/context/base/mkii/supp-pdf.mkii" 1580390158 71627 94eb9990bed73c364d7f53f960cc8c5b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/atbegshi/atbegshi.sty" 1575571100 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/babel/babel.sty" 1640863413 147419 612046eb31f6ee1a29c1e163d25a9bdd "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/babel/txtbabel.def" 1640863413 5233 a89961f969f72563cb59411e9dc4ae8e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/bigintcalc/bigintcalc.sty" 1576433602 40635 c40361e206be584d448876bba8a64a3b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/bitset/bitset.sty" 1575926576 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/etexcmds/etexcmds.sty" 1576433638 7734 b98cbb34c81f667027c1e3ebdbfce34b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/gettitlestring/gettitlestring.sty" 1576433666 8371 9d55b8bd010bc717624922fb3477d92e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/iftex/iftex.sty" 1583523400 6501 4011d89d9621e0b0901138815ba5ff29 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/iftex/ifvtex.sty" 1583523400 1057 525c2192b5febbd8c1f662c9468335bb "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/infwarerr/infwarerr.sty" 1575399508 8356 7bbb2c2373aa810be568c29e333da8ed "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/intcalc/intcalc.sty" 1576433764 31769 002a487f55041f8e805cfbf6385ffd97 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576763304 5412 d5a2436094cd7be85769db90f29250a6 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/kvsetkeys/kvsetkeys.sty" 1576433820 13807 952b0226d4efca026f0e19dd266dcc22 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/ltxcmds/ltxcmds.sty" 1601732009 18568 4409f8f50cd365c68e684407e5350b1b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/pdfescape/pdfescape.sty" 1575926700 19007 15924f7228aca6c6d184b115f4baa231 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/pdftexcmds/pdftexcmds.sty" 1623001677 20089 80423eac55aa175305d35b49e04fe23b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/uniquecounter/uniquecounter.sty" 1576434012 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/xkeyval/xkeyval.tex" 1623002090 19231 3cbf682090baecad8e17a66b7a271ed1 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/generic/xkeyval/xkvutils.tex" 1623002090 7677 cf3e6aa6a8d444f55327f61df80bfa0c "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/00miktex/epstopdf-sys.cfg" 1616067285 584 2a1075dd71571459f59146da9f7502ad "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amscls/amsthm.sty" 1591020009 12594 0d51ac3a545aaaa555021326ff22a6cc "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsfonts/amsfonts.sty" 1358197772 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsfonts/amssymb.sty" 1358197772 13829 94730e64147574077f8ecfea9bb69af4 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsfonts/umsa.fd" 1358197772 961 6518c6525a34feb5e8250ffa91731cff "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsfonts/umsb.fd" 1358197772 961 d02606146ba5601b5645f987c92e6193 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsmath/amsbsy.sty" 1636824341 2222 da905dc1db75412efd2d8f67739f0596 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsmath/amsgen.sty" 1636824342 4173 bc0410bcccdff806d6132d3c1ef35481 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsmath/amsmath.sty" 1636824342 87648 07fbb6e9169e00cb2a2f40b31b2dbf3c "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsmath/amsopn.sty" 1636824343 4128 8eea906621b6639f7ba476a472036bbe "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/amsmath/amstext.sty" 1636824343 2444 926f379cc60fcf0c6e3fee2223b4370d "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/arabi/bblopts.cfg" 1139961600 902 c30e5c373bc58bde21f8f63a3091626f "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/atveryend/atveryend.sty" 1576101110 19336 ce7ae9438967282886b3b036cfad1e4d "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/auxhook/auxhook.sty" 1576538732 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/babel-english/english.ldf" 1622998066 7008 9ff5fdcc865b01beca2b0fe4a46231d4 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/alltt.sty" 1638775084 3137 2366459cfce784001c7405ed16a872fb "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/atbegshi-ltx.sty" 1638775084 3034 3bfb87122e6fa8758225c0dd3cbaceba "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/atveryend-ltx.sty" 1638775084 2462 754d6b31b2ab5a09bb72c348ace2ec75 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/fontenc.sty" 1638775084 4946 461cc78f6f26901410d9f1d725079cc6 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/ifthen.sty" 1638775084 5157 f308c7c04889e16c588e78aa42599fae "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/inputenc.sty" 1638775084 5049 969aec05d5f39c43f8005910498fcf90 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/makeidx.sty" 1638775082 1939 e44505a18ba4edebb8b70993e32c6350 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/report.cls" 1638775084 23203 8fbc410e29d3fd675970d5f9698c9c11 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/size10.clo" 1638775084 8448 96f18c76bf608a36ee6fbf021ac1dd32 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/t1cmss.fd" 1638775084 2621 95d97d14f2ca40d81472d6fd62553199 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/t1cmtt.fd" 1638775084 2443 6dd9a5deeddddfcceb01d1932590ebad "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/textcomp.sty" 1638775084 2894 55431114fc0e491ecee275edafd6c881 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/base/ts1cmtt.fd" 1638775082 2287 321c9b3e7f8038f483d2c21d3393e4fe "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/capt-of/capt-of.sty" 1264504665 1344 063f8536a047a2d9cb1803321f793f37 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/cmap/cmap.sty" 1612609498 3574 ddc11a0ae1c579d351ed20d2319ad422 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/cmap/ot1.cmap" 1612609498 1207 4e0d96772f0d338847cbfb4eca683c81 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/cmap/t1.cmap" 1612609498 1938 beaa4a8467aa0074076e0e19f2992e29 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/datetime/datetime-defaults.sty" 1429533782 4215 4c80eaed8cd4f9a80cc6244c0adeb81f "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/datetime/datetime.sty" 1429533782 28417 b023ffe1328fa89e7f133201d87029de "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/enumitem/enumitem.sty" 1561036220 51697 f8f08183cd2080d9d18a41432d651dfb "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/epigraph/epigraph.sty" 1578053510 4738 e947be1727d6ac747322008f8359ee17 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1622999586 13886 d1306dcf79a944f6988e688c1785f9ce "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/eso-pic/eso-pic.sty" 1607182970 11772 8d0db0794e6aeb45348f60bbe3a3e093 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/etoolbox/etoolbox.sty" 1601894156 46845 3b58f70c6e861a13d927bff09d35ecbc "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fancyhdr/fancyhdr.sty" 1612001844 17086 7ed8cbc4d361ec87392817e0dd4f65ec "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fancyvrb/fancyvrb.sty" 1640113799 44023 c6f2f55a2bb9630fba10bfd488a5addd "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/float/float.sty" 1469020353 6916 16d2656a1984957e674b149555f1ea1d "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fmtcount/fc-english.def" 1582571040 14870 f66b7dd28616119c2519cd5cc4dcae14 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fmtcount/fcnumparser.sty" 1582571040 12791 43a81443714469abac77ce09f44ad2e2 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fmtcount/fcprefix.sty" 1582571040 12519 5c732241af77b5f0e56e640b7d538395 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fmtcount/fmtcount.sty" 1582571040 32021 ed70d543c537f19c96fc753321f1c3cc "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/fncychap/fncychap.sty" 1291943048 19488 fdd52eb173b3197d748e1ec25acb042f "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/footnotebackref/footnotebackref.sty" 1341124290 2729 a95b43c08b818612edc645e42967b2a2 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/framed/framed.sty" 1338538572 22449 7ec15c16d0d66790f28e90343c5434a3 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/geometry/geometry.cfg" 1578053545 1104 7ac475a4e3466b0b43e138e9356bda83 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/geometry/geometry.sty" 1578053545 42759 9cf6c5257b1bc7af01a58859749dd37a "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics-cfg/color.cfg" 1465890692 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics-cfg/graphics.cfg" 1465890692 1224 978390e9c2234eab29404bc21b268d1e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics-def/pdftex.def" 1637518328 19103 48d29b6e2a64cb717117ef65f107b404 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics/color.sty" 1639593010 7197 eb6c1ebf41667a05cb50c23c19d5e8bc "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics/graphics.sty" 1639593010 18399 7e40f80366dffb22c0e7b70517db5cb4 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics/graphicx.sty" 1639593010 7996 a8fb260d598dcaf305a7ae7b9c3e3229 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics/keyval.sty" 1639593011 2671 4de6781a30211fe0ea4c672e4a2a8166 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/graphics/trig.sty" 1639593011 4009 187ea2dc3194cd5a76cd99a8d7a6c4d0 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hycolor/hycolor.sty" 1580380792 18571 4c28a13fc3d975e6e81c9bea1d697276 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/hpdftex.def" 1623054242 49890 0bb76a5b745d92e86aed6f3f93e334f0 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/hyperref-langpatches.def" 1623054242 1777 940b1aa83773bc035eb882e8d6842769 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/hyperref.sty" 1623054242 230915 97a8817f13de4e61bbc3592cb2caa995 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/nameref.sty" 1623054242 13242 133e617c5eebffdd05e421624022b267 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/pd1enc.def" 1623054242 14132 c9404e8e78123ef0d1007c34d1d6da51 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/hyperref/puenc.def" 1623054242 117004 86586f287ddfad919a0a4bd68934277a "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/kvoptions/kvoptions.sty" 1602224496 22521 d2fceb764a442a2001d257ef11db7618 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/l3backend/l3backend-pdftex.def" 1639465870 29971 0fb19a39718d289d512ef2f074f16cc2 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/l3kernel/expl3.sty" 1637595832 6208 8e07b49f15e79668e492fab98378014d "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/l3packages/l3keys2e/l3keys2e.sty" 1636720796 4674 175cd58a3276550cf236fd19e68aba45 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/letltxmacro/letltxmacro.sty" 1575399536 5766 13a9e8766c47f30327caf893ece86ac8 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/lipsum/lipsum.ltd.tex" 1633250122 95525 6fd0552101a6b1f9b7a84b402ec435ba "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/lipsum/lipsum.sty" 1633250122 14690 c2c754218a7108db7823a4839c1bc3cd "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/mmap/oml.cmap" 1215048213 1866 c1c12138091b4a8edd4a24a940e6f792 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/mmap/oms.cmap" 1215048213 2370 3b1f71b14b974f07cef532db09ae9ee0 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/mmap/omx.cmap" 1215048260 3001 252c8ca42b06a22cb1a11c0e47790c6e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/needspace/needspace.sty" 1364792977 852 0e34dbb72efc69fa07602405ad95585e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/nextpage/nextpage.sty" 1251937171 1745 04b0f50af5d59a9cf3c17f3f4452ed12 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/oberdiek/hypcap.sty" 1637060716 3822 b53c749cd81352b4679a35b0dafefb95 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/parskip/parskip-2001-04-09.sty" 1615716820 2757 ea00cb4f4e9abc702916f74d3812ef67 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/parskip/parskip.sty" 1615976160 4288 94714aa7f535440f33181fec52a31963 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/refcount/refcount.sty" 1576433952 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1575571282 9715 b051d5b493d9fe5f4bc251462d039e5f "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/setspace/setspace.sty" 1324294077 22913 a27d7908fc6f0385466454a966a316eb "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/tabulary/tabulary.sty" 1403515508 14242 8c83287d79183c3bf58fd70871e8a70b "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/titlesec/titlesec.sty" 1625494067 48833 3b7b4cfab1a3d15596bfd3772a77ab65 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/tocbibind/tocbibind.sty" 1286954396 8927 46f54e33fc9cef24f78ab3bc811cb63f "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/tools/array.sty" 1636710260 12694 6c23725d50ab9d1e2d3ce482c58ffcf3 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/tools/longtable.sty" 1636710260 12892 3ffe092fc7f5d1cb9866f1bcb071d0d6 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/tools/multicol.sty" 1636710260 32262 2bb622a0aa56c4a7a5cbdfe9d122c15a "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/transparent/transparent.sty" 1575059884 4155 541de118e0abc42fce3317addc90afb0 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/upquote/upquote.sty" 1335531156 1088 517e01cde97c1c0baf72e69d43aa5a2e "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/url/url.sty" 1388490452 12796 8edb7d69a20b857904dd0ea757c14ec9 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/varwidth/varwidth.sty" 1238465940 10894 d359a13923460b2a73d4312d613554c8 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/wrapfig/wrapfig.sty" 1044403200 26220 3701aebf80ccdef248c0c20dd062fea9 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/xcolor/xcolor.sty" 1636284872 56029 3f7889dab51d620aa43177c391b7b190 "" - "C:/Users/Thor/AppData/Local/Programs/MiKTeX/tex/latex/xkeyval/xkeyval.sty" 1623002090 4902 efb3d66683a2da2a232f71e3a571a899 "" - "MVC_pattern.png" 1644997428 7876 646a6038633703275a2727875edba16a "" - "P04_Aufgabenstellung.png" 1644917366 7263 f32bb04e523e9546f9777cbc5463d130 "" - "TicTacToe.png" 1644997430 53954 f7d3405a232123a1f8de81ab1faa4a4e "" - "Wochentagsberechnung.jpg" 1644919224 15553 3526ef927a880fdd8c095aca9e544b6f "" - "a.png" 1644998095 829 93c48111959d27f1bcf856368e58cd64 "" - "b.png" 1644998096 1905 d9e5fe1fe0597e8f695a2ec364daa617 "" - "c.png" 1644998096 4196 6b6acc128946e5abfc76e28dcc73fc67 "" - "coffee_customer.png" 1644999828 5049 852e8343298a5c53ff3083a875ecfbe8 "" - "d.png" 1644998097 3353 87a7ad2316a416303812466ce26b70f9 "" - "ein_mann_orchester.png" 1644999665 217305 a89e417b00d1e7adc5e17158cd8d8b3e "" - "en-zhaw-ines-rgb.png" 1641300576 57463 4d3e5434fd873ef81796cea85238b56c "" - "kalender-108_v-ARDFotogalerie.jpg" 1644918852 69510 cc3b70126d66f5bcbb1045c6918a4543 "" - "linked_list.png" 1644998098 2921 a44bc849a6f2f25f9fd11f0303aab513 "" - "main.aux" 1645084636 34148 2f58faf03b2558dddc3c8b5f56cb14ee "pdflatex" - "main.ind" 1645024878 0 d41d8cd98f00b204e9800998ecf8427e "makeindex main.idx" - "main.out" 1645084636 23968 6ef42dbae541b613d10db90e85f6476e "pdflatex" - "main.tex" 1645084633 153762 c3d44457c25b91e885993afef0ebbf1d "" - "main.toc" 1645084636 11305 19480f5dbeb28029e3680675fa29a9a5 "pdflatex" - "random_number.png" 1644918675 7457 9ce36e5f5d9ac102987863cba398bdb6 "" - "sequence_graph.png" 1644999830 3045 d7f77b908aed90608f903e5b41624b5a "" - "sphinx.sty" 1644224256 13262 0226aaccc1147ed884a3946fce78a6d2 "" - "sphinxhighlight.sty" 1645084632 6777 8ee39fca897f152770a05a0325c8e603 "" - "sphinxlatexadmonitions.sty" 1644224256 6238 2d867d769abf3f72abc17ef52adff78b "" - "sphinxlatexcontainers.sty" 1644224256 901 d3a3a1b7b2547f47ade2499350b5c420 "" - "sphinxlatexgraphics.sty" 1644224256 4840 a9578332b6f3b35e198751fb632c9b79 "" - "sphinxlatexindbibtoc.sty" 1644224256 2066 b93f8504d02f6337fde3074b179de55e "" - "sphinxlatexlists.sty" 1644224256 3540 28bde24363589dd8238e1c3089e5b1b5 "" - "sphinxlatexliterals.sty" 1644224256 35719 daaa4295be807130a5df36ead18b83fa "" - "sphinxlatexnumfig.sty" 1644224256 4532 3633caf84afa1a98e1a060b7868202bb "" - "sphinxlatexobjects.sty" 1644224256 7539 5bd439fe3b377102e234413cf4aac14a "" - "sphinxlatexshadowbox.sty" 1644224256 3885 01355157c5580b34ec18031ea7a5e0e0 "" - "sphinxlatexstyleheadings.sty" 1644224256 3253 144b82f37e9d225d888cce45c19b8ed4 "" - "sphinxlatexstylepage.sty" 1644224256 3064 abce6c3018a84afee0afb08a431944ea "" - "sphinxlatexstyletext.sty" 1644224256 6177 c18841ce3fafc366cd3b145f8faa4c37 "" - "sphinxlatextables.sty" 1644224256 21848 2827eb0b11b99b185a8b77317d3e131c "" - "sphinxmessages.sty" 1645084633 765 3f5fcd6cdd7964ed608767954a8ced6f "" - "sphinxoptionsgeometry.sty" 1644224256 2061 47bb34b8ed8a78823eb0c886abfb9f4d "" - "sphinxoptionshyperref.sty" 1644224256 1094 79beb8b8a3f10784f8cce804e0f9d3aa "" - "sphinxpackagefootnote.sty" 1644224256 13248 e2c77871396275ccf592403f8130f6f2 "" - "synchronisationsprobleme.png" 1644999832 259198 c789607c889a43f0353fee8b2d3dc4dd "" - (generated) - "main.aux" - "main.idx" - "main.log" - "main.out" - "main.pdf" - "main.toc" diff --git a/main.fls b/main.fls deleted file mode 100644 index f85cbea..0000000 --- a/main.fls +++ /dev/null @@ -1,1503 +0,0 @@ -PWD D:\Produktives\git_repos\snp\build\latex -INPUT C:\Users\Thor\AppData\Local\MiKTeX\miktex\data\le\pdftex\pdflatex.fmt -INPUT main.tex -OUTPUT main.log -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\report.cls -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\size10.clo -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\size10.clo -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\size10.clo -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\size10.clo -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\cmap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\fontenc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\t1.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\t1.cmap -OUTPUT main.pdf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\t1.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsbsy.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsopn.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\babel.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\babel\txtbabel.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\arabi\bblopts.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\arabi\bblopts.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\arabi\bblopts.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\arabi\bblopts.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\babel-english\english.ldf -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fncychap\fncychap.sty -INPUT .\sphinx.sty -INPUT .\sphinx.sty -INPUT sphinx.sty -INPUT .\sphinx.sty -INPUT .\sphinx.sty -INPUT .\sphinx.sty -INPUT .\sphinx.sty -INPUT .\sphinx.sty -INPUT sphinx.sty -INPUT .\sphinx.sty -INPUT sphinx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\color.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\color.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\color.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\color.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-def\pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-def\pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-def\pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-def\pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT .\sphinxoptionshyperref.sty -INPUT sphinxoptionshyperref.sty -INPUT .\sphinxoptionshyperref.sty -INPUT sphinxoptionshyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT .\sphinxoptionsgeometry.sty -INPUT sphinxoptionsgeometry.sty -INPUT .\sphinxoptionsgeometry.sty -INPUT sphinxoptionsgeometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\float\float.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\wrapfig\wrapfig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\capt-of\capt-of.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\multicol.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\trig.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\graphics.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\graphics.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\graphics.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics-cfg\graphics.cfg -INPUT .\sphinxlatexgraphics.sty -INPUT sphinxlatexgraphics.sty -INPUT .\sphinxlatexgraphics.sty -INPUT sphinxlatexgraphics.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amstext.sty -INPUT .\sphinxlatexadmonitions.sty -INPUT sphinxlatexadmonitions.sty -INPUT .\sphinxlatexadmonitions.sty -INPUT sphinxlatexadmonitions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT .\sphinxlatexliterals.sty -INPUT sphinxlatexliterals.sty -INPUT .\sphinxlatexliterals.sty -INPUT sphinxlatexliterals.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyvrb\fancyvrb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\alltt.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\upquote\upquote.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\textcomp.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\needspace\needspace.sty -INPUT .\sphinxlatexshadowbox.sty -INPUT sphinxlatexshadowbox.sty -INPUT .\sphinxlatexshadowbox.sty -INPUT sphinxlatexshadowbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\framed\framed.sty -INPUT .\sphinxlatexcontainers.sty -INPUT sphinxlatexcontainers.sty -INPUT .\sphinxlatexcontainers.sty -INPUT sphinxlatexcontainers.sty -INPUT .\sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT sphinxhighlight.sty -INPUT .\sphinxhighlight.sty -INPUT sphinxhighlight.sty -INPUT .\sphinxlatextables.sty -INPUT sphinxlatextables.sty -INPUT .\sphinxlatextables.sty -INPUT sphinxlatextables.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tabulary\tabulary.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\array.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tools\longtable.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\varwidth\varwidth.sty -INPUT .\sphinxlatexnumfig.sty -INPUT sphinxlatexnumfig.sty -INPUT .\sphinxlatexnumfig.sty -INPUT sphinxlatexnumfig.sty -INPUT .\sphinxlatexlists.sty -INPUT sphinxlatexlists.sty -INPUT .\sphinxlatexlists.sty -INPUT sphinxlatexlists.sty -INPUT .\sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT sphinxpackagefootnote.sty -INPUT .\sphinxpackagefootnote.sty -INPUT sphinxpackagefootnote.sty -INPUT .\sphinxlatexindbibtoc.sty -INPUT sphinxlatexindbibtoc.sty -INPUT .\sphinxlatexindbibtoc.sty -INPUT sphinxlatexindbibtoc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\makeidx.sty -INPUT .\sphinxlatexstylepage.sty -INPUT sphinxlatexstylepage.sty -INPUT .\sphinxlatexstylepage.sty -INPUT sphinxlatexstylepage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip-2001-04-09.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip-2001-04-09.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\parskip\parskip-2001-04-09.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT .\sphinxlatexstyleheadings.sty -INPUT sphinxlatexstyleheadings.sty -INPUT .\sphinxlatexstyleheadings.sty -INPUT sphinxlatexstyleheadings.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\titlesec\titlesec.sty -INPUT .\sphinxlatexstyletext.sty -INPUT sphinxlatexstyletext.sty -INPUT .\sphinxlatexstyletext.sty -INPUT sphinxlatexstyletext.sty -INPUT .\sphinxlatexobjects.sty -INPUT sphinxlatexobjects.sty -INPUT .\sphinxlatexobjects.sty -INPUT sphinxlatexobjects.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifvtex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\geometry\geometry.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvsetkeys\kvsetkeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdfescape\pdfescape.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hycolor\hycolor.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\pd1enc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\pd1enc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\pd1enc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\pd1enc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref-langpatches.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref-langpatches.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref-langpatches.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref-langpatches.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\etexcmds\etexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\puenc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\puenc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\puenc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\puenc.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bitset\bitset.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\intcalc\intcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\atbegshi\atbegshi.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atbegshi-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hpdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hpdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hpdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hpdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\atveryend-ltx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\pdftexcmds\pdftexcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\atveryend\atveryend.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\bigintcalc\bigintcalc.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\oberdiek\hypcap.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT .\sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT sphinxmessages.sty -INPUT .\sphinxmessages.sty -INPUT sphinxmessages.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsmath.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amsfonts.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\amssymb.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amscls\amsthm.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\graphicx.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\color.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\transparent\transparent.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\auxhook\auxhook.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\eso-pic\eso-pic.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3packages\l3keys2e\l3keys2e.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3kernel\expl3.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\l3backend\l3backend-pdftex.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.ltd.tex -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\lipsum\lipsum.ltd.tex -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\footnotebackref\footnotebackref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\letltxmacro\letltxmacro.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\setspace\setspace.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\xkeyval\xkeyval.tex -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\xkeyval\xkvutils.tex -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\etoolbox\etoolbox.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcprefix.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fcnumparser.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsmath\amsgen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fc-english.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fc-english.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fc-english.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fc-english.def -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ifthen.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\datetime\datetime-defaults.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fmtcount\fmtcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\fancyhdr\fancyhdr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\tocbibind\tocbibind.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\enumitem\enumitem.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epigraph\epigraph.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\nextpage\nextpage.sty -OUTPUT main.idx -INPUT .\main.aux -INPUT main.aux -INPUT main.aux -OUTPUT main.aux -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\context\base\mkii\supp-pdf.mkii -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\context\base\mkii\supp-pdf.mkii -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\context\base\mkii\supp-pdf.mkii -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\context\base\mkii\supp-pdf.mkii -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epstopdf-base.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\graphics\color.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\nameref.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\refcount\refcount.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\gettitlestring\gettitlestring.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\kvoptions\kvoptions.sty -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\generic\ltxcmds\ltxcmds.sty -INPUT .\main.out -INPUT main.out -INPUT .\main.out -INPUT main.out -INPUT .\main.out -INPUT main.out -INPUT .\main.out -INPUT main.out -INPUT .\main.out -INPUT .\main.out -OUTPUT main.out -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecbx1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecbx2488.tfm -INPUT .\en-zhaw-ines-rgb.png -INPUT .\en-zhaw-ines-rgb.png -INPUT en-zhaw-ines-rgb.png -INPUT .\en-zhaw-ines-rgb.png -INPUT .\en-zhaw-ines-rgb.png -INPUT .\en-zhaw-ines-rgb.png -INPUT .\en-zhaw-ines-rgb.png -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm0900.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecti0900.tfm -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\map\pdftex\pdftex.map -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm2488.tfm -INPUT .\main.toc -INPUT main.toc -INPUT main.toc -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\ot1.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\ot1.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\cmap\ot1.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oml.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oml.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oml.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oms.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oms.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\oms.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\omx.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\omx.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\mmap\omx.cmap -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\cmextra\cmex7.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\cmextra\cmex7.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsa.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsa.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsa.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsa.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam10.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam7.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam5.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsb.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsb.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsb.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\amsfonts\umsb.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm10.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm7.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm5.tfm -OUTPUT main.toc -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm2074.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecbx2074.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm1440.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecbx1440.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\tcrm1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecti1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ectt1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ectt0800.tfm -INPUT .\random_number.png -INPUT .\random_number.png -INPUT random_number.png -INPUT .\random_number.png -INPUT .\random_number.png -INPUT .\random_number.png -INPUT .\random_number.png -INPUT .\random_number.png -INPUT .\random_number.png -INPUT random_number.png -INPUT .\random_number.png -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecit1000.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm0800.tfm -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT kalender-108_v-ARDFotogalerie.jpg -INPUT .\kalender-108_v-ARDFotogalerie.jpg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecrm1200.tfm -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecbx1200.tfm -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT Wochentagsberechnung.jpg -INPUT .\Wochentagsberechnung.jpg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmss.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmss.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmss.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\t1cmss.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\ecss1000.tfm -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT 135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT 135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT .\135oALYhkYyXB2aG0F-qrwA.jpeg -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ts1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ts1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ts1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex\latex\base\ts1cmtt.fd -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\tfm\jknappen\ec\tctt1000.tfm -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT P04_Aufgabenstellung.png -INPUT .\P04_Aufgabenstellung.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\TicTacToe.png -INPUT TicTacToe.png -INPUT .\TicTacToe.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT MVC_pattern.png -INPUT .\MVC_pattern.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT linked_list.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT .\linked_list.png -INPUT linked_list.png -INPUT .\linked_list.png -INPUT .\a.png -INPUT .\a.png -INPUT a.png -INPUT .\a.png -INPUT .\a.png -INPUT .\a.png -INPUT .\a.png -INPUT .\a.png -INPUT .\a.png -INPUT a.png -INPUT .\a.png -INPUT .\b.png -INPUT .\b.png -INPUT b.png -INPUT .\b.png -INPUT .\b.png -INPUT .\b.png -INPUT .\b.png -INPUT .\b.png -INPUT .\b.png -INPUT b.png -INPUT .\b.png -INPUT .\c.png -INPUT .\c.png -INPUT c.png -INPUT .\c.png -INPUT .\c.png -INPUT .\c.png -INPUT .\c.png -INPUT .\c.png -INPUT .\c.png -INPUT c.png -INPUT .\c.png -INPUT .\d.png -INPUT .\d.png -INPUT d.png -INPUT .\d.png -INPUT .\d.png -INPUT .\d.png -INPUT .\d.png -INPUT .\d.png -INPUT .\d.png -INPUT d.png -INPUT .\d.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT ein_mann_orchester.png -INPUT .\ein_mann_orchester.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT synchronisationsprobleme.png -INPUT .\synchronisationsprobleme.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\coffee_customer.png -INPUT coffee_customer.png -INPUT .\coffee_customer.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\sequence_graph.png -INPUT sequence_graph.png -INPUT .\sequence_graph.png -INPUT .\main.ind -INPUT main.ind -INPUT .\main.ind -INPUT main.ind -INPUT main.aux -INPUT .\main.out -INPUT .\main.out -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\tctt1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\tctt1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecss1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecss1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1200.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1200.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm0800.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm0800.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecit1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecit1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ectt1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ectt1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecti1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecti1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\tcrm1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\tcrm1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1440.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1440.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx2074.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx2074.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecti0900.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecti0900.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm0900.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecrm0900.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx1000.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx2488.pk -INPUT C:\Users\Thor\AppData\Local\MiKTeX\fonts\pk\ljfour\jknappen\ec\dpi600\ecbx2488.pk -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\type1\public\amsfonts\cm\cmmi5.pfb -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\type1\public\amsfonts\cm\cmmi5.pfb -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\type1\public\amsfonts\cm\cmsy5.pfb -INPUT C:\Users\Thor\AppData\Local\Programs\MiKTeX\fonts\type1\public\amsfonts\cm\cmsy5.pfb diff --git a/main.idx b/main.idx deleted file mode 100644 index e69de29..0000000 diff --git a/main.ilg b/main.ilg deleted file mode 100644 index c05cb34..0000000 --- a/main.ilg +++ /dev/null @@ -1,5 +0,0 @@ -This is makeindex, version 2.16 [MiKTeX 21.12.10]. -Scanning style file ./python.ist.......done (7 attributes redefined, 0 ignored). -Scanning input file main.idx...done (0 entries accepted, 0 rejected). -Nothing written in main.ind. -Transcript written in main.ilg. diff --git a/main.ind b/main.ind deleted file mode 100644 index e69de29..0000000 diff --git a/main.log b/main.log deleted file mode 100644 index 4824f4b..0000000 --- a/main.log +++ /dev/null @@ -1,1183 +0,0 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.24 (MiKTeX 21.12.10) (preloaded format=pdflatex 2022.1.12) 17 FEB 2022 08:57 -entering extended mode - restricted \write18 enabled. - %&-line parsing enabled. -**./main.tex -(main.tex -LaTeX2e <2021-11-15> patch level 1 -L3 programming layer <2021-11-22> -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\report.cls -Document Class: report 2021/10/04 v1.4n Standard LaTeX document class -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\size10.clo -File: size10.clo 2021/10/04 v1.4n Standard LaTeX file (size option) -) -\c@part=\count183 -\c@chapter=\count184 -\c@section=\count185 -\c@subsection=\count186 -\c@subsubsection=\count187 -\c@paragraph=\count188 -\c@subparagraph=\count189 -\c@figure=\count190 -\c@table=\count191 -\abovecaptionskip=\skip47 -\belowcaptionskip=\skip48 -\bibindent=\dimen138 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\inputenc.sty -Package: inputenc 2021/02/14 v1.3d Input encoding file -\inpenc@prehook=\toks16 -\inpenc@posthook=\toks17 -) - defining Unicode char U+00A0 (decimal 160) - defining Unicode char U+2500 (decimal 9472) - defining Unicode char U+2502 (decimal 9474) - defining Unicode char U+2514 (decimal 9492) - defining Unicode char U+251C (decimal 9500) - defining Unicode char U+2572 (decimal 9586) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/cmap\cmap.sty -Package: cmap 2021/02/06 v1.0j CMap support: searchable PDF -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\fontenc.sty -Package: fontenc 2021/04/29 v2.0v Standard LaTeX package -<>) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\ams -math.sty -Package: amsmath 2021/10/15 v2.17l AMS math features -\@mathmargin=\skip49 -For additional information on amsmath, use the `?' option. -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amstext.sty -Package: amstext 2021/08/26 v2.01 AMS text - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsgen.sty -File: amsgen.sty 1999/11/30 v2.0 generic functions -\@emptytoks=\toks18 -\ex@=\dimen139 -)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsbsy.sty -Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen140 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsmath\amsopn.sty -Package: amsopn 2021/08/26 v2.02 operator names -) -\inf@bad=\count192 -LaTeX Info: Redefining \frac on input line 234. -\uproot@=\count193 -\leftroot@=\count194 -LaTeX Info: Redefining \overline on input line 399. -\classnum@=\count195 -\DOTSCASE@=\count196 -LaTeX Info: Redefining \ldots on input line 496. -LaTeX Info: Redefining \dots on input line 499. -LaTeX Info: Redefining \cdots on input line 620. -\Mathstrutbox@=\box50 -\strutbox@=\box51 -\big@size=\dimen141 -LaTeX Font Info: Redeclaring font encoding OML on input line 743. -LaTeX Font Info: Redeclaring font encoding OMS on input line 744. -\macc@depth=\count197 -\c@MaxMatrixCols=\count198 -\dotsspace@=\muskip16 -\c@parentequation=\count199 -\dspbrk@lvl=\count266 -\tag@help=\toks19 -\row@=\count267 -\column@=\count268 -\maxfields@=\count269 -\andhelp@=\toks20 -\eqnshift@=\dimen142 -\alignsep@=\dimen143 -\tagshift@=\dimen144 -\tagwidth@=\dimen145 -\totwidth@=\dimen146 -\lineht@=\dimen147 -\@envbody=\toks21 -\multlinegap=\skip50 -\multlinetaggap=\skip51 -\mathdisplay@stack=\toks22 -LaTeX Info: Redefining \[ on input line 2938. -LaTeX Info: Redefining \] on input line 2939. -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\amssymb.sty -Package: amssymb 2013/01/14 v3.01 AMS font symbols - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\amsfonts.sty -Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support -\symAMSa=\mathgroup4 -\symAMSb=\mathgroup5 -LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. -LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' -(Font) U/euf/m/n --> U/euf/b/n on input line 106. -)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/babel\babel.sty -Package: babel 2021/12/30 3.69 The Babel package -\babel@savecnt=\count270 -\U@D=\dimen148 -\l@unhyphenated=\language79 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/babel\txtbabel.def) -\bbl@readstream=\read2 -\bbl@dirlevel=\count271 - -************************************* -* Local config file bblopts.cfg used -* -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/arabi\bblopts.cfg -File: bblopts.cfg 2005/09/08 v0.1 add Arabic and Farsi to "declared" options of - babel -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/babel-english\english.ld -f -Language: english 2017/06/06 v3.3r English support from the babel system -Package babel Info: Hyphen rules for 'canadian' set to \l@english -(babel) (\language0). Reported on input line 102. -Package babel Info: Hyphen rules for 'australian' set to \l@ukenglish -(babel) (\language73). Reported on input line 105. -Package babel Info: Hyphen rules for 'newzealand' set to \l@ukenglish -(babel) (\language73). Reported on input line 108. -)) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amscls\amsthm.sty -Package: amsthm 2020/05/29 v2.20.6 -\thm@style=\toks23 -\thm@bodyfont=\toks24 -\thm@headfont=\toks25 -\thm@notefont=\toks26 -\thm@headpunct=\toks27 -\thm@preskip=\skip52 -\thm@postskip=\skip53 -\thm@headsep=\skip54 -\dth@everypar=\toks28 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fncychap\fncychap.sty -Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters) -\RW=\skip55 -\mylen=\skip56 -\myhi=\skip57 -\px=\skip58 -\py=\skip59 -\pyy=\skip60 -\pxx=\skip61 -) -(sphinx.sty -Package: sphinx 2021/01/27 v4.0.0 LaTeX package (Sphinx markup) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/ltxcmds\ltxcmds.sty -Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/xcolor\xcolor.sty -Package: xcolor 2021/10/31 v2.13 LaTeX color extensions (UK) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics-cfg\color.cfg -File: color.cfg 2016/01/02 v1.6 sample color configuration -) -Package xcolor Info: Driver file: pdftex.def on input line 227. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics-def\pdftex.def -File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex -) -Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1352. -Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1356. -Package xcolor Info: Model `RGB' extended on input line 1368. -Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1370. -Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1371. -Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1372. -Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1373. -Package xcolor Info: Model `Gray' substituted by `gray' on input line 1374. -Package xcolor Info: Model `wave' substituted by `hsb' on input line 1375. -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/kvoptions\kvoptions.sty -Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics\keyval.sty -Package: keyval 2014/10/28 v1.15 key=value parser (DPC) -\KV@toks@=\toks29 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/kvsetkeys\kvsetkeys.st -y -Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) -)) -\sphinxverbatimsep=\dimen149 -\sphinxverbatimborder=\dimen150 -\sphinxshadowsep=\dimen151 -\sphinxshadowsize=\dimen152 -\sphinxshadowrule=\dimen153 -\spx@notice@border=\dimen154 - (sphinxoptionshyperref.sty -File: sphinxoptionshyperref.sty 2021/01/27 hyperref -) (sphinxoptionsgeometry.sty -File: sphinxoptionsgeometry.sty 2021/01/27 geometry -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\textcomp.sty -Package: textcomp 2020/02/02 v2.0n Standard LaTeX package -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/float\float.sty -Package: float 2001/11/08 v1.3d Float enhancements (AL) -\c@float@type=\count272 -\float@exts=\toks30 -\float@box=\box52 -\@float@everytoks=\toks31 -\@floatcapt=\box53 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/wrapfig\wrapfig.sty -\wrapoverhang=\dimen155 -\WF@size=\dimen156 -\c@WF@wrappedlines=\count273 -\WF@box=\box54 -\WF@everypar=\toks32 -Package: wrapfig 2003/01/31 v 3.6 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/capt-of\capt-of.sty -Package: capt-of 2009/12/29 v0.2 standard captions outside of floats -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/tools\multicol.sty -Package: multicol 2021/10/28 v1.9b multicolumn formatting (FMi) -\c@tracingmulticols=\count274 -\mult@box=\box55 -\multicol@leftmargin=\dimen157 -\c@unbalance=\count275 -\c@collectmore=\count276 -\doublecol@number=\count277 -\multicoltolerance=\count278 -\multicolpretolerance=\count279 -\full@width=\dimen158 -\page@free=\dimen159 -\premulticols=\dimen160 -\postmulticols=\dimen161 -\multicolsep=\skip62 -\multicolbaselineskip=\skip63 -\partial@page=\box56 -\last@line=\box57 -\maxbalancingoverflow=\dimen162 -\mult@rightbox=\box58 -\mult@grightbox=\box59 -\mult@firstbox=\box60 -\mult@gfirstbox=\box61 -\@tempa=\box62 -\@tempa=\box63 -\@tempa=\box64 -\@tempa=\box65 -\@tempa=\box66 -\@tempa=\box67 -\@tempa=\box68 -\@tempa=\box69 -\@tempa=\box70 -\@tempa=\box71 -\@tempa=\box72 -\@tempa=\box73 -\@tempa=\box74 -\@tempa=\box75 -\@tempa=\box76 -\@tempa=\box77 -\@tempa=\box78 -\@tempa=\box79 -\@tempa=\box80 -\@tempa=\box81 -\@tempa=\box82 -\@tempa=\box83 -\@tempa=\box84 -\@tempa=\box85 -\@tempa=\box86 -\@tempa=\box87 -\@tempa=\box88 -\@tempa=\box89 -\@tempa=\box90 -\@tempa=\box91 -\@tempa=\box92 -\@tempa=\box93 -\@tempa=\box94 -\@tempa=\box95 -\@tempa=\box96 -\@tempa=\box97 -\c@minrows=\count280 -\c@columnbadness=\count281 -\c@finalcolumnbadness=\count282 -\last@try=\dimen163 -\multicolovershoot=\dimen164 -\multicolundershoot=\dimen165 -\mult@nat@firstbox=\box98 -\colbreak@box=\box99 -\mc@col@check@num=\count283 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics\graphicx.sty -Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics\graphics.sty -Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics\trig.sty -Package: trig 2021/08/11 v1.11 sin cos tan (DPC) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/graphics-cfg\graphics.cf -g -File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration -) -Package graphics Info: Driver file: pdftex.def on input line 107. -) -\Gin@req@height=\dimen166 -\Gin@req@width=\dimen167 -) (sphinxlatexgraphics.sty -File: sphinxlatexgraphics.sty 2021/01/27 graphics -\spx@image@maxheight=\dimen168 -\spx@image@box=\box100 -) (sphinxlatexadmonitions.sty -File: sphinxlatexadmonitions.sty 2021/01/27 admonitions - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/framed\framed.sty -Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks -\OuterFrameSep=\skip64 -\fb@frw=\dimen169 -\fb@frh=\dimen170 -\FrameRule=\dimen171 -\FrameSep=\dimen172 -)) -(sphinxlatexliterals.sty -File: sphinxlatexliterals.sty 2021/12/06 code-blocks and parsed literals - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fancyvrb\fancyvrb.sty -Package: fancyvrb 2021/12/21 4.1b verbatim text (tvz,hv) -\FV@CodeLineNo=\count284 -\FV@InFile=\read3 -\FV@TabBox=\box101 -\c@FancyVerbLine=\count285 -\FV@StepNumber=\count286 -\FV@OutFile=\write3 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\alltt.sty -Package: alltt 2021/01/29 v2.0g defines alltt environment -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/upquote\upquote.sty -Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba -tim -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/needspace\needspace.sty -Package: needspace 2010/09/12 v1.3d reserve vertical space -) -\sphinxcontinuationbox=\box102 -\sphinxvisiblespacebox=\box103 -\sphinxVerbatim@TitleBox=\box104 -\sphinxVerbatim@ContentsBox=\box105 -\spx@scratchbox=\box106 -) (sphinxlatexshadowbox.sty -File: sphinxlatexshadowbox.sty 2021/01/27 sphinxShadowBox -) (sphinxlatexcontainers.sty -File: sphinxlatexcontainers.sty 2021/05/03 containers -) (sphinxhighlight.sty -Package: sphinxhighlight 2016/05/29 stylesheet for highlighting with pygments -) -(sphinxlatextables.sty -File: sphinxlatextables.sty 2021/01/27 tables - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/tabulary\tabulary.sty -Package: tabulary 2014/06/11 v0.10 tabulary package (DPC) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/tools\array.sty -Package: array 2021/10/04 v2.5f Tabular extension package (FMi) -\col@sep=\dimen173 -\ar@mcellbox=\box107 -\extrarowheight=\dimen174 -\NC@list=\toks33 -\extratabsurround=\skip65 -\backup@length=\skip66 -\ar@cellbox=\box108 -) -\TY@count=\count287 -\TY@linewidth=\dimen175 -\tymin=\dimen176 -\tymax=\dimen177 -\TY@tablewidth=\dimen178 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/tools\longtable.sty -Package: longtable 2021-09-01 v4.17 Multi-page Table package (DPC) -\LTleft=\skip67 -\LTright=\skip68 -\LTpre=\skip69 -\LTpost=\skip70 -\LTchunksize=\count288 -\LTcapwidth=\dimen179 -\LT@head=\box109 -\LT@firsthead=\box110 -\LT@foot=\box111 -\LT@lastfoot=\box112 -\LT@gbox=\box113 -\LT@cols=\count289 -\LT@rows=\count290 -\c@LT@tables=\count291 -\c@LT@chunks=\count292 -\LT@p@ftn=\toks34 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/varwidth\varwidth.sty -Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages -\@vwid@box=\box114 -\sift@deathcycles=\count293 -\@vwid@loff=\dimen180 -\@vwid@roff=\dimen181 -) -\sphinx@TY@tablewidth=\dimen182 -) -(sphinxlatexnumfig.sty -File: sphinxlatexnumfig.sty 2021/01/27 numbering -) (sphinxlatexlists.sty -File: sphinxlatexlists.sty 2021/01/27 lists -) -\c@sphinxscope=\count294 -\c@sphinxexplicit=\count295 - (sphinxpackagefootnote.sty -Package: sphinxpackagefootnote 2021/02/04 v1.1d footnotehyper adapted to sphinx - (Sphinx team) -\FNH@notes=\box115 -\FNH@toks=\toks35 -\FNH@width=\dimen183 -) -(sphinxlatexindbibtoc.sty -File: sphinxlatexindbibtoc.sty 2021/01/27 index, bib., toc - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\makeidx.sty -Package: makeidx 2021/10/04 v1.0m Standard LaTeX package -)) -(sphinxlatexstylepage.sty -File: sphinxlatexstylepage.sty 2021/01/27 page styling - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/parskip\parskip.sty -Rollback for package 'parskip' requested -> version 'v1'. - This corresponds to the release introduced on 2001-04-09. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/parskip\parskip-2001-04- -09.sty -Package: parskip 2001/04/09 non-zero parskip adjustments -)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fancyhdr\fancyhdr.sty -Package: fancyhdr 2021/01/28 v4.0.1 Extensive control of page headers and foote -rs -\f@nch@headwidth=\skip71 -\f@nch@O@elh=\skip72 -\f@nch@O@erh=\skip73 -\f@nch@O@olh=\skip74 -\f@nch@O@orh=\skip75 -\f@nch@O@elf=\skip76 -\f@nch@O@erf=\skip77 -\f@nch@O@olf=\skip78 -\f@nch@O@orf=\skip79 -)) -(sphinxlatexstyleheadings.sty -File: sphinxlatexstyleheadings.sty 2021/01/27 headings - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/titlesec\titlesec.sty -Package: titlesec 2021/07/05 v2.14 Sectioning titles -\ttl@box=\box116 -\beforetitleunit=\skip80 -\aftertitleunit=\skip81 -\ttl@plus=\dimen184 -\ttl@minus=\dimen185 -\ttl@toksa=\toks36 -\titlewidth=\dimen186 -\titlewidthlast=\dimen187 -\titlewidthfirst=\dimen188 -)) -(sphinxlatexstyletext.sty -File: sphinxlatexstyletext.sty 2021/12/06 text styling -) (sphinxlatexobjects.sty -File: sphinxlatexobjects.sty 2021/12/05 documentation environments -\py@argswidth=\skip82 -\lineblockindentation=\skip83 -\DUlineblockindent=\skip84 -)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/geometry\geometry.sty -Package: geometry 2020/01/02 v5.9 Page Geometry - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/iftex\ifvtex.sty -Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/iftex\iftex.sty -Package: iftex 2020/03/06 v1.0d TeX engine tests -)) -\Gm@cnth=\count296 -\Gm@cntv=\count297 -\c@Gm@tempcnt=\count298 -\Gm@bindingoffset=\dimen189 -\Gm@wd@mp=\dimen190 -\Gm@odd@mp=\dimen191 -\Gm@even@mp=\dimen192 -\Gm@layoutwidth=\dimen193 -\Gm@layoutheight=\dimen194 -\Gm@layouthoffset=\dimen195 -\Gm@layoutvoffset=\dimen196 -\Gm@dimlist=\toks37 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/geometry\geometry.cfg)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\hyperref.sty -Package: hyperref 2021-06-07 v7.00m Hypertext links for LaTeX - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/pdftexcmds\pdftexcmds. -sty -Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO -) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/infwarerr\infwarerr.st -y -Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) -) -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/kvdefinekeys\kvdefinek -eys.sty -Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/pdfescape\pdfescape.st -y -Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hycolor\hycolor.sty -Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/letltxmacro\letltxmacro. -sty -Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/auxhook\auxhook.sty -Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) -) -\@linkdim=\dimen197 -\Hy@linkcounter=\count299 -\Hy@pagecounter=\count300 - (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\pd1enc.def -File: pd1enc.def 2021-06-07 v7.00m Hyperref: PDFDocEncoding definition (HO) -Now handling font encoding PD1 ... -... no UTF-8 mapping file for font encoding PD1 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\hyperref-langpa -tches.def -File: hyperref-langpatches.def 2021-06-07 v7.00m Hyperref: patches for babel la -nguages -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/intcalc\intcalc.sty -Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/etexcmds\etexcmds.sty -Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) -) -\Hy@SavedSpaceFactor=\count301 -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\puenc.def -File: puenc.def 2021-06-07 v7.00m Hyperref: PDF Unicode definition (HO) -Now handling font encoding PU ... -... no UTF-8 mapping file for font encoding PU -) -Package hyperref Info: Option `unicode' set `true' on input line 4073. -Package hyperref Info: Option `colorlinks' set `true' on input line 4073. -Package hyperref Info: Option `breaklinks' set `true' on input line 4073. -Package hyperref Info: Hyper figures OFF on input line 4192. -Package hyperref Info: Link nesting OFF on input line 4197. -Package hyperref Info: Hyper index ON on input line 4200. -Package hyperref Info: Plain pages OFF on input line 4207. -Package hyperref Info: Backreferencing OFF on input line 4212. -Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4445. -\c@Hy@tempcnt=\count302 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/url\url.sty -\Urlmuskip=\muskip17 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -LaTeX Info: Redefining \url on input line 4804. -\XeTeXLinkMargin=\dimen198 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/bitset\bitset.sty -Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/bigintcalc\bigintcalc. -sty -Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO -) -)) -\Fld@menulength=\count303 -\Field@Width=\dimen199 -\Fld@charsize=\dimen256 -Package hyperref Info: Hyper figures OFF on input line 6076. -Package hyperref Info: Link nesting OFF on input line 6081. -Package hyperref Info: Hyper index ON on input line 6084. -Package hyperref Info: backreferencing OFF on input line 6091. -Package hyperref Info: Link coloring ON on input line 6094. -Package hyperref Info: Link coloring with OCG OFF on input line 6101. -Package hyperref Info: PDF/A mode OFF on input line 6106. -LaTeX Info: Redefining \ref on input line 6146. -LaTeX Info: Redefining \pageref on input line 6150. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\atbegshi-ltx.sty -Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi -package with kernel methods -) -\Hy@abspage=\count304 -\c@Item=\count305 -\c@Hfootnote=\count306 -) -Package hyperref Info: Driver (autodetected): hpdftex. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\hpdftex.def -File: hpdftex.def 2021-06-07 v7.00m Hyperref driver for pdfTeX - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\atveryend-ltx.sty -Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac -kage -with kernel methods -) -\Fld@listcount=\count307 -\c@bookmark@seq@number=\count308 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/rerunfilecheck\rerunfile -check.sty -Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/uniquecounter\uniqueco -unter.sty -Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) -) -Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -86. -) -\Hy@SectionHShift=\skip85 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/oberdiek\hypcap.sty -Package: hypcap 2016/05/16 v1.12 Adjusting the anchors of captions (HO) -) -(sphinxmessages.sty -Package: sphinxmessages 2019/01/04 v2.0 Localized LaTeX macros (Sphinx team) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/transparent\transparent. -sty -Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO) - -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/eso-pic\eso-pic.sty -Package: eso-pic 2020/10/14 v3.0a eso-pic (RN) -\ESO@tempdima=\dimen257 -\ESO@tempdimb=\dimen258 -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/lipsum\lipsum.sty -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/l3packages/l3keys2e\l3ke -ys2e.sty -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/l3kernel\expl3.sty -Package: expl3 2021-11-22 L3 programming layer (loader) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/l3backend\l3backend-pdft -ex.def -File: l3backend-pdftex.def 2021-12-14 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count309 -\l__pdf_internal_box=\box117 -)) -Package: l3keys2e 2021-11-12 LaTeX2e option processing using LaTeX3 keys -) -Package: lipsum 2021-09-20 v2.7 150 paragraphs of Lorem Ipsum dummy text -\g__lipsum_par_int=\count310 -\l__lipsum_a_int=\count311 -\l__lipsum_b_int=\count312 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/lipsum\lipsum.ltd.tex)) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/footnotebackref\footnote -backref.sty -Package: footnotebackref 2012/07/01 v1.0 Backreferences for footnotes (Holger L -ange) -\c@BackrefHyperFootnoteCounter=\count313 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/setspace\setspace.sty -Package: setspace 2011/12/19 v6.7a set line spacing -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/datetime\datetime.sty -Package: datetime 2015/03/20 v2.60 Date Time Package - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/etoolbox\etoolbox.sty -Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) -\etb@tempcnta=\count314 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fmtcount\fmtcount.sty -Package: fmtcount 2020/01/30 v3.07 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\ifthen.sty -Package: ifthen 2020/11/24 v1.1c Standard LaTeX ifthen package (DPC) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/xkeyval\xkeyval.sty -Package: xkeyval 2020/11/20 v2.8 package option processing (HA) - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkeyval.tex -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkvutils.tex -\XKV@toks=\toks38 -\XKV@tempa@toks=\toks39 -) -\XKV@depth=\count315 -File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) -)) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fmtcount\fcprefix.sty -Package: fcprefix 2012/09/28 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fmtcount\fcnumparser.sty -Package: fcnumparser 2017/06/15 -\fc@digit@counter=\count316 -)) -\c@padzeroesN=\count317 -\fc@tmpcatcode=\count318 - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/fmtcount\fc-english.def -File: fc-english.def 2016/01/12 -) -\@DT@modctr=\count319 -\@ordinalctr=\count320 -\@orgargctr=\count321 -\@strctr=\count322 -\@tmpstrctr=\count323 -\@DT@loopN=\count324 -\@DT@X=\count325 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/datetime\datetime-defaul -ts.sty -Package: datetime-defaults 2013/09/10 -) -\@day=\count326 -\@month=\count327 -\@year=\count328 -\c@HOUR=\count329 -\c@HOURXII=\count330 -\c@MINUTE=\count331 -\c@TOHOUR=\count332 -\c@TOMINUTE=\count333 -\c@SECOND=\count334 -\currenthour=\count335 -\currentminute=\count336 -\currentsecond=\count337 -Package datetime Info: No datetime.cfg file found, using default settings on in -put line 308. -\@dtctr=\count338 -\dayofyear=\count339 -\dayofweek=\count340 -LaTeX Info: Redefining \today on input line 736. -\dt@a=\toks40 -\dt@b=\toks41 -) - -Package fancyhdr Warning: \fancyfoot's `E' option without twoside option is use -less on input line 100. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/tocbibind\tocbibind.sty -Package: tocbibind 2010/10/13 v1.5k extra ToC listings -Package tocbibind Info: The document has chapter divisions on input line 50. - - -Package tocbibind Note: Using chapter style headings, unless overridden. - -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/enumitem\enumitem.sty -Package: enumitem 2019/06/20 v3.9 Customized lists -\labelindent=\skip86 -\enit@outerparindent=\dimen259 -\enit@toks=\toks42 -\enit@inbox=\box118 -\enit@count@id=\count341 -\enitdp@description=\count342 -) (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/epigraph\epigraph.sty -Package: epigraph 2020/01/02 v1.5e typesetting epigraphs - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/nextpage\nextpage.sty -Package: nextpage 2009/09/03 v1.1a additional page commands -) -\beforeepigraphskip=\skip87 -\afterepigraphskip=\skip88 -\epigraphwidth=\skip89 -\epigraphrule=\skip90 -) -\@indexfile=\write4 -\openout4 = `main.idx'. - - -Writing index file main.idx -(main.aux) -\openout1 = `main.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 127. -LaTeX Font Info: ... okay on input line 127. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/context/base/mkii\supp-pdf.mki -i -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count343 -\scratchdimen=\dimen260 -\scratchbox=\box119 -\nofMPsegments=\count344 -\nofMParguments=\count345 -\everyMPshowfont=\toks43 -\MPscratchCnt=\count346 -\MPscratchDim=\dimen261 -\MPnumerator=\count347 -\makeMPintoPDFobject=\count348 -\everyMPtoPDFconversion=\toks44 -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/epstopdf-pkg\epstopdf-ba -se.sty -Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf -Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 -85. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/00miktex\epstopdf-sys.cf -g -File: epstopdf-sys.cfg 2021/03/18 v2.0 Configuration of epstopdf for MiKTeX -)) -\c@literalblock=\count349 - -*geometry* driver: auto-detecting -*geometry* detected driver: pdftex -*geometry* verbose mode - [ preamble ] result: -* driver: pdftex -* paper: a4paper -* layout: -* layoutoffset:(h,v)=(0.0pt,0.0pt) -* modes: -* h-part:(L,W,R)=(50.58878pt, 496.33032pt, 50.58878pt) -* v-part:(T,H,B)=(72.26999pt, 700.50687pt, 72.26999pt) -* \paperwidth=597.50787pt -* \paperheight=845.04684pt -* \textwidth=496.33032pt -* \textheight=700.50687pt -* \oddsidemargin=-21.68121pt -* \evensidemargin=-21.68121pt -* \topmargin=-37.0pt -* \headheight=12.0pt -* \headsep=25.0pt -* \topskip=10.0pt -* \footskip=30.0pt -* \marginparwidth=36.135pt -* \marginparsep=11.0pt -* \columnsep=10.0pt -* \skip\footins=9.0pt plus 4.0pt minus 2.0pt -* \hoffset=0.0pt -* \voffset=0.0pt -* \mag=1000 -* \@twocolumnfalse -* \@twosidefalse -* \@mparswitchfalse -* \@reversemarginfalse -* (1in=72.27pt=25.4mm, 1cm=28.453pt) - -Package hyperref Info: Link coloring ON on input line 127. -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\nameref.sty -Package: nameref 2021-04-02 v2.47 Cross-referencing by name of section - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/refcount\refcount.sty -Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) -) -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/generic/gettitlestring\gettitl -estring.sty -Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) -) -\c@section@level=\count350 -) -LaTeX Info: Redefining \ref on input line 127. -LaTeX Info: Redefining \pageref on input line 127. -LaTeX Info: Redefining \nameref on input line 127. - (main.out) (main.out) -\@outlinefile=\write5 -\openout5 = `main.out'. - - -File: en-zhaw-ines-rgb.png Graphic file (type png) - -Package pdftex.def Info: en-zhaw-ines-rgb.png used on input line 144. -(pdftex.def) Requested size: 110.41222pt x 60.54605pt. - [1 - -{C:/Users/Thor/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map} <./en-zhaw-ine -s-rgb.png>] (main.toc<><><><> -LaTeX Font Info: Trying to load font information for U+msa on input line 4. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\umsa.fd -File: umsa.fd 2013/01/14 v3.01 AMS symbols A -) -LaTeX Font Info: Trying to load font information for U+msb on input line 4. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\umsb.fd -File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) -[1 - - -] [2]) -\tf@toc=\write6 -\openout6 = `main.toc'. - - [3] -Chapter 1. -[1 - - -] -LaTeX Font Info: Trying to load font information for T1+cmtt on input line 2 -52. - (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\t1cmtt.fd -File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions -) -[2] [3] -Chapter 2. - -File: random_number.png Graphic file (type png) - -Package pdftex.def Info: random_number.png used on input line 359. -(pdftex.def) Requested size: 301.12425pt x 108.40472pt. -LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10> not available -(Font) Font shape `T1/cmtt/m/n' tried instead on input line 401. -[4 - - <./random_number.png>] - -File: kalender-108_v-ARDFotogalerie.jpg Graphic file (type jpg) - -Package pdftex.def Info: kalender-108_v-ARDFotogalerie.jpg used on input line -460. -(pdftex.def) Requested size: 451.68457pt x 254.07358pt. - [5 <./kalender-108_v-ARDFotogalerie.jpg>] [6] -[7] - -File: Wochentagsberechnung.jpg Graphic file (type jpg) - -Package pdftex.def Info: Wochentagsberechnung.jpg used on input line 688. -(pdftex.def) Requested size: 451.68457pt x 43.13824pt. -LaTeX Font Info: Trying to load font information for T1+cmss on input line 8 -03. - (C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\t1cmss.fd -File: t1cmss.fd 2019/12/16 v2.5j Standard LaTeX font definitions -) -Overfull \hbox (5.5607pt too wide) in paragraph at lines 803--803 -[]\T1/cmss/m/n/10 Gewicht| - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 803--803 -[]\T1/cmr/m/n/10 istSchalt- - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 803--803 -[]\T1/cmr/m/n/10 Tage- - [] - -[8 <./Wochentagsberechnung.jpg>] [9] -Chapter 3. -<135oALYhkYyXB2aG0F-qrwA.jpeg, id=678, 470.50781pt x 218.31563pt> -File: 135oALYhkYyXB2aG0F-qrwA.jpeg Graphic file (type jpg) - -Package pdftex.def Info: 135oALYhkYyXB2aG0F-qrwA.jpeg used on input line 866. -(pdftex.def) Requested size: 470.50665pt x 218.31508pt. -[10 - - <./135oALYhkYyXB2aG0F-qrwA.jpeg>] [11] -LaTeX Font Info: Trying to load font information for TS1+cmtt on input line -998. - -(C:\Users\Thor\AppData\Local\Programs\MiKTeX\tex/latex/base\ts1cmtt.fd -File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions -) -[12] [13] -Chapter 4. - -File: P04_Aufgabenstellung.png Graphic file (type png) - -Package pdftex.def Info: P04_Aufgabenstellung.png used on input line 1143. -(pdftex.def) Requested size: 269.50621pt x 301.87706pt. -[14 - -] [15 <./P04_Aufgabenstellung.png>] [16] [17] -Chapter 5. -[18 - -] - -File: TicTacToe.png Graphic file (type png) - -Package pdftex.def Info: TicTacToe.png used on input line 1495. -(pdftex.def) Requested size: 458.46169pt x 287.57367pt. - -File: MVC_pattern.png Graphic file (type png) - -Package pdftex.def Info: MVC_pattern.png used on input line 1504. -(pdftex.def) Requested size: 323.70859pt x 188.20265pt. - [19 <./TicTacToe.png>] [20 <./MVC_pattern.png>] [21] [22] -Overfull \hbox (5.92274pt too wide) in paragraph at lines 1857--1857 -[]\T1/cmss/m/n/10 Punkte| - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 1857--1857 -[]\T1/cmr/m/n/10 Sortieren von - [] - -[23] -Chapter 6. - -File: linked_list.png Graphic file (type png) - -Package pdftex.def Info: linked_list.png used on input line 1876. -(pdftex.def) Requested size: 225.84319pt x 150.56212pt. -[24 - - <./linked_list.png>] - -File: a.png Graphic file (type png) - -Package pdftex.def Info: a.png used on input line 2003. -(pdftex.def) Requested size: 158.09023pt x 120.44969pt. - -File: b.png Graphic file (type png) - -Package pdftex.def Info: b.png used on input line 2006. -(pdftex.def) Requested size: 158.09023pt x 165.61833pt. - [25 <./a.png>] - -File: c.png Graphic file (type png) - -Package pdftex.def Info: c.png used on input line 2009. -(pdftex.def) Requested size: 286.06805pt x 203.25887pt. - -File: d.png Graphic file (type png) - -Package pdftex.def Info: d.png used on input line 2012. -(pdftex.def) Requested size: 286.06805pt x 158.09023pt. - [26 <./b.png> <./c.png> <./d.png>] -[27] [28] -Underfull \hbox (badness 10000) in paragraph at lines 2409--2409 -[]\T1/cmss/m/n/10 Auf- - [] - - -Overfull \hbox (3.26347pt too wide) in paragraph at lines 2409--2409 -[]\T1/cmss/m/n/10 Punkte| - [] - -[29] [30] -Chapter 7. - -File: ein_mann_orchester.png Graphic file (type png) - -Package pdftex.def Info: ein_mann_orchester.png used on input line 2428. -(pdftex.def) Requested size: 213.04541pt x 387.69748pt. -[31 - - <./ein_mann_orchester.png>] -Overfull \hbox (40.40582pt too wide) in paragraph at lines 2558--2558 -[]\T1/cmtt/m/n/10 cat\T1/cmr/m/n/10 /\T1/cmtt/m/n/10 proc\T1/cmr/m/n/10 /\T1/cm -tt/m/n/10 cpuinfo| - [] - - -Underfull \hbox (badness 8151) in paragraph at lines 2558--2558 -[]\T1/cmr/m/n/10 hn-lich zu \T1/cmtt/m/n/10 lscpu\T1/cmr/m/n/10 , aber mit Zus -atz-in-for-ma-tio-nen wie en-thal-tene CPU Bugs (z.B. - [] - - -Underfull \hbox (badness 10000) in paragraph at lines 2558--2558 -\T1/cmtt/m/n/10 bugs: cpu_meltdown spectre_v1 spect[]re_v2 spec_store_bypass l1 -tf mds swapgs - [] - -[32] [33] [34] [35] [36] [37] [38] [39] [40] -Chapter 8. - -File: synchronisationsprobleme.png Graphic file (type png) - -Package pdftex.def Info: synchronisationsprobleme.png used on input line 3459. - -(pdftex.def) Requested size: 300.37144pt x 371.13565pt. -[41 - - <./synchronisationsprobleme.png>] [42] - -File: coffee_customer.png Graphic file (type png) - -Package pdftex.def Info: coffee_customer.png used on input line 3578. -(pdftex.def) Requested size: 398.98965pt x 180.67455pt. - -File: sequence_graph.png Graphic file (type png) - -Package pdftex.def Info: sequence_graph.png used on input line 3587. -(pdftex.def) Requested size: 391.46153pt x 112.92159pt. - [43 <./coffee_customer.png> <./sequence_graph.png>] [44] [45] [46] -Underfull \hbox (badness 10000) in paragraph at lines 3899--3899 -[]\T1/cmss/m/n/10 Auf- - [] - - -Overfull \hbox (9.33539pt too wide) in paragraph at lines 3899--3899 -[]\T1/cmss/m/n/10 Gewicht| - [] - -[47] -Chapter 9. - -Underfull \hbox (badness 10000) in paragraph at lines 3988--3988 -[]\T1/cmss/m/n/10 Auf- - [] - - -Overfull \hbox (3.26347pt too wide) in paragraph at lines 3988--3988 -[]\T1/cmss/m/n/10 Punkte| - [] - -[48 - -] -Chapter 10. - -Underfull \hbox (badness 10000) in paragraph at lines 4069--4069 -[]\T1/cmss/m/n/10 Auf- - [] - - -Overfull \hbox (3.26347pt too wide) in paragraph at lines 4069--4069 -[]\T1/cmss/m/n/10 Punkte| - [] - -(main.ind) [49 - -] (main.aux) -Package rerunfilecheck Info: File `main.out' has not changed. -(rerunfilecheck) Checksum: 6EF42DBAE541B613D10DB90E85F6476E;23968. - ) -Here is how much of TeX's memory you used: - 17547 strings out of 478659 - 295337 string characters out of 2846394 - 762842 words of memory out of 3000000 - 34950 multiletter control sequences out of 15000+600000 - 418082 words of font info for 55 fonts, out of 8000000 for 9000 - 1142 hyphenation exceptions out of 8191 - 70i,12n,77p,1029b,656s stack positions out of 5000i,500n,10000p,200000b,80000s - -Output written on main.pdf (53 pages, 1406674 bytes). -PDF statistics: - 1726 PDF objects out of 1728 (max. 8388607) - 245 named destinations out of 1000 (max. 500000) - 1074 words of extra memory for PDF output out of 10000 (max. 10000000) - diff --git a/main.out b/main.out deleted file mode 100644 index 7da291d..0000000 --- a/main.out +++ /dev/null @@ -1,121 +0,0 @@ -\BOOKMARK [0][-]{chapter*.1}{\376\377\000T\000a\000b\000l\000e\000\040\000o\000f\000\040\000c\000o\000n\000t\000e\000n\000t\000s}{}% 1 -\BOOKMARK [0][-]{chapter.1}{\376\377\0000\0001\000\040\000-\000\040\000E\000r\000s\000t\000e\000\040\000S\000c\000h\000r\000i\000t\000t\000e\000\040\000m\000i\000t\000\040\000C}{}% 2 -\BOOKMARK [1][-]{section.1.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.1}% 3 -\BOOKMARK [1][-]{section.1.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.1}% 4 -\BOOKMARK [1][-]{section.1.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:\000\040\000v\000i\000r\000t\000u\000e\000l\000l\000e\000\040\000M\000a\000s\000c\000h\000i\000n\000e}{chapter.1}% 5 -\BOOKMARK [1][-]{section.1.4}{\376\377\0004\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000:\000\040\000H\000e\000l\000l\000o\000\040\000W\000o\000r\000l\000d}{chapter.1}% 6 -\BOOKMARK [1][-]{section.1.5}{\376\377\0005\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0003\000:\000\040\000T\000a\000b\000e\000l\000l\000e\000n\000a\000u\000s\000g\000a\000b\000e}{chapter.1}% 7 -\BOOKMARK [1][-]{section.1.6}{\376\377\0006\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0004\000:\000\040\000Z\000e\000i\000c\000h\000e\000n\000\040\000u\000n\000d\000\040\000W\000\366\000r\000t\000e\000r\000\040\000z\000\344\000h\000l\000e\000n}{chapter.1}% 8 -\BOOKMARK [1][-]{section.1.7}{\376\377\0007\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.1}% 9 -\BOOKMARK [0][-]{chapter.2}{\376\377\0000\0002\000:\000\040\000F\000u\000n\000k\000t\000i\000o\000n\000e\000n\000,\000\040\000D\000a\000t\000e\000n\000t\000y\000p\000\040\040\034\000e\000n\000u\000m\040\035}{}% 10 -\BOOKMARK [1][-]{section.2.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.2}% 11 -\BOOKMARK [1][-]{section.2.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.2}% 12 -\BOOKMARK [1][-]{section.2.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000n}{chapter.2}% 13 -\BOOKMARK [2][-]{subsection.2.3.1}{\376\377\0003\000.\0001\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000\040\000T\000a\000g\000e\000\040\000p\000r\000o\000\040\000M\000o\000n\000a\000t}{section.2.3}% 14 -\BOOKMARK [2][-]{subsection.2.3.2}{\376\377\0003\000.\0002\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000\040\000B\000e\000s\000t\000i\000m\000m\000e\000n\000\040\000d\000e\000s\000\040\000W\000o\000c\000h\000e\000n\000t\000a\000g\000s}{section.2.3}% 15 -\BOOKMARK [3][-]{subsubsection.2.3.2.1}{\376\377\0003\000.\0002\000.\0001\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000e\000\040\000P\000a\000r\000s\000e\000n\000\040\000u\000n\000d\000\040\000a\000u\000f\000\040\000K\000o\000r\000r\000e\000k\000t\000h\000e\000i\000t\000\040\000p\000r\000\374\000f\000e\000n}{subsection.2.3.2}% 16 -\BOOKMARK [4][-]{paragraph*.3}{\376\377\0003\000.\0002\000.\0001\000.\0001\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000\040\000F\000o\000r\000m\000a\000t}{subsubsection.2.3.2.1}% 17 -\BOOKMARK [4][-]{paragraph*.4}{\376\377\0003\000.\0002\000.\0001\000.\0002\000\040\000K\000o\000r\000r\000e\000k\000t\000e\000s\000\040\000D\000a\000t\000u\000m}{subsubsection.2.3.2.1}% 18 -\BOOKMARK [4][-]{paragraph*.5}{\376\377\0003\000.\0002\000.\0001\000.\0003\000\040\000V\000o\000r\000g\000a\000b\000e\000n\000\040\000a\000n\000\040\000d\000i\000e\000\040\000U\000m\000s\000e\000t\000z\000u\000n\000g}{subsubsection.2.3.2.1}% 19 -\BOOKMARK [4][-]{paragraph*.6}{\376\377\0003\000.\0002\000.\0001\000.\0004\000\040\000H\000i\000n\000w\000e\000i\000s\000e}{subsubsection.2.3.2.1}% 20 -\BOOKMARK [3][-]{subsubsection.2.3.2.2}{\376\377\0003\000.\0002\000.\0002\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000W\000o\000c\000h\000e\000n\000t\000a\000g\000\040\000B\000e\000r\000e\000c\000h\000n\000u\000n\000g}{subsection.2.3.2}% 21 -\BOOKMARK [1][-]{section.2.4}{\376\377\0004\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.2}% 22 -\BOOKMARK [1][-]{section.2.5}{\376\377\0005\000.\000\040\000A\000n\000h\000a\000n\000g}{chapter.2}% 23 -\BOOKMARK [2][-]{subsection.2.5.1}{\376\377\0005\000.\0001\000\040\000S\000p\000r\000a\000c\000h\000\040\000E\000l\000e\000m\000e\000n\000t}{section.2.5}% 24 -\BOOKMARK [2][-]{subsection.2.5.2}{\376\377\0005\000.\0002\000\040\000B\000e\000s\000c\000h\000r\000e\000i\000b\000u\000n\000g}{section.2.5}% 25 -\BOOKMARK [0][-]{chapter.3}{\376\377\0000\0003\000\040\000-\000\040\000B\000i\000t\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000e\000n\000,\000\040\000S\000t\000r\000u\000c\000t\000,\000\040\000T\000y\000p\000e\000d\000e\000f}{}% 26 -\BOOKMARK [1][-]{section.3.1}{\376\377\0001\000.\000\040\000B\000i\000t\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000e\000n}{chapter.3}% 27 -\BOOKMARK [2][-]{subsection.3.1.1}{\376\377\0001\000.\0001\000\040\000\334\000b\000u\000n\000g\000e\000n}{section.3.1}% 28 -\BOOKMARK [3][-]{subsubsection.3.1.1.1}{\376\377\0001\000.\000\040\000B\000a\000s\000i\000s\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000e\000n}{subsection.3.1.1}% 29 -\BOOKMARK [3][-]{subsubsection.3.1.1.2}{\376\377\0002\000.\000\040\000V\000a\000r\000i\000a\000b\000l\000e\000n\000\040\000t\000a\000u\000s\000c\000h\000e\000n\000\040\000\050\000o\000h\000n\000e\000\040\000D\000r\000i\000t\000t\000-\000V\000a\000r\000i\000a\000b\000l\000e\000\051}{subsection.3.1.1}% 30 -\BOOKMARK [3][-]{subsubsection.3.1.1.3}{\376\377\0003\000.\000\040\000L\000o\000w\000e\000r\000-\000\040\000/\000\040\000U\000p\000p\000e\000r\000c\000a\000s\000e}{subsection.3.1.1}% 31 -\BOOKMARK [3][-]{subsubsection.3.1.1.4}{\376\377\0004\000.\000\040\000P\000r\000\374\000f\000e\000n\000\040\000a\000u\000f\000\040\0002\000-\000e\000r\000\040\000P\000o\000t\000e\000n\000z}{subsection.3.1.1}% 32 -\BOOKMARK [1][-]{section.3.2}{\376\377\0002\000.\000\040\000S\000t\000r\000u\000c\000t\000\040\000\046\000\040\000t\000y\000p\000e\000d\000e\000f}{chapter.3}% 33 -\BOOKMARK [2][-]{subsection.3.2.1}{\376\377\0002\000.\0001\000\040\000\334\000b\000u\000n\000g\000e\000n}{section.3.2}% 34 -\BOOKMARK [3][-]{subsubsection.3.2.1.1}{\376\377\0001\000.\000\040\000B\000i\000t\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000e\000n\000\040\000R\000e\000c\000h\000n\000e\000r}{subsection.3.2.1}% 35 -\BOOKMARK [0][-]{chapter.4}{\376\377\0000\0004\000\040\000-\000\040\000M\000o\000d\000u\000l\000a\000r\000i\000s\000i\000e\000r\000e\000n\000\040\000v\000o\000n\000\040\000C\000\040\000C\000o\000d\000e}{}% 36 -\BOOKMARK [1][-]{section.4.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.4}% 37 -\BOOKMARK [1][-]{section.4.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.4}% 38 -\BOOKMARK [1][-]{section.4.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:\000\040\000M\000o\000d\000u\000l\000a\000r\000i\000s\000i\000e\000r\000e\000n}{chapter.4}% 39 -\BOOKMARK [2][-]{subsection.4.3.1}{\376\377\0003\000.\0001\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000M\000o\000d\000u\000l\000e\000s\000\040\000e\000i\000n\000b\000i\000n\000d\000e\000n\000,\000\040\000H\000e\000a\000d\000e\000r\000\040\000F\000i\000l\000e\000s\000\040\000s\000c\000h\000r\000e\000i\000b\000e\000n}{section.4.3}% 40 -\BOOKMARK [1][-]{section.4.4}{\376\377\0004\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000:\000\040\000M\000a\000k\000e\000f\000i\000l\000e\000\040\000R\000e\000g\000e\000l\000n}{chapter.4}% 41 -\BOOKMARK [2][-]{subsection.4.4.1}{\376\377\0004\000.\0001\000\040\000N\000e\000u\000e\000\040\000R\000e\000g\000e\000l\000n\000\040\000h\000i\000n\000z\000u\000f\000\374\000g\000e\000n}{section.4.4}% 42 -\BOOKMARK [1][-]{section.4.5}{\376\377\0005\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0003}{chapter.4}% 43 -\BOOKMARK [1][-]{section.4.6}{\376\377\0006\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.4}% 44 -\BOOKMARK [1][-]{section.4.7}{\376\377\0007\000.\000\040\000E\000r\000w\000e\000i\000t\000e\000r\000u\000n\000g\000\040\000D\000o\000x\000y\000f\000i\000l\000e\000\040\000f\000\374\000r\000\040\000A\000b\000h\000\344\000n\000g\000i\000g\000k\000e\000i\000t\000s\000a\000n\000a\000l\000y\000s\000e}{chapter.4}% 45 -\BOOKMARK [0][-]{chapter.5}{\376\377\0000\0005\000\040\000-\000\040\000A\000r\000r\000a\000y\000s\000/\000S\000t\000r\000i\000n\000g\000s\000/\000T\000i\000c\000T\000a\000c\000T\000o\000e}{}% 46 -\BOOKMARK [1][-]{section.5.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.5}% 47 -\BOOKMARK [1][-]{section.5.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.5}% 48 -\BOOKMARK [1][-]{section.5.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:\000\040\000S\000o\000r\000t\000i\000e\000r\000e\000n\000\040\000v\000o\000n\000\040\000S\000t\000r\000i\000n\000g\000s}{chapter.5}% 49 -\BOOKMARK [1][-]{section.5.4}{\376\377\0004\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000:\000\040\000T\000i\000c\000T\000a\000c\000T\000o\000e}{chapter.5}% 50 -\BOOKMARK [2][-]{subsection.5.4.1}{\376\377\0004\000.\0001\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000i\000n\000i\000t}{section.5.4}% 51 -\BOOKMARK [2][-]{subsection.5.4.2}{\376\377\0004\000.\0002\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000g\000e\000t\000\137\000s\000t\000a\000t\000e\000\040\000u\000n\000d\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000g\000e\000t\000\137\000w\000i\000n\000n\000e\000r}{section.5.4}% 52 -\BOOKMARK [2][-]{subsection.5.4.3}{\376\377\0004\000.\0003\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000c\000a\000n\000\137\000m\000o\000v\000e}{section.5.4}% 53 -\BOOKMARK [2][-]{subsection.5.4.4}{\376\377\0004\000.\0004\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000m\000o\000v\000e\000\040\000u\000n\000d\000\040\000t\000e\000s\000t\000\137\000m\000o\000d\000e\000l\000\137\000g\000e\000t\000\137\000w\000i\000n\000\137\000l\000i\000n\000e}{section.5.4}% 54 -\BOOKMARK [1][-]{section.5.5}{\376\377\0005\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.5}% 55 -\BOOKMARK [0][-]{chapter.6}{\376\377\0000\0006\000\040\000-\000\040\000P\000e\000r\000s\000o\000n\000e\000n\000\040\000V\000e\000r\000w\000a\000l\000t\000u\000n\000g\000\040\040\023\000\040\000L\000i\000n\000k\000e\000d\000\040\000L\000i\000s\000t}{}% 56 -\BOOKMARK [1][-]{section.6.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.6}% 57 -\BOOKMARK [1][-]{section.6.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.6}% 58 -\BOOKMARK [1][-]{section.6.3}{\376\377\0003\000.\000\040\000P\000e\000r\000s\000o\000n\000e\000n\000v\000e\000r\000w\000a\000l\000t\000u\000n\000g}{chapter.6}% 59 -\BOOKMARK [2][-]{subsection.6.3.1}{\376\377\0003\000.\0001\000\040\000P\000r\000o\000g\000r\000a\000m\000m\000f\000u\000n\000k\000t\000i\000o\000n}{section.6.3}% 60 -\BOOKMARK [2][-]{subsection.6.3.2}{\376\377\0003\000.\0002\000\040\000D\000e\000s\000i\000g\000n\000v\000o\000r\000g\000a\000b\000e\000n}{section.6.3}% 61 -\BOOKMARK [2][-]{subsection.6.3.3}{\376\377\0003\000.\0003\000\040\000B\000e\000s\000t\000e\000h\000e\000n\000d\000e\000r\000\040\000P\000r\000o\000g\000r\000a\000m\000m\000r\000a\000h\000m\000e\000n}{section.6.3}% 62 -\BOOKMARK [1][-]{section.6.4}{\376\377\0004\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:\000\040\000M\000o\000d\000u\000l\000a\000r\000i\000s\000i\000e\000r\000u\000n\000g\000\040\040\023\000\040\000A\000P\000I\000\040\000u\000n\000d\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000m\000a\000i\000n\000.\000c}{chapter.6}% 63 -\BOOKMARK [1][-]{section.6.5}{\376\377\0005\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000:\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000i\000e\000r\000u\000n\000g\000\040\000v\000o\000n\000\040\000p\000e\000r\000s\000o\000n\000.\000c\000\040\000u\000n\000d\000\040\000l\000i\000s\000t\000.\000c}{chapter.6}% 64 -\BOOKMARK [2][-]{subsection.6.5.1}{\376\377\0005\000.\0001\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000:\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000i\000e\000r\000u\000n\000g\000\040\000v\000o\000n\000\040\000p\000e\000r\000s\000o\000n\000.\000c}{section.6.5}% 65 -\BOOKMARK [2][-]{subsection.6.5.2}{\376\377\0005\000.\0002\000\040\000T\000e\000i\000l\000a\000u\000f\000g\000a\000b\000e\000:\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000i\000e\000r\000u\000n\000g\000\040\000v\000o\000n\000\040\000l\000i\000s\000t\000.\000c}{section.6.5}% 66 -\BOOKMARK [1][-]{section.6.6}{\376\377\0006\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0003\000:\000\040\000U\000n\000i\000t\000\040\000T\000e\000s\000t\000s}{chapter.6}% 67 -\BOOKMARK [1][-]{section.6.7}{\376\377\0007\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.6}% 68 -\BOOKMARK [0][-]{chapter.7}{\376\377\0000\0007\000\040\000-\000\040\000P\000r\000o\000z\000e\000s\000s\000e\000\040\000u\000n\000d\000\040\000T\000h\000r\000e\000a\000d\000s}{}% 69 -\BOOKMARK [1][-]{section.7.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.7}% 70 -\BOOKMARK [2][-]{subsection.7.1.1}{\376\377\0001\000.\0001\000\040\000N\000a\000c\000h\000w\000e\000i\000s}{section.7.1}% 71 -\BOOKMARK [1][-]{section.7.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.7}% 72 -\BOOKMARK [1][-]{section.7.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000n}{chapter.7}% 73 -\BOOKMARK [2][-]{subsection.7.3.1}{\376\377\0003\000.\0001\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:\000\040\000P\000r\000o\000z\000e\000s\000s\000\040\000m\000i\000t\000\040\000f\000o\000r\000k\000\050\000\051\000\040\000e\000r\000z\000e\000u\000g\000e\000n}{section.7.3}% 74 -\BOOKMARK [2][-]{subsection.7.3.2}{\376\377\0003\000.\0002\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0002\000:\000\040\000P\000r\000o\000z\000e\000s\000s\000\040\000m\000i\000t\000\040\000f\000o\000r\000k\000\050\000\051\000\040\000u\000n\000d\000\040\000e\000x\000e\000c\000\050\000\051\000:\000\040\000P\000r\000o\000g\000r\000a\000m\000m\000\040\000I\000m\000a\000g\000e\000\040\000e\000r\000s\000e\000t\000z\000e\000n}{section.7.3}% 75 -\BOOKMARK [2][-]{subsection.7.3.3}{\376\377\0003\000.\0003\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0003\000:\000\040\000P\000r\000o\000z\000e\000s\000s\000h\000i\000e\000r\000a\000r\000c\000h\000i\000e\000\040\000a\000n\000a\000l\000y\000s\000i\000e\000r\000e\000n}{section.7.3}% 76 -\BOOKMARK [2][-]{subsection.7.3.4}{\376\377\0003\000.\0004\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0004\000:\000\040\000Z\000e\000i\000t\000l\000i\000c\000h\000e\000r\000\040\000A\000b\000l\000a\000u\000f\000\040\000v\000o\000n\000\040\000P\000r\000o\000z\000e\000s\000s\000e\000n}{section.7.3}% 77 -\BOOKMARK [2][-]{subsection.7.3.5}{\376\377\0003\000.\0005\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0005\000:\000\040\000W\000a\000i\000s\000e\000n\000k\000i\000n\000d\000e\000r\000\040\000\050\000O\000r\000p\000h\000a\000n\000\040\000P\000r\000o\000c\000e\000s\000s\000e\000s\000\051}{section.7.3}% 78 -\BOOKMARK [2][-]{subsection.7.3.6}{\376\377\0003\000.\0006\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0006\000:\000\040\000T\000e\000r\000m\000i\000n\000i\000e\000r\000t\000e\000,\000\040\000h\000a\000l\000b\000t\000o\000t\000e\000\040\000P\000r\000o\000z\000e\000s\000s\000e\000\040\000\050\000Z\000o\000m\000b\000i\000e\000s\000\051}{section.7.3}% 79 -\BOOKMARK [2][-]{subsection.7.3.7}{\376\377\0003\000.\0007\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0007\000:\000\040\000A\000u\000f\000\040\000T\000e\000r\000m\000i\000n\000i\000e\000r\000e\000n\000\040\000v\000o\000n\000\040\000K\000i\000n\000d\000p\000r\000o\000z\000e\000s\000s\000e\000n\000\040\000w\000a\000r\000t\000e\000n}{section.7.3}% 80 -\BOOKMARK [2][-]{subsection.7.3.8}{\376\377\0003\000.\0008\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0008\000:\000\040\000K\000i\000n\000d\000p\000r\000o\000z\000e\000s\000s\000\040\000a\000l\000s\000\040\000K\000o\000p\000i\000e\000\040\000d\000e\000s\000\040\000E\000l\000t\000e\000r\000n\000p\000r\000o\000z\000e\000s\000s\000e\000s}{section.7.3}% 81 -\BOOKMARK [2][-]{subsection.7.3.9}{\376\377\0003\000.\0009\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0009\000:\000\040\000U\000n\000t\000e\000r\000s\000c\000h\000i\000e\000d\000\040\000v\000o\000n\000\040\000T\000h\000r\000e\000a\000d\000s\000\040\000g\000e\000g\000e\000n\000\374\000b\000e\000r\000\040\000P\000r\000o\000z\000e\000s\000s\000e\000n}{section.7.3}% 82 -\BOOKMARK [2][-]{subsection.7.3.10}{\376\377\0003\000.\0001\0000\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\0000\000\040\000\050\000o\000p\000t\000i\000o\000n\000a\000l\000\051\000:}{section.7.3}% 83 -\BOOKMARK [3][-]{subsubsection.7.3.10.1}{\376\377\0003\000.\0001\0000\000.\0001\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{subsection.7.3.10}% 84 -\BOOKMARK [4][-]{paragraph*.7}{\376\377\0003\000.\0001\0000\000.\0001\000.\0001\000\040\000N\000a\000c\000h\000w\000e\000i\000s}{subsubsection.7.3.10.1}% 85 -\BOOKMARK [3][-]{subsubsection.7.3.10.2}{\376\377\0003\000.\0001\0000\000.\0002\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{subsection.7.3.10}% 86 -\BOOKMARK [3][-]{subsubsection.7.3.10.3}{\376\377\0003\000.\0001\0000\000.\0003\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000D\000\344\000m\000o\000n\000\040\000P\000r\000o\000z\000e\000s\000s\000e}{subsection.7.3.10}% 87 -\BOOKMARK [3][-]{subsubsection.7.3.10.4}{\376\377\0003\000.\0001\0000\000.\0004\000\040\000Z\000u\000s\000a\000t\000z\000i\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000e\000n}{subsection.7.3.10}% 88 -\BOOKMARK [4][-]{paragraph*.8}{\376\377\0003\000.\0001\0000\000.\0004\000.\0001\000\040\000D\000i\000e\000s\000e\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{subsubsection.7.3.10.4}% 89 -\BOOKMARK [4][-]{paragraph*.9}{\376\377\0003\000.\0001\0000\000.\0004\000.\0002\000\040\000Z\000u\000s\000a\000t\000z\000i\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000\040\000z\000u\000\040\000D\000\344\000m\000o\000n\000\040\000P\000r\000o\000z\000e\000s\000s\000e\000n}{subsubsection.7.3.10.4}% 90 -\BOOKMARK [1][-]{section.7.4}{\376\377\0004\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.7}% 91 -\BOOKMARK [0][-]{chapter.8}{\376\377\0000\0008\000\040\000-\000\040\000S\000y\000n\000c\000h\000r\000o\000n\000i\000s\000a\000t\000i\000o\000n\000s\000p\000r\000o\000b\000l\000e\000m\000e}{}% 92 -\BOOKMARK [1][-]{section.8.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.8}% 93 -\BOOKMARK [2][-]{subsection.8.1.1}{\376\377\0001\000.\0001\000\040\000N\000a\000c\000h\000w\000e\000i\000s}{section.8.1}% 94 -\BOOKMARK [1][-]{section.8.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.8}% 95 -\BOOKMARK [1][-]{section.8.3}{\376\377\0003\000.\000\040\000E\000i\000n\000f\000\374\000h\000r\000u\000n\000g}{chapter.8}% 96 -\BOOKMARK [2][-]{subsection.8.3.1}{\376\377\0003\000.\0001\000\040\000W\000i\000e\000\040\000l\000\366\000s\000t\000\040\000m\000a\000n\000\040\000S\000y\000n\000c\000h\000r\000o\000n\000i\000s\000a\000t\000i\000o\000n\000s\000p\000r\000o\000b\000l\000e\000m\000e\000?}{section.8.3}% 97 -\BOOKMARK [1][-]{section.8.4}{\376\377\0004\000.\000\040\000D\000e\000r\000\040\000K\000a\000f\000f\000e\000e\000-\000A\000u\000t\000o\000m\000a\000t}{chapter.8}% 98 -\BOOKMARK [2][-]{subsection.8.4.1}{\376\377\0004\000.\0001\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000M\000u\000t\000u\000a\000l\000\040\000E\000x\000c\000l\000u\000s\000i\000o\000n}{section.8.4}% 99 -\BOOKMARK [3][-]{subsubsection.8.4.1.1}{\376\377\000A\000u\000f\000g\000a\000b\000e\000n}{subsection.8.4.1}% 100 -\BOOKMARK [2][-]{subsection.8.4.2}{\376\377\0004\000.\0002\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000E\000i\000n\000f\000a\000c\000h\000e\000\040\000R\000e\000i\000h\000e\000n\000f\000o\000l\000g\000e}{section.8.4}% 101 -\BOOKMARK [3][-]{subsubsection.8.4.2.1}{\376\377\000A\000u\000f\000g\000a\000b\000e\000n}{subsection.8.4.2}% 102 -\BOOKMARK [2][-]{subsection.8.4.3}{\376\377\0004\000.\0003\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000E\000r\000w\000e\000i\000t\000e\000r\000t\000e\000\040\000R\000e\000i\000h\000e\000n\000f\000o\000l\000g\000e}{section.8.4}% 103 -\BOOKMARK [3][-]{subsubsection.8.4.3.1}{\376\377\000A\000u\000f\000g\000a\000b\000e}{subsection.8.4.3}% 104 -\BOOKMARK [2][-]{subsection.8.4.4}{\376\377\0004\000.\0004\000\040\000Z\000u\000s\000a\000m\000m\000e\000n\000f\000a\000s\000s\000u\000n\000g}{section.8.4}% 105 -\BOOKMARK [1][-]{section.8.5}{\376\377\0005\000.\000\040\000I\000n\000t\000e\000r\000n\000a\000t\000i\000o\000n\000a\000l\000\040\000B\000a\000n\000k\000i\000n\000g}{chapter.8}% 106 -\BOOKMARK [2][-]{subsection.8.5.1}{\376\377\0005\000.\0001\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.8.5}% 107 -\BOOKMARK [2][-]{subsection.8.5.2}{\376\377\0005\000.\0002\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000K\000o\000n\000t\000o\000\040\000S\000y\000n\000c\000h\000r\000o\000n\000i\000s\000a\000t\000i\000o\000n}{section.8.5}% 108 -\BOOKMARK [2][-]{subsection.8.5.3}{\376\377\0005\000.\0003\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000F\000i\000l\000i\000a\000l\000e\000n\000\040\000Z\000u\000g\000r\000i\000f\000f\000\040\000i\000n\000\040\000C\000r\000i\000t\000i\000c\000a\000l\000\040\000S\000e\000c\000t\000i\000o\000n}{section.8.5}% 109 -\BOOKMARK [2][-]{subsection.8.5.4}{\376\377\0005\000.\0004\000\040\000A\000u\000f\000g\000a\000b\000e\000:\000\040\000R\000e\000f\000a\000c\000t\000o\000r\000i\000n\000g\000\040\000d\000e\000r\000\040\000S\000y\000n\000c\000h\000r\000o\000n\000i\000s\000a\000t\000i\000o\000n}{section.8.5}% 110 -\BOOKMARK [1][-]{section.8.6}{\376\377\0006\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.8}% 111 -\BOOKMARK [0][-]{chapter.9}{\376\377\0000\0009\000\040\000-\000\040\000F\000i\000l\000e\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s}{}% 112 -\BOOKMARK [1][-]{section.9.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.9}% 113 -\BOOKMARK [1][-]{section.9.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.9}% 114 -\BOOKMARK [1][-]{section.9.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:}{chapter.9}% 115 -\BOOKMARK [1][-]{section.9.4}{\376\377\0004\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.9}% 116 -\BOOKMARK [0][-]{chapter.10}{\376\377\0001\0000\000\040\000-\000\040\000I\000P\000C}{}% 117 -\BOOKMARK [1][-]{section.10.1}{\376\377\0001\000.\000\040\000\334\000b\000e\000r\000s\000i\000c\000h\000t}{chapter.10}% 118 -\BOOKMARK [1][-]{section.10.2}{\376\377\0002\000.\000\040\000L\000e\000r\000n\000z\000i\000e\000l\000e}{chapter.10}% 119 -\BOOKMARK [1][-]{section.10.3}{\376\377\0003\000.\000\040\000A\000u\000f\000g\000a\000b\000e\000\040\0001\000:}{chapter.10}% 120 -\BOOKMARK [1][-]{section.10.4}{\376\377\0004\000.\000\040\000B\000e\000w\000e\000r\000t\000u\000n\000g}{chapter.10}% 121 diff --git a/main.tex b/main.tex deleted file mode 100644 index 2f4faa3..0000000 --- a/main.tex +++ /dev/null @@ -1,4084 +0,0 @@ -%% Generated by Sphinx. -\def\sphinxdocclass{report} -\documentclass[a4paper,10pt,english]{report} -\ifdefined\pdfpxdimen - \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen -\fi \sphinxpxdimen=.75bp\relax -\ifdefined\pdfimageresolution - \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax -\fi -%% let collapsible pdf bookmarks panel have high depth per default -\PassOptionsToPackage{bookmarksdepth=5}{hyperref} - -\PassOptionsToPackage{warn}{textcomp} -\usepackage[utf8]{inputenc} -\ifdefined\DeclareUnicodeCharacter -% support both utf8 and utf8x syntaxes - \ifdefined\DeclareUnicodeCharacterAsOptional - \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}} - \else - \let\sphinxDUC\DeclareUnicodeCharacter - \fi - \sphinxDUC{00A0}{\nobreakspace} - \sphinxDUC{2500}{\sphinxunichar{2500}} - \sphinxDUC{2502}{\sphinxunichar{2502}} - \sphinxDUC{2514}{\sphinxunichar{2514}} - \sphinxDUC{251C}{\sphinxunichar{251C}} - \sphinxDUC{2572}{\textbackslash} -\fi -\usepackage{cmap} -\usepackage[T1]{fontenc} -\usepackage{amsmath,amssymb,amstext} -\usepackage{babel} - - -\usepackage{amsmath,amsfonts,amssymb,amsthm} - - -\usepackage{fncychap} -\usepackage{sphinx} -\sphinxsetup{hmargin={0.7in,0.7in}, vmargin={1in,1in}, verbatimwithframe=true, TitleColor={rgb}{0,0,0}, HeaderFamily=\rmfamily\bfseries, InnerLinkColor={rgb}{0,0,1}, OuterLinkColor={rgb}{0,0,1}} -\fvset{fontsize=auto} -\usepackage{geometry} - - -% Include hyperref last. -\usepackage{hyperref} -% Fix anchor placement for figures with captions. -\usepackage{hypcap}% it must be loaded after hyperref. -% Set up styles of URL: it should be placed after hyperref. -\urlstyle{same} - -\addto\captionsenglish{\renewcommand{\contentsname}{Contents:}} - -\usepackage{sphinxmessages} -\setcounter{tocdepth}{2} - - - %% %% %% %% %% %% %% %% %% %% Meher %% %% %% %% %% %% %% %% %% - %% %add number to subsubsection 2=subsection, 3=subsubsection - %% % below subsubsection is not good idea. - \setcounter{secnumdepth}{3} - % - %% %% Table of content upto 2=subsection, 3=subsubsection - \setcounter{tocdepth}{2} - \usepackage{amsmath,amsfonts,amssymb,amsthm} - \usepackage{graphicx} - %% % r educe spaces for Table of contents, figures and tables - %% % i t is used "\addtocontents{toc}{\vskip -1.2cm}" etc. in the document - \usepackage[notlot,nottoc,notlof]{} - \usepackage{color} - \usepackage{transparent} - \usepackage{eso-pic} - \usepackage{lipsum} - \usepackage{footnotebackref} %% link at the footnote to go to the place of footnote in the text - %% spacing between line - \usepackage{setspace} - %% %% \onehalfspacing - %% %% \doublespacing - \singlespacing - %% %% %% %% %% % d atetime - \usepackage{datetime} - \newdateformat{MonthYearFormat}{% - \monthname[\THEMONTH], \THEYEAR} - %% RO, LE will not work for 'oneside' layout. - %% Change oneside to twoside in document class - \usepackage{fancyhdr} - \pagestyle{fancy} - \fancyhf{} - %% % Alternating Header for oneside - \fancyhead[L]{\ifthenelse{\isodd{\value{page}}}{ \small \nouppercase{\leftmark} }{}} - \fancyhead[R]{\ifthenelse{\isodd{\value{page}}}{}{ \small \nouppercase{\rightmark} }} - %% % Alternating Header for two side - %\fancyhead[RO]{\small \nouppercase{\rightmark}} - %\fancyhead[LE]{\small \nouppercase{\leftmark}} - %% for oneside: change footer at right side. If you want to use Left and right then use same as header defined above. - %% %\fancyfoot[R]{\ifthenelse{\isodd{\value{page}}}{{\tiny Meher Krishna Patel} }{\href{http://pythondsp.readthedocs.io/en/latest/pythondsp/toc.html}{\tiny PythonDSP}}} - %% % Alternating Footer for two side - %\fancyfoot[RO, RE]{\scriptsize Meher Krishna Patel (mekrip@gmail.com)} - %% % page number - \fancyfoot[CO, CE]{\thepage} - \renewcommand{\headrulewidth}{0.5pt} - \renewcommand{\footrulewidth}{0.5pt} - - \RequirePackage{tocbibind} %% % c omment this to remove page number for following - \addto\captionsenglish{\renewcommand{\contentsname}{Table of contents}} - \addto\captionsenglish{\renewcommand{\listfigurename}{List of figures}} - \addto\captionsenglish{\renewcommand{\listtablename}{List of tables}} - % \addto\captionsenglish{\renewcommand{\chaptername}{Chapter}} - %% reduce spacing for itemize - \usepackage{enumitem} - \setlist{nosep} - %% %% %% %% %% % Quote Styles at the top of chapter - \usepackage{epigraph} - \setlength{\epigraphwidth}{0.8\columnwidth} - \newcommand{\chapterquote}[2]{\epigraphhead[60]{\epigraph{\textit{#1}}{\textbf {\textit{--#2}}}}} - %% %% %% %% %% % Quote for all places except Chapter - \newcommand{\sectionquote}[2]{{\quote{\textit{``#1''}}{\textbf {\textit{--#2}}}}} - - -\title{SNP Laboratories} -\date{Feb 17, 2022} -\release{} -\author{} -\newcommand{\sphinxlogo}{\sphinxincludegraphics{en-zhaw-ines-rgb.png}\par} -\renewcommand{\releasename}{ } -\makeindex -\begin{document} - -\ifdefined\shorthandoff - \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi - \ifnum\catcode`\"=\active\shorthandoff{"}\fi -\fi - -\pagestyle{empty} - - \pagenumbering{Roman} %% % to avoid page 1 conflict with actual page 1 - \begin{titlepage} - \centering - \vspace*{40mm} %% % * is used to give space from top - \textbf{\Huge {SNP Laboratories}} - \vspace{0mm} - \begin{figure}[!h] - \centering - \includegraphics[scale=0.5]{en-zhaw-ines-rgb.png} - \end{figure} - \begin{figure}[!h] - \centering - \textbf{ welo, donn, bohe, bazz, grop, huno, giei, fisa, kocb } - \end{figure} - \vspace*{20mm} - \vspace{20mm} - - \vspace*{0mm} - \small Last updated : \MonthYearFormat\today - %% \vfill adds at the bottom - \vfill - \small \textit{More documents are available at }{\href{https://github.zhaw.ch/SNP/snp/tree/master/praktika}{github.zhaw.ch}} - \end{titlepage} - \clearpage - \pagenumbering{roman} - \tableofcontents - %% %\listoffigures - %% %\listoftables - \clearpage - \pagenumbering{arabic} - -\pagestyle{plain} - -\pagestyle{normal} -\phantomsection\label{\detokenize{index::doc}} - - - -\chapter{01 \sphinxhyphen{} Erste Schritte mit C} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:erste-schritte-mit-c}}\label{\detokenize{P01_Erste_Schritte_mit_C/README::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum erstellen Sie mehrere kleine C\sphinxhyphen{}Programme, in denen Sie Input\sphinxhyphen{} und Output\sphinxhyphen{}Funktionen der C Standard Library verwenden. - -\sphinxAtStartPar -Arbeiten Sie in Zweiergruppen und diskutieren Sie ihre Lösungsansätze miteinander, bevor Sie diese umsetzen. - -\sphinxAtStartPar -Bevor Sie mit den Programmieraufgaben beginnen, setzen Sie eine virtuelle Maschine mit der vorbereiteten Praktikumsumgebung auf. - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum schreiben Sie selbst von Grund auf einige einfache C\sphinxhyphen{}Programme und wenden verschiedene Kontrollstrukturen an. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können mit \sphinxstyleemphasis{\#include} Funktionen der C Standard Library einbinden - -\item {} -\sphinxAtStartPar -Sie können mit \sphinxstyleemphasis{\#define} Macros definieren und diese anwenden - -\item {} -\sphinxAtStartPar -Sie wenden die \sphinxstyleemphasis{Input\sphinxhyphen{}} und \sphinxstyleemphasis{Output\sphinxhyphen{}Funktionen} von C an, um Tastatur\sphinxhyphen{}Input einzulesen und formatierte Ausgaben zu machen. - -\item {} -\sphinxAtStartPar -Sie verwenden die Kommandozeile, um ihren Sourcecode in ein ausführbares Programm umzuwandeln. - -\item {} -\sphinxAtStartPar -Sie wenden for\sphinxhyphen{}und while\sphinxhyphen{}Loops sowie if\sphinxhyphen{}then\sphinxhyphen{}else\sphinxhyphen{}Verzweigungen an. - -\item {} -\sphinxAtStartPar -Sie setzen eine Programmieraufgabe selbständig in ein funktionierendes Programm um. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{3. Aufgabe 1: virtuelle Maschine} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:aufgabe-1-virtuelle-maschine}} -\sphinxAtStartPar -Im Moodle\sphinxhyphen{}Kurs “Systemnahe Programmierung” finden Sie unter “Praktika” eine Installationsanleitung für die virtuelle Maschine, die wir Ihnen zur Verfügung stellen. Die virtuelle Maschine enthält ein Ubuntu Linux\sphinxhyphen{}Betriebssystem und die für das Praktikum benötigten Frameworks. - -\sphinxAtStartPar -Folgen sie der Anleitung, um die virtuelle Maschine auf ihrem Rechner zu installieren. - - -\bigskip\hrule\bigskip - - - -\section{4. Aufgabe 2: Hello World} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:aufgabe-2-hello-world}} -\sphinxAtStartPar -Schreiben Sie ein C\sphinxhyphen{}Programm, das “Hello World” auf die Standardausgabe schreibt. Verwenden Sie die printf\sphinxhyphen{}Funktion aus der Standard Library. In den Vorlesungsfolien finden Sie bei Bedarf eine Vorlage. - -\sphinxAtStartPar -Erstellen sie das Source\sphinxhyphen{}File mit einem beliebigen Editor, sie benötigen nicht unbedingt eine IDE. Speichern Sie das Source\sphinxhyphen{}File mit der Endung \sphinxcode{\sphinxupquote{.c}}. - -\sphinxAtStartPar -Um ihr Source\sphinxhyphen{}File zu kompilieren, verwenden Sie den GNU Compiler auf der Kommandozeile: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYGZdl{}\PYGZgt{} gcc hello.c -\end{sphinxVerbatim} - -\sphinxAtStartPar -Der Compiler übersetzt ihr Programm in eine ausführbare Datei \sphinxcode{\sphinxupquote{a.out}}, die Sie mit - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYGZdl{}\PYGZgt{} ./a.out -\end{sphinxVerbatim} - -\sphinxAtStartPar -ausführen können. Sie können den Namen der ausführbaren Datei wählen, indem Sie die Option \sphinxcode{\sphinxupquote{\sphinxhyphen{}o}} verwenden: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYGZdl{}\PYGZgt{} gcc hello.c \PYGZhy{}o hello -\end{sphinxVerbatim} - -\sphinxAtStartPar -erzeugt die ausführbare Datei \sphinxcode{\sphinxupquote{hello}}. - -\sphinxAtStartPar -Verwenden Sie die Option \sphinxcode{\sphinxupquote{\sphinxhyphen{}Wall}}, um alle Warnungen des Compilers auszugeben. Dies weist Sie auf allfällige Programmierfehler hin. - - -\bigskip\hrule\bigskip - - - -\section{5. Aufgabe 3: Tabellenausgabe} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:aufgabe-3-tabellenausgabe}} -\sphinxAtStartPar -Schreiben Sie ein Programm in C, das von \sphinxcode{\sphinxupquote{stdin}} einen Umrechnungsfaktor zwischen CHF und Bitcoin einliest und danach eine Tabelle von Franken\sphinxhyphen{} und Bitcoin\sphinxhyphen{}Beträgen ausgibt. Die Tabelle soll sauber formatiert sein, z.B. so: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{Enter} \PYG{n}{conversion} \PYG{n}{rate} \PYG{p}{(}\PYG{l+m+mf}{1.00} \PYG{n}{BTC} \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{n}{CHF}\PYG{p}{)}\PYG{p}{:} \PYG{l+m+mf}{43158.47} - \PYG{l+m+mi}{200} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.00463} \PYG{n}{BTC} - \PYG{l+m+mi}{400} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.00927} \PYG{n}{BTC} - \PYG{l+m+mi}{600} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.01390} \PYG{n}{BTC} - \PYG{l+m+mi}{800} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.01854} \PYG{n}{BTC} - \PYG{l+m+mi}{1000} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.02317} \PYG{n}{BTC} - \PYG{l+m+mi}{1200} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.02780} \PYG{n}{BTC} - \PYG{l+m+mi}{1400} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.03244} \PYG{n}{BTC} - \PYG{l+m+mi}{1600} \PYG{n}{CHF} \PYG{o}{\PYGZlt{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}} \PYG{l+m+mf}{0.03707} \PYG{n}{BTC} -\end{sphinxVerbatim} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verwenden Sie eine Schleife und die \sphinxcode{\sphinxupquote{printf}}\sphinxhyphen{}Funktion für die Tabellenausgabe - -\item {} -\sphinxAtStartPar -Definieren Sie ein Makro \sphinxcode{\sphinxupquote{NUM\_ROWS}}, um an zentraler Stelle im Source\sphinxhyphen{}Code zu definieren, wie viele Einträge die Tabelle in der Ausgabe haben soll. - -\item {} -\sphinxAtStartPar -Lesen Sie den Umrechnungsfaktor mit der \sphinxcode{\sphinxupquote{scanf}}\sphinxhyphen{}Funktion als \sphinxcode{\sphinxupquote{double}} von der Kommandozeile ein. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{6. Aufgabe 4: Zeichen und Wörter zählen} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:aufgabe-4-zeichen-und-worter-zahlen}} -\sphinxAtStartPar -Schreiben Sie ein C\sphinxhyphen{}Programm, welches die Zeichen und Wörter einer mit der Tastatur eingegebenen Zeile zählt. Wortzwischenräume sind entweder Leerzeichen (’ ‘) oder Tabulatoren (‘\textbackslash{}t’). Die Eingabe der Zeile mit einem newline\sphinxhyphen{}character (‘\textbackslash{}n’) abgeschlossen. Danach soll ihr Programm die Anzahl Zeichen und die Anzahl Wörter ausgeben und terminieren. -\begin{itemize} -\item {} -\sphinxAtStartPar -Verwenden Sie die \sphinxcode{\sphinxupquote{char getchar(void)}} Funktion aus der \sphinxcode{\sphinxupquote{stdio.h}} Library, um die Zeichen einzeln einzulesen. Die Funktion \sphinxcode{\sphinxupquote{getchar}} kehrt nicht gleich bei Eingabe des ersten Zeichens zurück, sondern puffert die Daten, bis die Eingabe einer kompletten Zeile mit Return abgeschlossen wird. Dann wird das erste Zeichen aus dem Puffer zurückgegeben und mit weiteren Aufrufen von getchar können die nachfolgenden Zeichen aus dem Puffer gelesen werden. Gibt \sphinxcode{\sphinxupquote{getchar}} das Zeichen \sphinxcode{\sphinxupquote{\textbackslash{}n}} zurück, ist die Zeile komplett zurückgegeben und der Puffer ist wieder leer. - -\item {} -\sphinxAtStartPar -Setzen Sie eine Schleife ein, die beim Zeichen ‘\textbackslash{}n’ terminiert. - -\item {} -\sphinxAtStartPar -Benutzen Sie if\sphinxhyphen{}then\sphinxhyphen{}else\sphinxhyphen{}Strukturen um die Wörter zu zählen. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{7. Bewertung} -\label{\detokenize{P01_Erste_Schritte_mit_C/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\chapter{02: Funktionen, Datentyp “enum”} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:funktionen-datentyp-enum}}\label{\detokenize{P02_Funktionen_Datentyp_enum/README::doc}} - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -\sphinxincludegraphics{{random_number}.png} - -\sphinxAtStartPar -(Copyright Bild: xkcd.com) - - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum. - -\sphinxAtStartPar -Funktionen sind der wesentlichste Bestandteil der C Programmierung welcher eine strukturierte Programmierung ermöglicht: -\begin{itemize} -\item {} -\sphinxAtStartPar -Eine Funktion ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden. - -\item {} -\sphinxAtStartPar -Jede Funktion besitzt einen eindeutigen Namen, eine eindeutige Signatur (Typen und Reihenfolge der Parameter) und einen Rückgabewert (int falls nichts angegeben wird). - -\item {} -\sphinxAtStartPar -Eine Funktion kann Werte aus dem aufrufendem Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern. -Beispiel einer Additions\sphinxhyphen{}Funktion: - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+c1}{\PYGZsh{}include \PYGZlt{}stdio.h\PYGZgt{}} - -\PYG{o}{/}\PYG{o}{*} \PYG{n}{Funktionsdeklaration} \PYG{o}{*}\PYG{o}{/} -\PYG{n+nb}{int} \PYG{n}{add}\PYG{p}{(}\PYG{n+nb}{int} \PYG{n}{a}\PYG{p}{,} \PYG{n+nb}{int} \PYG{n}{b}\PYG{p}{)}\PYG{p}{;} - -\PYG{n+nb}{int} \PYG{n}{main}\PYG{p}{(}\PYG{n}{void}\PYG{p}{)} \PYG{p}{\PYGZob{}} - \PYG{n+nb}{int} \PYG{n}{aa} \PYG{o}{=} \PYG{l+m+mi}{1}\PYG{p}{,} \PYG{n}{bb} \PYG{o}{=} \PYG{l+m+mi}{2}\PYG{p}{,} \PYG{n}{cc}\PYG{p}{;} - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+si}{\PYGZpc{}a}\PYG{l+s+s2}{a + }\PYG{l+s+s2}{\PYGZpc{}}\PYG{l+s+s2}{bb = }\PYG{l+s+si}{\PYGZpc{}c}\PYG{l+s+s2}{c}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{,} \PYG{n}{aa}\PYG{p}{,} \PYG{n}{bb}\PYG{p}{,} \PYG{n}{add}\PYG{p}{(}\PYG{n}{aa}\PYG{p}{,} \PYG{n}{bb}\PYG{p}{)}\PYG{p}{;}\PYG{p}{)}\PYG{p}{;} - \PYG{k}{return} \PYG{l+m+mi}{0}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} - -\PYG{o}{/}\PYG{o}{*} \PYG{n}{Funktionsdefinition} \PYG{o}{*}\PYG{o}{/} -\PYG{n+nb}{int} \PYG{n}{add}\PYG{p}{(}\PYG{n+nb}{int} \PYG{n}{a}\PYG{p}{,} \PYG{n+nb}{int} \PYG{n}{b}\PYG{p}{)} \PYG{p}{\PYGZob{}} - \PYG{k}{return} \PYG{n}{a} \PYG{o}{+} \PYG{n}{b}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Der Daten typt enum wird verwendet um die Lesbarkeit von Programmen zu erhöhen: - -\sphinxAtStartPar -Beispiel eines enum: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{enum} \PYG{n}{Ampeln} \PYG{o}{=} \PYG{p}{\PYGZob{}}\PYG{n}{rot} \PYG{o}{=}\PYG{l+m+mi}{1}\PYG{p}{,} \PYG{n}{gelb}\PYG{p}{,} \PYG{n}{gruen}\PYG{p}{\PYGZcb{}}\PYG{p}{;} - -\PYG{n+nb}{int} \PYG{n}{main}\PYG{p}{(}\PYG{n}{void}\PYG{p}{)} \PYG{p}{\PYGZob{}} - \PYG{n}{Ampeln} \PYG{n}{ampel1}\PYG{p}{;} - \PYG{k}{if} \PYG{p}{(}\PYG{n}{ampel1} \PYG{o}{==} \PYG{n}{rot}\PYG{p}{)} \PYG{p}{\PYGZob{}}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{\PYGZcb{}} - \PYG{k}{return} \PYG{l+m+mi}{0}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können ein Programm schreiben welches aus mehreren Funktionen besteht. - -\item {} -\sphinxAtStartPar -Sie können Funktionen deklarieren, definieren und aufrufen. - -\item {} -\sphinxAtStartPar -Sie können enum Typen definieren und deren Werte bestimmen und abfragen. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{3. Aufgaben} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:aufgaben}} -\begin{figure}[htbp] -\centering - -\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{kalender-108_v-ARDFotogalerie}.jpg} -\end{figure} - -\sphinxAtStartPar -(Copyright Bild: www.planet\sphinxhyphen{}wissen.de) - - -\subsection{3.1 Aufgabe 1 Tage pro Monat} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:aufgabe-1-tage-pro-monat}} -\sphinxAtStartPar -In der ersten Aufgabe berechnen Sie die Tag pro Monat einer beliebigen Kombination Monat / Jahr. -Erweitern Sie dazu das Programm um folgende Aspekte: -\begin{itemize} -\item {} -\sphinxAtStartPar -Bereichsprüfung von Jahr und Monat - -\item {} -\sphinxAtStartPar -Funktion istSchaltjahr, welche berechnet, ob das Jahr eine Schaljahr ist - -\item {} -\sphinxAtStartPar -Funktion tageProMonat, welche die Anzahl Tage des gegebenen Monats und Jahres berechnet. - -\end{itemize} - -\sphinxAtStartPar -Vorgaben: -\begin{itemize} -\item {} -\sphinxAtStartPar -Die Funktion istSchaltjahr nimmt ein Integer (jahr) entgegen und gibt 1 im Falle eiens Schltjahres und 0 im andreren Fall zurück - -\item {} -\sphinxAtStartPar -Die Funktion tageProMonat nimmt zwei integer (monat und jahr) entgegeben und gibt die Anzahl Tage als Integer zurück - -\item {} -\sphinxAtStartPar -Die Jahreszahl, welche den Funktionen übergeben wird, muss überprüft werden und grösser gleich 1599 und kleiner als 10000 sein - -\item {} -\sphinxAtStartPar -Der übergebene Monat muss grösser als 0 und kleine als 13 sein. - -\end{itemize} - -\sphinxAtStartPar -Die Regeln für die Schaltjahrberechnung: -\begin{itemize} -\item {} -\sphinxAtStartPar -Schaltjahre sind alle Jahre, die durch 4 teilbar sind. - -\item {} -\sphinxAtStartPar -Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schltjahre. - -\item {} -\sphinxAtStartPar -zu den 100er gibt es ebenfalls Ausnahmen: Diese sind immer Schaltjahre, wenn sie durch 400 teilbar sind -… also zum Beispiel 1600 ist eines, nicht jedoch 1700. Weiterführende Details finden Sie unter https://de.wikipedia.org/wiki/Gregorianischer\_Kalender - -\end{itemize} - -\sphinxAtStartPar -Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen: -\begin{itemize} -\item {} -\sphinxAtStartPar -gibIntWert: Die Funktion soll einen Int Wert zurückgeben. Der Bereich, wie auch Fehleingaben sollen sollen berücksichtigt werden. (atoi unfd fgets sind hier hilfreich) - -\item {} -\sphinxAtStartPar -istSchaltjahr: Die Funktion gibt 1 im Falle eines Schltjahr und o im anderen Falle zurück. - -\item {} -\sphinxAtStartPar -tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switchanweisung , sowie den enum Datentypen - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -int main (int argc, char *argv[]) \PYGZob{} - - int monat, jahr; - - // Monat einlesen und Bereich ueberpruefen - monat = gibIntWert(\PYGZdq{}Monat\PYGZdq{}, 1, 12); - jahr = gibIntWert(\PYGZdq{}Jahr\PYGZdq{}, 1600, 9999); - - // Ausgabe zum Test - printf(\PYGZdq{}Monat: \PYGZpc{}d, Jahr: \PYGZpc{}d \PYGZbs{}n\PYGZdq{}, monat, jahr); - - // Ausgabe zum Test (hier mit dem ternaeren Operator \PYGZdq{}?:\PYGZdq{}) - printf(\PYGZdq{}\PYGZpc{}d ist \PYGZpc{}s Schaltjahr\PYGZbs{}n\PYGZdq{}, jahr, istSchaltjahr(jahr) ? \PYGZdq{}ein\PYGZdq{} : \PYGZdq{}kein\PYGZdq{}); - - // Ausgabe - printf(\PYGZdq{}Der Monat \PYGZpc{}02d\PYGZhy{}\PYGZpc{}d hat \PYGZpc{}d Tage.\PYGZbs{}n\PYGZdq{}, monat, jahr, tageProMonat(jahr, monat)); - - return 0; -\PYGZcb{} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Tipp: Angenommen Sie verwenden den enum month\_t \{ JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ \}; -Dann können Sie im Programm direkt die Konstanten verwenden: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{k}{if} \PYG{p}{(}\PYG{n}{m} \PYG{o}{==} \PYG{l+m+mi}{2}\PYG{p}{)} \PYG{o}{.}\PYG{o}{.}\PYG{o}{.} \PYG{o}{/}\PYG{o}{/} \PYG{n}{schlecht} \PYG{n}{lesbar} -\PYG{k}{if} \PYG{p}{(}\PYG{n}{monat} \PYG{o}{==} \PYG{l+m+mi}{2}\PYG{p}{)} \PYG{o}{.}\PYG{o}{.}\PYG{o}{.} \PYG{o}{/}\PYG{o}{/} \PYG{n}{besserer} \PYG{n}{Variablenname} -\PYG{k}{if} \PYG{p}{(}\PYG{n}{monat} \PYG{o}{==} \PYG{n}{FEB}\PYG{p}{)} \PYG{o}{.}\PYG{o}{.}\PYG{o}{.} \PYG{o}{/}\PYG{o}{/} \PYG{n}{am} \PYG{n}{besten} \PYG{n}{lesbar} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Als Abnahme müssen die Tests unverändert ohne Fehler ausgeführt werden (\sphinxcode{\sphinxupquote{make test}}) - - -\bigskip\hrule\bigskip - - - -\subsection{3.2 Aufgabe 2 Bestimmen des Wochentags} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:aufgabe-2-bestimmen-des-wochentags}} -\sphinxAtStartPar -Erweitern Sie das vorgegebene zweite Programm Gerüst an den bezeichneten Stellen so, dass das Programm von der Kommando Zeile ein Argument entgegennimmt, es auf Gültigkeit überprüft und schliesslich den Wochentag für das gegebene Datum berechnet und ausgibt. -Prüfen Sie die Umsetzung beider Teilaufgaben mittels make test. - - -\subsubsection{3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen}} -\sphinxAtStartPar -Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel). -Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT\_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde terminiert das Programm mit Exit Code EXIT\_SUCCESS. - - -\paragraph{3.2.1.1 Argument Format} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:argument-format}} -\sphinxAtStartPar -Das Format des Kommando Zeilen Arguments soll yyyy\sphinxhyphen{}mm\sphinxhyphen{}dd sein, wobei yyyy für das vier\sphinxhyphen{}stellige Jahr, mm für einen 1\sphinxhyphen{}2\sphinxhyphen{}stelligen Monat (1…12) und dd für einen Tag des Monats, begin\sphinxhyphen{}nend mit 01. Z.B. 2020\sphinxhyphen{}02\sphinxhyphen{}29. - - -\paragraph{3.2.1.2 Korrektes Datum} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:korrektes-datum}} -\sphinxAtStartPar -Das Datum muss alle folgenden Bedingungen erfüllen damit es als korrekt erkannt wird: -\begin{itemize} -\item {} -\sphinxAtStartPar -Obergrenze für ein «sinnvolles» Datum ist das Jahr 9999 - -\item {} -\sphinxAtStartPar -es muss Gregorianisch sein, d.h. ab 15. Oktober 1582 (inklusive) - -\item {} -\sphinxAtStartPar -es darf nur Monate von 1 für Januar bis 12 für Dezember beinhalten - -\item {} -\sphinxAtStartPar -der Tag muss grösser oder gleich 1 sein - -\item {} -\sphinxAtStartPar -der Tag darf nicht grösser als 31 sein für Monate mit einer Länge von 31 Tagen - -\item {} -\sphinxAtStartPar -der Tag darf nicht grösser als 30 sein für Monate mit einer Länge von 30 Tagen - -\item {} -\sphinxAtStartPar -der Tag darf für den Februar nicht grösser sein als 29 für ein Schaltjahr - -\item {} -\sphinxAtStartPar -der Tag darf für den Februar nicht grösser sein als 28 für ein Nicht\sphinxhyphen{}Schaltjahr - -\end{itemize} - - -\paragraph{3.2.1.3 Vorgaben an die Umsetzung} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:vorgaben-an-die-umsetzung}}\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Definieren Sie einen enum Typen mit (typedef) Namen month\_t dessen Werte die Englischen 3\sphinxhyphen{}Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher dass die Abkürzungen für die uns geläufigen Monatsnummer stehen. - -\item {} -\sphinxAtStartPar -Definierend Sie einen struct Typen mit (typedef) Namen date\_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring “\%d\sphinxhyphen{}\%d\sphinxhyphen{}\%d” in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang. - -\item {} -\sphinxAtStartPar -Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is\_leap\_year(date\_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr». - -\item {} -\sphinxAtStartPar -Implementieren Sie die Funktion \sphinxcode{\sphinxupquote{int get\_month\_length(date\_t date)}}. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats ent\sphinxhyphen{}spricht) ausgeben \textendash{} geben Sie 0 für ungültige Monatswerte zurück. - -\item {} -\sphinxAtStartPar -Schliesslich implementieren Sie die Funktion int is\_gregorian\_date(date\_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja). - -\item {} -\sphinxAtStartPar -Implementieren Sie eine Funktion int is\_valid\_date(date\_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die \sphinxcode{\sphinxupquote{month\_t}} Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implemen\sphinxhyphen{}tierten Hilfsfunktionen. - -\end{enumerate} - - -\paragraph{3.2.1.4 Hinweise} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:hinweise}} -\sphinxAtStartPar -Beachten Sie die Kommentare im Code für die geforderten Implementierungs\sphinxhyphen{}Details. - - -\subsubsection{3.2.2 Teilaufgabe Wochentag Berechnung} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:teilaufgabe-wochentag-berechnung}} -\sphinxAtStartPar -Schreiben Sie eine Funktion welche zu einem Datum den Wochentag berechnet. -Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss. - -\begin{figure}[htbp] -\centering - -\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Wochentagsberechnung}.jpg} -\end{figure} - -\sphinxAtStartPar -(Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung) - -\sphinxAtStartPar -Hier ist eine für C abgewandelte Variante davon. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{weekday} \PYG{o}{=} \PYG{p}{(}\PYG{p}{(}\PYG{n}{day} \PYG{o}{+} \PYG{p}{(}\PYG{l+m+mi}{13} \PYG{o}{*} \PYG{n}{m} \PYG{o}{\PYGZhy{}} \PYG{l+m+mi}{1}\PYG{p}{)} \PYG{o}{/} \PYG{l+m+mi}{5} \PYG{o}{+} \PYG{n}{y} \PYG{o}{+} \PYG{n}{y} \PYG{o}{/} \PYG{l+m+mi}{4} \PYG{o}{+} \PYG{n}{c} \PYG{o}{/} \PYG{l+m+mi}{4} \PYG{o}{\PYGZhy{}} \PYG{l+m+mi}{2} \PYG{o}{*} \PYG{n}{c}\PYG{p}{)} \PYG{o}{\PYGZpc{}} \PYG{l+m+mi}{7} \PYG{o}{+} \PYG{l+m+mi}{7}\PYG{p}{)} \PYG{o}{\PYGZpc{}} \PYG{l+m+mi}{7} -\PYG{n}{alle} \PYG{n}{Zahlen} \PYG{n}{sind} \PYG{n+nb}{int} \PYG{n}{Werte} \PYG{n}{und} \PYG{n}{alles} \PYG{n}{basiert} \PYG{n}{auf} \PYG{n+nb}{int}\PYG{o}{\PYGZhy{}}\PYG{n}{Arithmetik} -\PYG{n}{m} \PYG{o}{=} \PYG{l+m+mi}{1} \PYG{o}{+} \PYG{p}{(}\PYG{n}{month} \PYG{o}{+} \PYG{l+m+mi}{9}\PYG{p}{)} \PYG{o}{\PYGZpc{}} \PYG{l+m+mi}{12} -\PYG{n}{a} \PYG{o}{=} \PYG{n}{year} \PYG{o}{\PYGZhy{}} \PYG{l+m+mi}{1} \PYG{p}{(}\PYG{n}{für} \PYG{n}{month} \PYG{o}{\PYGZlt{}} \PYG{n}{Mar}\PYG{p}{)}\PYG{p}{,} \PYG{n}{ansonsten} \PYG{n}{year} -\PYG{n}{y} \PYG{o}{=} \PYG{n}{a} \PYG{o}{\PYGZpc{}} \PYG{l+m+mi}{100} -\PYG{n}{c} \PYG{o}{=} \PYG{n}{a} \PYG{o}{/} \PYG{l+m+mi}{100} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms fol\sphinxhyphen{}gende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy\sphinxhyphen{}mm\sphinxhyphen{}dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020\sphinxhyphen{}02\sphinxhyphen{}29 is a Sat. -Vorgaben an die Umsetzung -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Definieren Sie einen enum Typen mit (typedef) Namen weekday\_t dessen Werte die Englischen 3\sphinxhyphen{}Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stel\sphinxhyphen{}len Sie sicher dass die Abkürzungen für die Werte 0…6 stehen. - -\item {} -\sphinxAtStartPar -Schreiben Sie eine Funktion weekday\_t calculate\_weekday(date\_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenom\sphinxhyphen{}men, d.h. es ist ein Programmier\sphinxhyphen{}Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu\sphinxhyphen{}sicherung (assert(is\_valid\_date(date));) - -\item {} -\sphinxAtStartPar -Schreiben Sie eine Funktion void print\_weekday(weekday\_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3\sphinxhyphen{}Zeichen Ab\sphinxhyphen{}kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti\sphinxhyphen{}ger Wert für day erkannt wird, soll assert(!”day is out\sphinxhyphen{}of\sphinxhyphen{}range”); aufgeru\sphinxhyphen{}fen werden. -Hinweise -• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\section{4. Bewertung} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden können. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Gewicht -\\ -\hline -\sphinxAtStartPar -alle -& -\sphinxAtStartPar -Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -gibIntWert -& -\sphinxAtStartPar -Eingabe, Bereichsüberprüfung korrekt -& -\sphinxAtStartPar -1 -\\ -\hline -\sphinxAtStartPar -istSchaltjahr -& -\sphinxAtStartPar -Funktion korrekt -& -\sphinxAtStartPar -1 -\\ -\hline -\sphinxAtStartPar -TageProMonat -& -\sphinxAtStartPar -Funktion korrekt -& -\sphinxAtStartPar -1 -\\ -\hline -\sphinxAtStartPar -Aufgabe 2 -& -\sphinxAtStartPar -Fehlenden Teile ergänzt und lauffähig -& -\sphinxAtStartPar -1 -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - - -\section{5. Anhang} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:anhang}} - -\subsection{5.1 Sprach Element} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:sprach-element}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] - ... -\PYGZcb{} argc: Anzahl Einträge in argv. -argv: Array von Command Line Argumenten. -argv[0]: wie das Programm gestartet wurde -argv[1]: erstes Argument -… -argv[argc\PYGZhy{}1]: letztes Argument -int a = 0; -int b = 0; -int c = 0; -int res = sscanf(argv[1] - , \PYGZdq{}\PYGZpc{}d\PYGZhy{}\PYGZpc{}d\PYGZhy{}\PYGZpc{}d\PYGZdq{} - , \PYGZam{}a, \PYGZam{}b, \PYGZam{}c - ); -if (res != 3) \PYGZob{} - // Fehler Behandlung... - // ... -\PYGZcb{} -\end{sphinxVerbatim} - - -\subsection{5.2 Beschreibung} -\label{\detokenize{P02_Funktionen_Datentyp_enum/README:beschreibung}} -\sphinxAtStartPar -Siehe man 3 sscanf. -Die Funktion sscanf gibt die Anzahl erfolgreich erkannte Argumente zurück. Unbedingt prüfen und angemessen darauf reagieren. -Die gelesenen Werte werden in a, b und c, gespeichert, dazu müssen Sie die Adresse der Variablen übergeben. Mehr Details dazu werden später erklärt. -fprintf(stderr, “Usage: \%s…\textbackslash{}n”, argv{[}0{]}); Siehe man 3 fprintf. -Schreibt formatierten Text auf den stderr Stream. - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 15.02.2022 - - -\chapter{03 \sphinxhyphen{} Bit Operationen, Struct, Typedef} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:bit-operationen-struct-typedef}}\label{\detokenize{P03_Bit_Operation_struct_typedef/README::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Bit Operationen} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:bit-operationen}} -\sphinxAtStartPar -\sphinxincludegraphics{{135oALYhkYyXB2aG0F-qrwA}.jpeg} - -\sphinxAtStartPar -Bit Operationen sind allgegenwärtig in den Computer\sphinxhyphen{}Wissenschaften und finden in vielen der grossen Disziplinen Anwendung. Folgend ein kleiner Auszug aus den wichtigsten Themen: -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Bit Felder}: Sind die effizienteste Art, etwas darzustellen, dessen Zustand durch mehrere “wahr” oder “falsch” definiert werden kann. Besonders auf Systemen mit begrenzten Ressourcen sollte jede überflüssige Speicher\sphinxhyphen{}Allozierung vermieden werden. - -\sphinxAtStartPar -Beispiel: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{o}{/}\PYG{o}{/} \PYG{n}{primary} \PYG{n}{colors} -\PYG{c+c1}{\PYGZsh{}define BLUE 0b100} -\PYG{c+c1}{\PYGZsh{}define GREEN 0b010} -\PYG{c+c1}{\PYGZsh{}define RED 0b001} - -\PYG{o}{/}\PYG{o}{/} \PYG{n}{mixed} \PYG{n}{colors} -\PYG{c+c1}{\PYGZsh{}define BLACK 0 /* 000 */} -\PYG{c+c1}{\PYGZsh{}define YELLOW (RED | GREEN) /* 011 */} -\PYG{c+c1}{\PYGZsh{}define MAGENTA (RED | BLUE) /* 101 */} -\PYG{c+c1}{\PYGZsh{}define CYAN (GREEN | BLUE) /* 110 */} -\PYG{c+c1}{\PYGZsh{}define WHITE (RED | GREEN | BLUE) /* 111 */} -\end{sphinxVerbatim} - -\end{itemize} - -\sphinxAtStartPar -\sphinxurl{https://de.wikipedia.org/wiki/Bitfeld} -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Kommunikation}: -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Prüfsummen/Paritätsbit}: Übertragungsfehler und Integrität können bis zu einem definiertem Grad erkannt werden. Je nach Komplexität der Berechnung können mehrere Fehler erkannt oder auch korrigiert werden. -\sphinxurl{https://de.wikipedia.org/wiki/Parit\%C3\%A4tsbit}, \sphinxurl{https://de.wikipedia.org/wiki/Pr\%C3\%BCfsumme} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Stoppbit}: Markieren bei asynchronen seriellen Datenübertragungen das Ende bzw. Start eines definierten Blocks. -\sphinxurl{https://de.wikipedia.org/wiki/Stoppbit} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Datenflusssteuerung}: Unterschiedliche Verfahren, mit denen die Datenübertragung von Endgeräten an einem Datennetz, die nicht synchron arbeiten, so gesteuert wird, dass eine möglichst kontinuierliche Datenübermittlung ohne Verluste erfolgen kann. -\sphinxurl{https://de.wikipedia.org/wiki/Datenflusssteuerung} - -\item {} -\sphinxAtStartPar -… - -\end{itemize} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Datenkompression}: Bei der Datenkompression wird versucht, redundante Informationen zu entfernen. Dazu werden die Daten in eine Darstellung überführt, mit der sich alle \textendash{} oder zumindest die meisten \textendash{} Information in kürzerer Form darstellen lassen. -\sphinxurl{https://de.wikipedia.org/wiki/Datenkompression} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Kryptographie}: Konzeption, Definition und Konstruktion von Informationssystemen, die widerstandsfähig gegen Manipulation und unbefugtes Lesen sind. \sphinxurl{https://de.wikipedia.org/wiki/Verschl\%C3\%BCsselung} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Grafik\sphinxhyphen{}Programmierung}: XOR (oder \textasciicircum{}) ist hier besonders interessant, weil eine zweite Eingabe derselben Eingabe die erste rückgängig macht. Ältere GUIs verwendeten dies für die Hervorhebung von Auswahlen und andere Überlagerungen, um kostspielige Neuzeichnungen zu vermeiden. Sie sind immer noch nützlich in langsamen Grafikprotokollen (z. B. Remote\sphinxhyphen{}Desktop). - -\end{itemize} - - -\subsection{1.1 Übungen} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:ubungen}} -\sphinxAtStartPar -\sphinxurl{https://blog.tarkalabs.com/real-world-uses-of-bitwise-operators-c41429df507f} - - -\subsubsection{1. Basis Operationen} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:basis-operationen}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+c1}{\PYGZsh{}include \PYGZlt{}stdlib.h\PYGZgt{}} -\PYG{c+c1}{\PYGZsh{}include \PYGZlt{}stdio.h\PYGZgt{}} - -\PYG{n+nb}{int} \PYG{n}{main}\PYG{p}{(}\PYG{p}{)}\PYG{p}{\PYGZob{}} - \PYG{o}{/}\PYG{o}{/} \PYG{n}{Setting} \PYG{n}{a} \PYG{n}{bit} - \PYG{n}{number} \PYG{o}{|}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{o}{\PYGZlt{}\PYGZlt{}} \PYG{n}{x}\PYG{p}{;} - - \PYG{o}{/}\PYG{o}{/} \PYG{n}{Clearing} \PYG{n}{a} \PYG{n}{bit} - \PYG{n}{number} \PYG{o}{\PYGZam{}}\PYG{o}{=} \PYG{o}{\PYGZti{}}\PYG{p}{(}\PYG{l+m+mi}{1} \PYG{o}{\PYGZlt{}\PYGZlt{}} \PYG{n}{x}\PYG{p}{)}\PYG{p}{;} - - \PYG{o}{/}\PYG{o}{/} \PYG{n}{Toggling} \PYG{n}{a} \PYG{n}{bit} - \PYG{n}{number} \PYG{o}{\PYGZca{}}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{o}{\PYGZlt{}\PYGZlt{}} \PYG{n}{x}\PYG{p}{;} - - \PYG{k}{return} \PYG{n}{EXIT\PYGZus{}SUCCESS}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - - -\subsubsection{2. Variablen tauschen (ohne Dritt\sphinxhyphen{}Variable)} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:variablen-tauschen-ohne-dritt-variable}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdlib.h\PYGZgt{}} -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}} - -\PYG{k+kt}{int} \PYG{n+nf}{main}\PYG{p}{(}\PYG{p}{)}\PYG{p}{\PYGZob{}} - \PYG{k+kt}{int} \PYG{n}{a}\PYG{o}{=}\PYG{l+m+mi}{3}\PYG{p}{,} \PYG{n}{b}\PYG{o}{=}\PYG{l+m+mi}{4}\PYG{p}{;} - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}}\PYG{l+s}{a: \PYGZpc{}d; b: \PYGZpc{}d}\PYG{l+s+se}{\PYGZbs{}n}\PYG{l+s}{\PYGZdq{}}\PYG{p}{)}\PYG{p}{;} - - \PYG{c+cm}{/* a == 0011; b == 0100 */} - \PYG{n}{a} \PYG{o}{\PYGZca{}}\PYG{o}{=} \PYG{n}{b}\PYG{p}{;} \PYG{c+cm}{/* a == 0111; b == 0100 */} - \PYG{n}{b} \PYG{o}{\PYGZca{}}\PYG{o}{=} \PYG{n}{a}\PYG{p}{;} \PYG{c+cm}{/* a == 0111; b == 0011 */} - \PYG{n}{a} \PYG{o}{\PYGZca{}}\PYG{o}{=} \PYG{n}{b}\PYG{p}{;} \PYG{c+cm}{/* a == 0100; b == 0011 */} - - - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}}\PYG{l+s}{a: \PYGZpc{}d; b: \PYGZpc{}d}\PYG{l+s+se}{\PYGZbs{}n}\PYG{l+s}{\PYGZdq{}}\PYG{p}{)}\PYG{p}{;} - \PYG{k}{return} \PYG{n}{EXIT\PYGZus{}SUCCESS}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - - -\subsubsection{3. Lower\sphinxhyphen{} / Uppercase} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:lower-uppercase}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdlib.h\PYGZgt{}} -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}} - -\PYG{k+kt}{int} \PYG{n+nf}{main}\PYG{p}{(}\PYG{p}{)}\PYG{p}{\PYGZob{}} - \PYG{k+kt}{char} \PYG{n}{word}\PYG{p}{[}\PYG{l+m+mi}{8}\PYG{p}{]} \PYG{o}{=} \PYG{l+s}{\PYGZdq{}}\PYG{l+s}{sREedEv}\PYG{l+s}{\PYGZdq{}}\PYG{p}{;} - \PYG{k+kt}{char} \PYG{o}{*}\PYG{n}{wordptr} \PYG{o}{=} \PYG{o}{\PYGZam{}}\PYG{n}{word}\PYG{p}{[}\PYG{l+m+mi}{0}\PYG{p}{]}\PYG{p}{;} - - \PYG{k}{while}\PYG{p}{(}\PYG{n}{wordptr} \PYG{o}{\PYGZlt{}} \PYG{o}{\PYGZam{}}\PYG{n}{word}\PYG{p}{[}\PYG{l+m+mi}{7}\PYG{p}{]}\PYG{p}{)} \PYG{p}{\PYGZob{}} - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}}\PYG{l+s}{UPPERCASE: \PYGZpc{}c}\PYG{l+s+se}{\PYGZbs{}n}\PYG{l+s}{\PYGZdq{}}\PYG{p}{,} \PYG{o}{*}\PYG{n}{wordptr} \PYG{o}{\PYGZam{}} \PYG{l+s+sc}{\PYGZsq{}}\PYG{l+s+sc}{\PYGZus{}}\PYG{l+s+sc}{\PYGZsq{}}\PYG{p}{)}\PYG{p}{;} \PYG{c+c1}{// converts the char into uppercase regardless of the current casing} - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}}\PYG{l+s}{LOWERCASE: \PYGZpc{}c}\PYG{l+s+se}{\PYGZbs{}n}\PYG{l+s}{\PYGZdq{}}\PYG{p}{,} \PYG{o}{*}\PYG{n}{wordptr} \PYG{o}{|} \PYG{l+s+sc}{\PYGZsq{}}\PYG{l+s+sc}{ }\PYG{l+s+sc}{\PYGZsq{}}\PYG{p}{)}\PYG{p}{;} \PYG{c+c1}{// converts the char into lowercase regardless of the current casing} - \PYG{n}{wordptr}\PYG{o}{+}\PYG{o}{+}\PYG{p}{;} - \PYG{p}{\PYGZcb{}} - - \PYG{k}{return} \PYG{n}{EXIT\PYGZus{}SUCCESS}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - - -\subsubsection{4. Prüfen auf 2\sphinxhyphen{}er Potenz} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:prufen-auf-2-er-potenz}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}} -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{include} \PYG{c+cpf}{\PYGZlt{}stdlib.h\PYGZgt{}} - -\PYG{k+kt}{int} \PYG{n+nf}{main}\PYG{p}{(}\PYG{p}{)}\PYG{p}{\PYGZob{}} - \PYG{k+kt}{int} \PYG{n}{a}\PYG{o}{=}\PYG{l+m+mi}{32}\PYG{p}{;} - \PYG{k}{if}\PYG{p}{(}\PYG{n}{a} \PYG{o}{\PYGZgt{}} \PYG{l+m+mi}{0} \PYG{o}{\PYGZam{}}\PYG{o}{\PYGZam{}} \PYG{p}{(}\PYG{n}{a} \PYG{o}{\PYGZam{}} \PYG{p}{(}\PYG{n}{a} \PYG{o}{\PYGZhy{}} \PYG{l+m+mi}{1}\PYG{p}{)}\PYG{p}{)} \PYG{o}{=}\PYG{o}{=} \PYG{l+m+mi}{0}\PYG{p}{)}\PYG{p}{\PYGZob{}} - \PYG{n}{printf}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}}\PYG{l+s}{\PYGZpc{}d is a power of 2}\PYG{l+s}{\PYGZdq{}}\PYG{p}{,} \PYG{n}{a}\PYG{p}{)}\PYG{p}{;} - \PYG{p}{\PYGZcb{}} - \PYG{k}{return} \PYG{n}{EXIT\PYGZus{}SUCCESS}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} -\end{sphinxVerbatim} - - -\section{2. Struct \& typedef} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:struct-typedef}} - -\subsection{2.1 Übungen} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:id1}} - -\subsubsection{1. Bit Operationen Rechner} -\label{\detokenize{P03_Bit_Operation_struct_typedef/README:bit-operationen-rechner}}\begin{itemize} -\item {} -\sphinxAtStartPar -Bitweise Operationen mit 2 Operanden - -\item {} -\sphinxAtStartPar -Rechnung wird als ein String über scanf dem Programm übergeben -\begin{itemize} -\item {} -\sphinxAtStartPar -String wird in Token zerstückelt und in struct gespeichert: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{k}{typedef} \PYG{k}{struct} \PYG{p}{\PYGZob{}} - \PYG{k+kt}{unsigned} \PYG{k+kt}{int} \PYG{n}{operand\PYGZus{}1}\PYG{p}{;} - \PYG{k+kt}{unsigned} \PYG{k+kt}{int} \PYG{n}{operand\PYGZus{}2}\PYG{p}{;} - \PYG{k+kt}{char} \PYG{n}{operation}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} \PYG{n}{Expression}\PYG{p}{;} -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Ausgabe in 3 verschiedenen Formaten: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - \PYG{n+nl}{Bin}\PYG{p}{:} - \PYG{l+m+mo}{0000\PYGZsq{}0000\PYGZsq{}0000\PYGZsq{}0001} -\PYG{o}{\PYGZam{}} \PYG{l+m+mo}{0000\PYGZsq{}0000\PYGZsq{}0000\PYGZsq{}0011} - \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}} - \PYG{l+m+mo}{0000\PYGZsq{}0000\PYGZsq{}0000\PYGZsq{}0001} - - \PYG{n}{Hex} - \PYG{l+m+mh}{0x01} \PYG{o}{\PYGZam{}} \PYG{l+m+mh}{0x03} \PYG{o}{=} \PYG{l+m+mh}{0x01} - - \PYG{n}{Dec} - \PYG{l+m+mi}{1} \PYG{o}{\PYGZam{}} \PYG{l+m+mi}{3} \PYG{o}{=} \PYG{l+m+mi}{1} -\end{sphinxVerbatim} - -\end{itemize} - -\end{itemize} - - -\chapter{04 \sphinxhyphen{} Modularisieren von C Code} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:modularisieren-von-c-code}}\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum wird eine kleine Sammlung von Funktionen als Modul erstellt. - -\sphinxAtStartPar -In der ersten Aufgabe schreiben Sie zu einem bestehenden C Programm die notwendigen Header Files plus passen das Makefile so an, dass die entsprechenden Module mit kompiliert werden. - -\sphinxAtStartPar -In der zweiten Aufgabe erstellen Sie Makefile Regeln um aus Konfigurationsdateien graphischen Darstellungen zu erzeugen. - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:lernziele}} -\sphinxAtStartPar -In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie wissen, dass ein Modul aus einem C\sphinxhyphen{}File und einem passenden H\sphinxhyphen{}File bestehen. - -\item {} -\sphinxAtStartPar -Sie können Header Files korrekt strukturieren. - -\item {} -\sphinxAtStartPar -Sie wissen wie \sphinxstylestrong{Include Guards} anzuwenden sind. - -\item {} -\sphinxAtStartPar -Sie können Module im \sphinxstylestrong{Makefile} zur Kompilation hinzufügen. - -\item {} -\sphinxAtStartPar -Sie können anhand einer Beschreibung Typen und Funktionen in den passenden Header Files deklarieren. - -\item {} -\sphinxAtStartPar -Sie können \sphinxstylestrong{Makefile} Regeln schreiben. - -\end{itemize} - -\sphinxAtStartPar -Die Bewertung dieses Praktikums ist am Ende angegeben. - -\sphinxAtStartPar -Erweitern Sie die vorgegebenen Code Gerüste, welche im \sphinxstylestrong{git} Repository \sphinxstylestrong{snp\sphinxhyphen{}lab\sphinxhyphen{}code} verfügbar sind. - - -\bigskip\hrule\bigskip - - - -\section{3. Aufgabe 1: Modularisieren} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-1-modularisieren}} -\sphinxAtStartPar -\sphinxincludegraphics{{P04_Aufgabenstellung}.png} - - -\subsection{3.1 Teilaufgabe Modules einbinden, Header Files schreiben} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:teilaufgabe-modules-einbinden-header-files-schreiben}}\begin{itemize} -\item {} -\sphinxAtStartPar -src/objects.h -\begin{itemize} -\item {} -\sphinxAtStartPar -2 Datenstukturen definieren - -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{struct point}} mit 2 double für x und y Koordinate - -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{struct line}} mit 2 point - -\end{itemize} - -\item {} -\sphinxAtStartPar -src/functions.h und .c -\begin{itemize} -\item {} -\sphinxAtStartPar -2 Funktionen deklarieren und definieren - -\item {} -\sphinxAtStartPar -Berechnung der Länge \sphinxcode{\sphinxupquote{get\_length}}einer Linie (Annahme: Koordinaten sind alle positiv) -\begin{itemize} -\item {} -\sphinxAtStartPar -l = sqrt(h\textasciicircum{} 2 + b\textasciicircum{} 2) - -\item {} -\sphinxAtStartPar -ev. muss hier in den Anhang \sphinxcode{\sphinxupquote{\#include \textless{}math.h\textgreater{}}} - -\end{itemize} - -\item {} -\sphinxAtStartPar -Berechnung der Steigung \sphinxcode{\sphinxupquote{get\_slope}} der Linie gegenüber dem Koordinatensystem -\begin{itemize} -\item {} -\sphinxAtStartPar -m = h / b - -\end{itemize} - -\end{itemize} - -\item {} -\sphinxAtStartPar -tests vorgeben - -\item {} -\sphinxAtStartPar -src/objects.h -\begin{itemize} -\item {} -\sphinxAtStartPar -Include Guard - -\item {} -\sphinxAtStartPar -Includes - -\item {} -\sphinxAtStartPar -Struct für Punkt und Linie - -\item {} -\sphinxAtStartPar -Include Guard - -\end{itemize} - -\item {} -\sphinxAtStartPar -src/functions.h -\begin{itemize} -\item {} -\sphinxAtStartPar -Include Guard - -\item {} -\sphinxAtStartPar -Includes - -\item {} -\sphinxAtStartPar -Deklarationen der Funktionen für Berechnung der Länge und Steigung - -\item {} -\sphinxAtStartPar -Include Guard - -\end{itemize} - -\item {} -\sphinxAtStartPar -src/functions.c -\begin{itemize} -\item {} -\sphinxAtStartPar -Includes - -\item {} -\sphinxAtStartPar -Definitionen der Funktionen für Berechnung der Länge und Steigung - -\item {} -\sphinxAtStartPar -Include Guard - -\end{itemize} - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{4. Aufgabe 2: Makefile Regeln} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-2-makefile-regeln}} -\sphinxAtStartPar -Makefile ergänzen, damit Modul \sphinxcode{\sphinxupquote{functions}} korrekt eingebunden und kompiliert wird. -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Kompilieren Sie das ganze mittels \sphinxstylestrong{make clean default}. Es sollten keine Compiler Fehler auftreten. - -\end{enumerate} - - -\subsection{4.1 Neue Regeln hinzufügen} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:neue-regeln-hinzufugen}}\begin{itemize} -\item {} -\sphinxAtStartPar -Vorraussetzung: tab2svg.sh aus Praktikum 3 wird um die Möglichkeit erweitert eine Linie zu zeichnen (\sphinxcode{\sphinxupquote{line:x1:y1:x2:y2:color}}) - -\item {} -\sphinxAtStartPar -Studierende erstellen -\begin{itemize} -\item {} -\sphinxAtStartPar -mind. 2 Files \sphinxcode{\sphinxupquote{long.line}} und \sphinxcode{\sphinxupquote{short.line}} mit 2 unterschiedlichen Linien - -\item {} -\sphinxAtStartPar -Makefile Regeln um aus einem File \sphinxcode{\sphinxupquote{.line}} ein File \sphinxcode{\sphinxupquote{.svg}} mit Hilfe des Scripts zu erstellen - -\item {} -\sphinxAtStartPar -PHONY Regel \sphinxcode{\sphinxupquote{display}} um beide \sphinxcode{\sphinxupquote{.svg}} mit Firefox darzustellen -\begin{itemize} -\item {} -\sphinxAtStartPar -Vorgabe: sie sollen eine Variable für die Input\sphinxhyphen{}Dateien nutzen - -\end{itemize} - -\end{itemize} - -\end{itemize} - -\sphinxAtStartPar -Nachdem das Programm in Aufgabe 1 umgesetzt ist, geht es nun darum, im \sphinxstylestrong{Makefile} Regeln zu definieren welche die einzelnen Schritte von den Source Files zu den \sphinxstylestrong{png} Files ausführen. - -\sphinxAtStartPar -Prüfen Sie schliesslich die Umsetzung mittels \sphinxcode{\sphinxupquote{make display}}. - - -\bigskip\hrule\bigskip - - - -\section{5. Aufgabe 3} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:aufgabe-3}}\begin{itemize} -\item {} -\sphinxAtStartPar -Studierende sollen Ausgabe von \sphinxcode{\sphinxupquote{make doc}} analysieren und die Include Diagramme erklären können - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{make} \PYG{n}{doc} -\PYG{n}{firefox} \PYG{n}{doc}\PYG{o}{/}\PYG{n}{index}\PYG{o}{.}\PYG{n}{html} \PYG{o}{\PYGZam{}} -\end{sphinxVerbatim} - - -\bigskip\hrule\bigskip - - - -\section{6. Bewertung} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\bigskip\hrule\bigskip - - - -\section{7. Erweiterung Doxyfile für Abhängigkeitsanalyse} -\label{\detokenize{P04_Modularisieren_von_C_Code/new_P04/P04_Modularisieren_von_C_Code:erweiterung-doxyfile-fur-abhangigkeitsanalyse}} -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}} \PYG{o}{/}\PYG{n}{home}\PYG{o}{/}\PYG{n}{vagrant}\PYG{o}{/}\PYG{n}{huno}\PYG{o}{/}\PYG{n}{snp}\PYG{o}{\PYGZhy{}}\PYG{n}{new}\PYG{o}{/}\PYG{n}{snp}\PYG{o}{/}\PYG{n}{praktika}\PYG{o}{/}\PYG{n}{Shared}\PYG{o}{/}\PYG{n}{work}\PYG{o}{/}\PYG{n}{Doxyfile} \PYG{l+m+mi}{2022}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{02}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{07} \PYG{l+m+mi}{21}\PYG{p}{:}\PYG{l+m+mi}{16}\PYG{p}{:}\PYG{l+m+mf}{42.343302707} \PYG{o}{+}\PYG{l+m+mi}{0100} -\PYG{o}{+}\PYG{o}{+}\PYG{o}{+} \PYG{o}{/}\PYG{n}{home}\PYG{o}{/}\PYG{n}{vagrant}\PYG{o}{/}\PYG{n}{snp}\PYG{o}{/}\PYG{n}{Doxyfile} \PYG{l+m+mi}{2022}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{02}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{07} \PYG{l+m+mi}{22}\PYG{p}{:}\PYG{l+m+mi}{22}\PYG{p}{:}\PYG{l+m+mf}{36.266839126} \PYG{o}{+}\PYG{l+m+mi}{0100} -\PYG{o}{@}\PYG{o}{@} \PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{297}\PYG{p}{,}\PYG{l+m+mi}{14} \PYG{o}{+}\PYG{l+m+mi}{297}\PYG{p}{,}\PYG{l+m+mi}{14} \PYG{o}{@}\PYG{o}{@} - \PYG{n}{UML\PYGZus{}LOOK} \PYG{o}{=} \PYG{n}{NO} - \PYG{n}{UML\PYGZus{}LIMIT\PYGZus{}NUM\PYGZus{}FIELDS} \PYG{o}{=} \PYG{l+m+mi}{10} - \PYG{n}{TEMPLATE\PYGZus{}RELATIONS} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{\PYGZhy{}}\PYG{n}{INCLUDE\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{\PYGZhy{}}\PYG{n}{INCLUDED\PYGZus{}BY\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{+}\PYG{n}{INCLUDE\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{YES} -\PYG{o}{+}\PYG{n}{INCLUDED\PYGZus{}BY\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{YES} - \PYG{n}{CALL\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{NO} - \PYG{n}{CALLER\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{\PYGZhy{}}\PYG{n}{GRAPHICAL\PYGZus{}HIERARCHY} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{\PYGZhy{}}\PYG{n}{DIRECTORY\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{+}\PYG{n}{GRAPHICAL\PYGZus{}HIERARCHY} \PYG{o}{=} \PYG{n}{YES} -\PYG{o}{+}\PYG{n}{DIRECTORY\PYGZus{}GRAPH} \PYG{o}{=} \PYG{n}{YES} - \PYG{n}{DOT\PYGZus{}IMAGE\PYGZus{}FORMAT} \PYG{o}{=} \PYG{n}{png} -\PYG{o}{\PYGZhy{}}\PYG{n}{INTERACTIVE\PYGZus{}SVG} \PYG{o}{=} \PYG{n}{NO} -\PYG{o}{+}\PYG{n}{INTERACTIVE\PYGZus{}SVG} \PYG{o}{=} \PYG{n}{YES} - \PYG{n}{DOT\PYGZus{}PATH} \PYG{o}{=} - \PYG{n}{DOTFILE\PYGZus{}DIRS} \PYG{o}{=} - \PYG{n}{MSCFILE\PYGZus{}DIRS} \PYG{o}{=} -\end{sphinxVerbatim} - - -\chapter{05 \sphinxhyphen{} Arrays/Strings/TicTacToe} -\label{\detokenize{P05_TicTacToe/README:arrays-strings-tictactoe}}\label{\detokenize{P05_TicTacToe/README::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P05_TicTacToe/README:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum werden Sie in der ersten Aufgabe ein Programm zum Einlesen, Sortieren und Ausgeben von Strings von Grund auf entwickeln. - -\sphinxAtStartPar -In der zweiten Aufgabe werden Sie einen Programmrahmen zu einem funktionierenden TicTacToe\sphinxhyphen{}Spiel erweitern. Sie implementieren hierbei die fehlenden Funktionen bis alle Tests erfolgreich durchlaufen. Die gewählte Vorgehensweise entspricht somit Test\sphinxhyphen{}Driven\sphinxhyphen{}Development (TDD). D.h. es existieren zuerst Tests, welche alle fehlschlagen. Schrittweise werden die Funktionen implementiert bis alle Tests erfolgreich durchlaufen. Wenn die Tests erfolgreich durchlaufen, wird auch das Programm funktionieren. - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P05_TicTacToe/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum schreiben Sie selbst von Grund auf ein C\sphinxhyphen{}Programme, das mit Strings operiert. Ferner ergänzen Sie ein bestehendes und lernen dabei den Zugriff auf Arrays. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können mit Arrays von Strings umgehen. - -\item {} -\sphinxAtStartPar -Sie können String\sphinxhyphen{}Funktionen aus der Standard Library verwenden. - -\item {} -\sphinxAtStartPar -Sie können anhand einer Beschreibung im Code die fehlenden Funktionen die auf Arrays zugreifen implementieren. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{3. Aufgabe 1: Sortieren von Strings} -\label{\detokenize{P05_TicTacToe/README:aufgabe-1-sortieren-von-strings}} -\sphinxAtStartPar -Schreiben Sie ein C\sphinxhyphen{}Programm, das bis zu 10 Wörter mit einer maximalen Länge von jeweils 20 char von der Tastatur einliest, diese in Grossbuchstaben umwandelt, in einem Array der Reihe nach ablegt und zum Schluss im Array alphabetisch sortiert und ausgibt. Wiederholt eingegebene Wörter sollen dabei ignoriert werden. Das Ende der Eingabe soll durch das Erreichen der zehn unterschiedlichen Wörter oder durch die Eingabe von „ZZZ“ erfolgen. Die Ausgabe der sortierten Wörter soll direkt nach Beendigung der Eingabe erfolgen. - -\sphinxAtStartPar -Hinweise: -\begin{itemize} -\item {} -\sphinxAtStartPar -Zur Speicherung der Wörter sollten Sie ein zweidimensionales Array verwenden. - -\item {} -\sphinxAtStartPar -Verwenden Sie die String\sphinxhyphen{}Funktionen der C Standard Library (include \textless{}string.h\textgreater{}), z.B. um Strings alphabetisch zu vergleichen. - -\item {} -\sphinxAtStartPar -Wenn Sie aus anderen Vorlesungen bereits einen effizienten Sortieralgorithmus kennen, können Sie diesen natürlich verwenden. Sonst erfinden Sie einfach einen eigenen. - -\item {} -\sphinxAtStartPar -Strukturieren Sie das Programm durch geeignete Funktionen. - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{4. Aufgabe 2: TicTacToe} -\label{\detokenize{P05_TicTacToe/README:aufgabe-2-tictactoe}} -\sphinxAtStartPar -Das zu ergänzende Programm tic\sphinxhyphen{}tac\sphinxhyphen{}toe hat folgende Funktionalität: -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -es stellt ein 3x3 TicTacToe Spielbrett auf dem Terminal dar - -\item {} -\sphinxAtStartPar -es liest von stdin eine Ziffer 0…9 ein, wobei 0 für Programm\sphinxhyphen{}Terminieren, die übrigen Ziffern für die Wahl eines Feldes stehen - -\item {} -\sphinxAtStartPar -der erste Spielzug wird von Spieler A geführt, danach wechselt das Programm zwischen den Spielern A und B - -\item {} -\sphinxAtStartPar -bei Gewinn oder bei vollem Brett ist das Spiel vorbei - -\end{enumerate} - -\sphinxAtStartPar -Erweitern Sie die vorgegebenen Code Gerüste, welche im git Repository snp\sphinxhyphen{}lab\sphinxhyphen{}code verfügbar sind. - -\sphinxAtStartPar -Wenn die Aufgabe erfolgreich umgesetzt ist, können Sie das Spiel ausführen: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -bin/tic\PYGZhy{}tac\PYGZhy{}toe -\end{sphinxVerbatim} - -\sphinxAtStartPar -\sphinxincludegraphics{{TicTacToe}.png} - -\sphinxAtStartPar -Als Abnahme müssen die Tests unverändert ohne Fehler ausgeführt werden (\sphinxcode{\sphinxupquote{make test}}). - -\sphinxAtStartPar -Die Architektur des Programms folgt dem MVC \textendash{} Model\sphinxhyphen{}View\sphinxhyphen{}Control Paradigma. Dieses Paradigma besagt, dass die View (Eingabe und Darstellung) über Control (Vermittler) das Modell (die eigentliche Programm\sphinxhyphen{}Logik) steuert und darstellt. Dabei sind folgende Abhängigkeiten gegeben: - -\sphinxAtStartPar -\sphinxincludegraphics{{MVC_pattern}.png} - - -\bigskip\hrule\bigskip - - - -\subsection{4.1 Teilaufgabe test\_model\_init} -\label{\detokenize{P05_TicTacToe/README:teilaufgabe-test-model-init}} -\sphinxAtStartPar -Das Programm besteht aus folgenden Files: - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Datei -&\sphinxstyletheadfamily -\sphinxAtStartPar -ToDo -\\ -\hline -\sphinxAtStartPar -Makefile -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -tests/tests.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/main.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/view.h -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/view.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/control.h -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/control.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/model.h -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} gegeben, d.h. nichts anzupassen -\\ -\hline -\sphinxAtStartPar -src/model.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} \sphinxstylestrong{anzupassen:} umsetzen gemäss den Angaben unten -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Führen Sie \sphinxcode{\sphinxupquote{make test}} aus - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -Suite: lab \PYG{n+nb}{test} - Test: test\PYGZus{}model\PYGZus{}init ... - init\PYGZus{}model:... \PYG{l+m}{0}/0 FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - Test: test\PYGZus{}model\PYGZus{}get\PYGZus{}state ...FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - Test: test\PYGZus{}model\PYGZus{}get\PYGZus{}winner ...FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - Test: test\PYGZus{}model\PYGZus{}can\PYGZus{}move ...FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - Test: test\PYGZus{}model\PYGZus{}move ...FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - Test: test\PYGZus{}model\PYGZus{}get\PYGZus{}win\PYGZus{}line ...FAILED - \PYG{l+m}{1}. tests/tests.c:62 \PYGZhy{} CU\PYGZus{}ASSERT\PYGZus{}EQUAL\PYGZus{}FATAL\PYG{o}{(}instance\PYGZhy{}\PYGZgt{}board\PYG{o}{[}row\PYG{o}{]}\PYG{o}{[}col\PYG{o}{]},model\PYGZus{}state\PYGZus{}none\PYG{o}{)} - -Run Summary: Type Total Ran Passed Failed Inactive - suites \PYG{l+m}{1} \PYG{l+m}{1} n/a \PYG{l+m}{0} \PYG{l+m}{0} - tests \PYG{l+m}{6} \PYG{l+m}{6} \PYG{l+m}{0} \PYG{l+m}{6} \PYG{l+m}{0} - asserts \PYG{l+m}{6} \PYG{l+m}{6} \PYG{l+m}{0} \PYG{l+m}{6} n/a -\end{sphinxVerbatim} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Konzentrieren Sie sich auf den ersten Test der fehlschlägt. Dies ist ein Unit Test, welcher die Funktion \sphinxstylestrong{model\_init()} prüft. Suchen Sie die Funktion in \sphinxstylestrong{src/model.h} und \sphinxstylestrong{src/model.c}. - -\item {} -\sphinxAtStartPar -Was ist die geforderte Funktionalität und wie ist sie implementiert? - -\end{enumerate} - -\sphinxAtStartPar -Suchen Sie die darin aufgerufene \sphinxstylestrong{model\_init()} Funktion und implementieren Sie diese. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{k+kt}{void} \PYG{n+nf}{model\PYGZus{}init}\PYG{p}{(}\PYG{n}{model\PYGZus{}t} \PYG{o}{*}\PYG{n}{instance}\PYG{p}{)} -\PYG{p}{\PYGZob{}} - \PYG{n}{assert}\PYG{p}{(}\PYG{n}{instance}\PYG{p}{)}\PYG{p}{;} - - \PYG{c+c1}{// Instructions to the students:} - \PYG{c+c1}{// set all fields of the board to model\PYGZus{}state\PYGZus{}none} - \PYG{c+c1}{// BEGIN\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} - - - - \PYG{c+c1}{// END\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} -\PYG{p}{\PYGZcb{}} - -\end{sphinxVerbatim} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Führen Sie \sphinxcode{\sphinxupquote{make test}} und korrigieren Sie obige Funktion, bis der Test nicht mehr fehlschlägt. - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{4.2 Teilaufgabe test\_model\_get\_state und test\_model\_get\_winner} -\label{\detokenize{P05_TicTacToe/README:teilaufgabe-test-model-get-state-und-test-model-get-winner}} -\sphinxAtStartPar -Gehen Sie analog zur ersten Teilaufgabe vor: -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Führen Sie \sphinxcode{\sphinxupquote{make test}} aus. - -\item {} -\sphinxAtStartPar -Suchen Sie die Funktion \sphinxstylestrong{model\_get\_state()} in \sphinxstylestrong{model.h} und \sphinxstylestrong{model.c}. - -\item {} -\sphinxAtStartPar -Implementieren Sie die intern benutzte Funktion \sphinxstylestrong{get\_state()} gemäss der Anleitung im Code. - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{model\PYGZus{}state\PYGZus{}t} \PYG{n+nf}{model\PYGZus{}get\PYGZus{}state}\PYG{p}{(}\PYG{n}{model\PYGZus{}t} \PYG{o}{*}\PYG{n}{instance}\PYG{p}{,} \PYG{n}{model\PYGZus{}pos\PYGZus{}t} \PYG{n}{pos}\PYG{p}{)} -\PYG{p}{\PYGZob{}} - \PYG{n}{assert}\PYG{p}{(}\PYG{n}{instance}\PYG{p}{)}\PYG{p}{;} - \PYG{n}{assert\PYGZus{}pos}\PYG{p}{(}\PYG{n}{pos}\PYG{p}{)}\PYG{p}{;} - - \PYG{c+c1}{// Instructions to the students:} - \PYG{c+c1}{// replace the stub implementation my access to the field at the given position.} - \PYG{c+c1}{// BEGIN\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} - - - \PYG{k}{return} \PYG{n}{model\PYGZus{}state\PYGZus{}none}\PYG{p}{;} \PYG{c+c1}{// stub} - - - \PYG{c+c1}{// END\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} -\PYG{p}{\PYGZcb{}} - - -\end{sphinxVerbatim} - - -\bigskip\hrule\bigskip - - - -\subsection{4.3 Teilaufgabe test\_model\_can\_move} -\label{\detokenize{P05_TicTacToe/README:teilaufgabe-test-model-can-move}} -\sphinxAtStartPar -Gehen Sie analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion \sphinxstylestrong{model\_can\_move()}. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{k+kt}{int} \PYG{n+nf}{model\PYGZus{}can\PYGZus{}move}\PYG{p}{(}\PYG{n}{model\PYGZus{}t} \PYG{o}{*}\PYG{n}{instance}\PYG{p}{)} -\PYG{p}{\PYGZob{}} - \PYG{n}{assert}\PYG{p}{(}\PYG{n}{instance}\PYG{p}{)}\PYG{p}{;} - \PYG{k}{if} \PYG{p}{(}\PYG{n}{model\PYGZus{}get\PYGZus{}winner}\PYG{p}{(}\PYG{n}{instance}\PYG{p}{)} \PYG{o}{=}\PYG{o}{=} \PYG{n}{model\PYGZus{}state\PYGZus{}none}\PYG{p}{)} \PYG{p}{\PYGZob{}} - \PYG{c+c1}{// Instructions to the students:} - \PYG{c+c1}{// scan all fields: return 1 with first field which equals model\PYGZus{}state\PYGZus{}none} - \PYG{c+c1}{// BEGIN\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} - - - - \PYG{c+c1}{// END\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} - \PYG{p}{\PYGZcb{}} - \PYG{k}{return} \PYG{l+m+mi}{0}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} - -\end{sphinxVerbatim} - - -\bigskip\hrule\bigskip - - - -\subsection{4.4 Teilaufgabe test\_model\_move und test\_model\_get\_win\_line} -\label{\detokenize{P05_TicTacToe/README:teilaufgabe-test-model-move-und-test-model-get-win-line}} -\sphinxAtStartPar -Schliesslich gehen Sie auch hier analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion \sphinxstylestrong{set\_state()}. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+cm}{/**} -\PYG{c+cm}{ * @brief Sets the field on the board to the given state.} -\PYG{c+cm}{ * @param instance [INOUT] The instance which holds the state.} -\PYG{c+cm}{ * @param pos [IN] The affected field.} -\PYG{c+cm}{ * @param state [IN] The new state of the field.} -\PYG{c+cm}{ */} -\PYG{k}{static} \PYG{k+kt}{void} \PYG{n}{set\PYGZus{}state}\PYG{p}{(}\PYG{n}{model\PYGZus{}t} \PYG{o}{*}\PYG{n}{instance}\PYG{p}{,} \PYG{n}{model\PYGZus{}pos\PYGZus{}t} \PYG{n}{pos}\PYG{p}{,} \PYG{n}{model\PYGZus{}state\PYGZus{}t} \PYG{n}{state}\PYG{p}{)} -\PYG{p}{\PYGZob{}} - \PYG{n}{assert\PYGZus{}pos}\PYG{p}{(}\PYG{n}{pos}\PYG{p}{)}\PYG{p}{;} - - \PYG{c+c1}{// Instructions to the students:} - \PYG{c+c1}{// set the field of the board to the new state} - \PYG{c+c1}{// BEGIN\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} - - - - - \PYG{c+c1}{// END\PYGZhy{}STUDENTS\PYGZhy{}TO\PYGZhy{}ADD\PYGZhy{}CODE} -\PYG{p}{\PYGZcb{}} - -\end{sphinxVerbatim} - -\sphinxAtStartPar -Wenn die beiden obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch und das Spiel kann gespielt werden. - - -\bigskip\hrule\bigskip - - - -\section{5. Bewertung} -\label{\detokenize{P05_TicTacToe/README:bewertung}} -\sphinxAtStartPar -Der funktionierende Programmcode muss der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Punkte -\\ -\hline -\sphinxAtStartPar -Sortieren von Strings -& -\sphinxAtStartPar -Sie können das funktionierende Programm demonstrieren und erklären. -& -\sphinxAtStartPar -2 -\\ -\hline -\sphinxAtStartPar -TicTacToe -& -\sphinxAtStartPar -Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -TicTacToe -& -\sphinxAtStartPar -Teilaufgabe test\_model\_init -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -TicTacToe -& -\sphinxAtStartPar -Teilaufgabe test\_model\_get\_state und test\_model\_get\_winner -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -TicTacToe -& -\sphinxAtStartPar -Teilaufgabe test\_model\_can\_move -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -TicTacToe -& -\sphinxAtStartPar -Teilaufgabe test\_model\_move und test\_model\_get\_win\_line -& -\sphinxAtStartPar -0.5 -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 14.02.2022 - - -\chapter{06 \sphinxhyphen{} Personen Verwaltung \textendash{} Linked List} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:personen-verwaltung-linked-list}}\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README::doc}} - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -\sphinxincludegraphics{{linked_list}.png} - - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum schreiben Sie eine einfache Personenverwaltung. Dabei werden Sie etliche Elemente von C anwenden: -\begin{itemize} -\item {} -\sphinxAtStartPar -Header Files selber schreiben, inklusive Include Guard - -\item {} -\sphinxAtStartPar -Typen definieren - -\item {} -\sphinxAtStartPar -Funktionen mit \sphinxcode{\sphinxupquote{by value}} und \sphinxcode{\sphinxupquote{by reference}} Parametern deklarieren und definieren - -\item {} -\sphinxAtStartPar -einfache Variablen, Pointer Variablen, struct Variablen und Array Variablen benutzen - -\item {} -\sphinxAtStartPar -Strukturen im Speicher dynamisch allozieren und freigeben - -\item {} -\sphinxAtStartPar -I/O und String Funktionen aus der Standard Library anwenden - -\item {} -\sphinxAtStartPar -Anwender Eingaben verarbeiten - -\item {} -\sphinxAtStartPar -Fehlerbehandlung - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum wenden Sie viele der bisher gelernten C Elemente an. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können anhand dieser Beschreibung ein vollständiges C Programm schreiben. - -\item {} -\sphinxAtStartPar -Sie können Unit Tests schreiben welche die wesentlichen Funktionen des Programms individuell testen. - -\item {} -\end{itemize} - -\sphinxAtStartPar -Die Bewertung dieses Praktikums ist am Ende angegeben. - -\sphinxAtStartPar -Erweitern Sie die vorgegebenen Code Gerüste, welche im \sphinxcode{\sphinxupquote{git}} Repository \sphinxcode{\sphinxupquote{snp\sphinxhyphen{}lab\sphinxhyphen{}code}} verfügbar sind. - - -\bigskip\hrule\bigskip - - - -\section{3. Personenverwaltung} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:personenverwaltung}} - -\bigskip\hrule\bigskip - - - -\subsection{3.1 Programmfunktion} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:programmfunktion}} -\sphinxAtStartPar -Das Programm soll in einer Schleife dem Benutzer jeweils folgende Auswahl bieten, wovon eine Aktion mit Eingabe des entsprechenden Buchstabens ausgelöst wird: - -\sphinxAtStartPar -\sphinxstylestrong{I}(nsert), \sphinxstylestrong{R}(emove), \sphinxstylestrong{S}(how), \sphinxstylestrong{C}(lear), \sphinxstylestrong{E}(nd): -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Insert}: der Benutzer wird aufgefordert, eine Person einzugeben - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Remove}: der Benutzer wird aufgefordert, die Daten einer zu löschenden Person einzu\sphinxhyphen{}geben - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Show}: eine komplette Liste aller gespeicherten Personen wird in alphabetischer Rei\sphinxhyphen{}henfolge ausgegeben - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Clear}: alle Personen werden gelöscht - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{End}: das Programm wird beendet - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\subsection{3.2 Designvorgaben} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:designvorgaben}} -\sphinxAtStartPar -\sphinxstylestrong{Verkettete Liste} -Da zur Kompilierzeit nicht bekannt ist, ob 10 oder 10’000 Personen eingegeben werden, wäre es keine gute Idee, im Programm einen statischen Array mit z.B. 10’000 Personen\sphinxhyphen{}Einträgen zu allozieren. Dies wäre ineffizient und umständlich beim sortierten Einfügen von Personen. In solchen Situationen arbeitet man deshalb mit dynamischen Datenstrukturen, die zur Laufzeit beliebig (solange Speicher vorhanden ist) wachsen und wieder schrumpfen können. Eine sehr populäre dynamische Datenstruktur ist die \sphinxstylestrong{verkettete Liste} und genau die werden wir in diesem Praktikum verwenden. - -\sphinxAtStartPar -\sphinxincludegraphics{{a}.png} - -\sphinxAtStartPar -\sphinxincludegraphics{{b}.png} - -\sphinxAtStartPar -\sphinxincludegraphics{{c}.png} - -\sphinxAtStartPar -\sphinxincludegraphics{{d}.png} -Abbildung 1: Zyklisch verkettete Liste - -\sphinxAtStartPar -Eine verkettete Liste bedeutet, dass ein Knoten der verketten Liste einen Datensatz einer Person speichert und zusätzlich einen Pointer auf den nächsten Knoten in der Liste aufweist (siehe Abbildung 1). In dieser Pointer Variablen (\sphinxcode{\sphinxupquote{next}} in der \sphinxcode{\sphinxupquote{node\_t}} Struktur unten) steht also einfach die Adresse des nächsten Knotens. - -\sphinxAtStartPar -Die leere Liste besteht aus einem einzelnen Element, welches keine spezifische Person abspeichert und welches auf sich selbst zeigt (Abbildung 1 a). Dieses Element ist der Einstiegspunkt der Liste (auch Anker oder Wurzel genannt) und ist das einzige Element, das Sie im Programm direkt kennen und einer Variablen zuweisen. Dieses Element können Sie statisch allozieren (z.B. \sphinxcode{\sphinxupquote{node\_t anchor}};, siehe Details weiter unten), denn es existiert während der gesamten Ausführungszeit. Alle anderen Elemente erreichen Sie ausgehend vom Anker, indem Sie einmal, den Pointern folgend, im Kreis herum gehen. Abbildung 1 b zeigt die Liste nach dem Einfügen der Person \sphinxcode{\sphinxupquote{Max Mueller, 40}} Jahre. Nach dem Einfügen von zwei weiteren Personen sieht die Datenstruktur aus wie in Abbildung 1 c. Das Entfernen der Person \sphinxcode{\sphinxupquote{Arno Bosshard}} führt zu Abbildung 1 d. - -\sphinxAtStartPar -Eine Person kann \sphinxstylestrong{zugefügt} werden, indem dynamisch ein neuer Knoten erzeugt wird und dieser in die verkettete Liste eingefügt wird. Beim Einfügen müssen die Adressen der Knoten so den Pointern zugewiesen werden, dass die Kette intakt bleibt. - -\sphinxAtStartPar -Ein Knoten wird \sphinxstylestrong{entfernt}, indem der entsprechende Knoten aus der Verkettung herausgelöst wird (\sphinxcode{\sphinxupquote{next}} des Vorgängerknotens soll neu auf \sphinxcode{\sphinxupquote{next}} des herauszulösenden Knotens zeigen) und dann der Speicher des entsprechenden Knotens freigegeben wird. - -\sphinxAtStartPar -\sphinxstylestrong{Personen und Knoten Records} - -\sphinxAtStartPar -Die für je eine Person zu speichernden Daten sollen in folgendem C \sphinxcode{\sphinxupquote{struct}} zusammengefasst sein. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+cp}{\PYGZsh{}}\PYG{c+cp}{define NAME\PYGZus{}LEN 20} - -\PYG{k}{typedef} \PYG{k}{struct} \PYG{p}{\PYGZob{}} - \PYG{k+kt}{char} \PYG{n}{name}\PYG{p}{[}\PYG{n}{NAME\PYGZus{}LEN}\PYG{p}{]}\PYG{p}{;} - \PYG{k+kt}{char} \PYG{n}{first\PYGZus{}name}\PYG{p}{[}\PYG{n}{NAME\PYGZus{}LEN}\PYG{p}{]}\PYG{p}{;} - \PYG{k+kt}{unsigned} \PYG{k+kt}{int} \PYG{n}{age}\PYG{p}{;} -\PYG{p}{\PYGZcb{}} \PYG{n}{person\PYGZus{}t}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Jeder Knoten der verketteten Liste soll aus folgendem C \sphinxcode{\sphinxupquote{struct}} bestehen. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{k}{typedef} \PYG{k}{struct} \PYG{n+nc}{node} \PYG{p}{\PYGZob{}} - \PYG{n}{person\PYGZus{}t} \PYG{n}{content}\PYG{p}{;} \PYG{c+c1}{// in diesem Knoten gespeicherte Person} - \PYG{k}{struct} \PYG{n+nc}{node} \PYG{o}{*}\PYG{n}{next}\PYG{p}{;} \PYG{c+c1}{// Pointer auf den nächsten Knoten in der Liste} -\PYG{p}{\PYGZcb{}} \PYG{n}{node\PYGZus{}t}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -\sphinxstylestrong{Vorschlag: zyklisch verkettete Liste} - -\sphinxAtStartPar -Erkennen des Endes der Liste: bei der zyklisch verketteten Liste zeigt das letzte Element wie\sphinxhyphen{}der auf den Anker, die Liste bildet also einen Kreis. Dies ist in Abbildung 1 so abgebildet. - -\sphinxAtStartPar -Alternativ könnte man das Ende erkennbar machen, indem die Kette anstelle von zyklisch, mit einem NULL Pointer endet. - -\sphinxAtStartPar -Die Wahl ist ihnen überlassen ob sie die eine oder andere Art der End\sphinxhyphen{}Erkennung implementieren. In der Beschreibung wird angenommen, dass es sich um eine zyklisch verkettete Liste handelt. - -\sphinxAtStartPar -\sphinxstylestrong{Sortiertes Einfügen} - -\sphinxAtStartPar -Die Personen Records sollen sortiert in die Liste eingefügt werden. Dies bedeutet, dass vom Anker her gesucht werden soll, bis der erste Knoten gefunden wurde dessen Nachfolgeknoten entweder „grösser“ ist als der einzufügende Knoten, oder wo das Ende der Liste erreicht ist. Die Ordnung (grösser, gleich, kleiner) soll so definiert sein: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+c1}{// if (p1 \PYGZgt{} p2) \PYGZob{} ... \PYGZcb{}} -\PYG{k}{if} \PYG{p}{(}\PYG{n}{person\PYGZus{}compare}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n}{p1}\PYG{p}{,} \PYG{o}{\PYGZam{}}\PYG{n}{p2}\PYG{p}{)} \PYG{o}{\PYGZgt{}} \PYG{l+m+mi}{0}\PYG{p}{)} \PYG{p}{\PYGZob{}} \PYG{p}{.}\PYG{p}{.}\PYG{p}{.} \PYG{p}{\PYGZcb{}} -\PYG{c+cm}{/**} -\PYG{c+cm}{ * @brief Compares two persons in this sequence: 1st=name, 2nd=first\PYGZus{}name, 3rd=age} -\PYG{c+cm}{ * @param a [IN] const reference to 1st person in the comparison} -\PYG{c+cm}{ * @param b [IN] const reference to 2nd person in the comparison} -\PYG{c+cm}{ * @return =0 if all record fields are the same} -\PYG{c+cm}{ * \PYGZgt{}0 if all previous fields are the same, but for this field, a is greater} -\PYG{c+cm}{ * \PYGZlt{}0 if all previous fields are the same, but for this field, b is greater} -\PYG{c+cm}{ * @remark strncmp() is used for producing the result of string field comparisons} -\PYG{c+cm}{ * @remark a\PYGZhy{}\PYGZgt{}age \textendash{} b\PYGZhy{}\PYGZgt{}age is used for producing the result of age comparison} -\PYG{c+cm}{ */} -\PYG{k+kt}{int} \PYG{n}{person\PYGZus{}compare}\PYG{p}{(}\PYG{k}{const} \PYG{n}{person\PYGZus{}t} \PYG{o}{*}\PYG{n}{a}\PYG{p}{,} \PYG{k}{const} \PYG{n}{person\PYGZus{}t} \PYG{o}{*}\PYG{n}{b}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -\sphinxstylestrong{Eingabe} - -\sphinxAtStartPar -\sphinxstylestrong{Fehlerhafte Wahl der Operation} in der Hauptschleife soll gemeldet werden, ansonsten aber ignoriert werden. - -\sphinxAtStartPar -\sphinxstylestrong{Fehlerhafte Eingabe der Personenangaben} sollen gemeldet werden und die gesamte Operation (z.B. Insert) verworfen werden. - -\sphinxAtStartPar -Zu prüfende Fehler bei Personeneingaben: -\begin{itemize} -\item {} -\sphinxAtStartPar -für die Namen -\begin{itemize} -\item {} -\sphinxAtStartPar -zu lange Namen - -\end{itemize} - -\item {} -\sphinxAtStartPar -für das Alter -\begin{itemize} -\item {} -\sphinxAtStartPar -keine Zahl - -\end{itemize} - -\item {} -\sphinxAtStartPar -Duplikat -\begin{itemize} -\item {} -\sphinxAtStartPar -derselbe Record soll nicht doppelt in der Liste vorkommen - -\end{itemize} - -\end{itemize} - -\sphinxAtStartPar -Weitergehende Prüfungen sind nicht erwartet. - -\sphinxAtStartPar -\sphinxstylestrong{Zu beachten:} bei fehlerhafter Eingabe darf kein „Memory Leak“ entstehen, d.h. potentiell auf dem Heap allozierter Speicher muss im Fehlerfall freigegeben werden. - - -\bigskip\hrule\bigskip - - - -\subsection{3.3 Bestehender Programmrahmen} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:bestehender-programmrahmen}} -\sphinxAtStartPar -Der Programmrahmen besteht aus den unten aufgelisteten Files. Es sollen weitere Module in \sphinxcode{\sphinxupquote{src}} hinzugefügt werden und die bestehenden Files ergänzt werden gemäss den Aufgaben. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|} -\hline - -\sphinxAtStartPar - -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -Makefile -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} \sphinxstylestrong{zu ergänzen} mit neuen Modulen -\\ -\hline -\sphinxAtStartPar -tests/tests.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} \sphinxstylestrong{zu ergänzen} gemäss Aufgaben (implementieren von Unit Tests) -\\ -\hline -\sphinxAtStartPar -src/main.c -& -\sphinxAtStartPar -\sphinxhyphen{}\textgreater{} \sphinxstylestrong{zu ergänzen} gemäss Aufgaben (Hauptprogramm) -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - - -\section{4. Aufgabe 1: Modularisierung \textendash{} API und Implementation main.c} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:aufgabe-1-modularisierung-api-und-implementation-main-c}} -\sphinxAtStartPar -Kreieren Sie folgende Files in \sphinxcode{\sphinxupquote{src}} und implementieren Sie \sphinxcode{\sphinxupquote{main.c}} basierend auf dem unten von Ihnen gegebenen API. - -\sphinxAtStartPar -\sphinxstylestrong{File person.h} - -\sphinxAtStartPar -Typ Definitionen: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{person\PYGZus{}t}\PYG{p}{.}\PYG{p}{.}\PYG{p}{.} \PYG{c+c1}{// siehe Beschreibung oben} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Funktionsdeklarationen: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{c+c1}{// siehe Beschreibung oben} -\PYG{k+kt}{int} \PYG{n+nf}{person\PYGZus{}compare}\PYG{p}{(}\PYG{k}{const} \PYG{n}{person\PYGZus{}t} \PYG{o}{*}\PYG{n}{a}\PYG{p}{,} \PYG{k}{const} \PYG{n}{person\PYGZus{}t} \PYG{o}{*}\PYG{n}{b}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} -\begin{itemize} -\item {} -\sphinxAtStartPar -gegebenenfalls weitere Funktionen für die Bearbeitung von Personen - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{File list.h} - -\sphinxAtStartPar -Typ Definitionen: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{person\PYGZus{}t}\PYG{p}{.}\PYG{p}{.}\PYG{p}{.} \PYG{c+c1}{// siehe Beschreibung oben} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Funktionsdeklarationen: -\begin{itemize} -\item {} -\sphinxAtStartPar -Funktionen für \sphinxcode{\sphinxupquote{insert}}, \sphinxcode{\sphinxupquote{remove}}, \sphinxcode{\sphinxupquote{clear}} Operationen auf der Liste - -\end{itemize} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Das Hauptprogramm soll die Eingabeschleife implementieren und die obigen Funktionen (wo angebracht) aufrufen. - - -\bigskip\hrule\bigskip - - - -\section{5. Aufgabe 2: Implementierung von person.c und list.c} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:aufgabe-2-implementierung-von-person-c-und-list-c}} -\sphinxAtStartPar -Fügen Sie die beiden Implementationsfiles \sphinxcode{\sphinxupquote{person.c}} und \sphinxcode{\sphinxupquote{list.c}} zu \sphinxcode{\sphinxupquote{src}}. Fügen Sie die beiden Module im \sphinxcode{\sphinxupquote{Makefile}} zu der vorgegebenen Variablen \sphinxcode{\sphinxupquote{MODULES}} hinzu, so dass sie beim \sphinxcode{\sphinxupquote{make}} Aufruf auch berücksichtigt werden. - - -\bigskip\hrule\bigskip - - - -\subsection{5.1 Teilaufgabe: Implementierung von person.c} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:teilaufgabe-implementierung-von-person-c}} -\sphinxAtStartPar -Implementieren Sie die Funktionen aus \sphinxcode{\sphinxupquote{person.h}}. - -\sphinxAtStartPar -Falls nötig, stellen Sie weitere statische Hilfsfunktionen in \sphinxcode{\sphinxupquote{person.c}} zur Verfügung. - - -\bigskip\hrule\bigskip - - - -\subsection{5.2 Teilaufgabe: Implementierung von list.c} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:teilaufgabe-implementierung-von-list-c}} -\sphinxAtStartPar -Implementieren Sie die Funktionen aus \sphinxcode{\sphinxupquote{list.h}}. - -\sphinxAtStartPar -Falls nötig, stellen Sie weitere statische Hilfsfunktionen in \sphinxcode{\sphinxupquote{list.c}} zur Verfügung. - - -\bigskip\hrule\bigskip - - - -\section{6. Aufgabe 3: Unit Tests} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:aufgabe-3-unit-tests}} -\sphinxAtStartPar -Schreiben Sie Unit Tests für mindestens die folgenden Funktionen -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{person.h:}} -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{person\_compare}} - -\end{itemize} - -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{list.h:}} -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{list\_insert}} - -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{list\_remove}} - -\item {} -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{list\_clear}} - -\end{itemize} - -\end{itemize} - -\sphinxAtStartPar -Es existieren in \sphinxcode{\sphinxupquote{tests/tests.c}} schon vier Test Rahmen für diese Test Cases. - -\sphinxAtStartPar -In diese Test Cases sollen die entsprechenden Funktionen unter verschiedenen Bedingungen isoliert aufgerufen werden und deren Verhalten überprüft werden. - -\sphinxAtStartPar -Verwenden Sie für die Überprüfung die CUnit \sphinxcode{\sphinxupquote{CU\_ASSERT\_...}} Makros. - -\sphinxAtStartPar -Siehe dazu auch \sphinxcode{\sphinxupquote{man CUnit}}. - -\sphinxAtStartPar -Wenn die obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch. - - -\bigskip\hrule\bigskip - - - -\section{7. Bewertung} -\label{\detokenize{P06_Personen_Verwaltung_Linked_List/README:bewertung}} - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Punkte -\\ -\hline -\sphinxAtStartPar - -& -\sphinxAtStartPar -Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -1 -& -\sphinxAtStartPar -API von list.h und person.h plus die Implementation von main.c -& -\sphinxAtStartPar -2 -\\ -\hline -\sphinxAtStartPar -2 -& -\sphinxAtStartPar -Teilaufgabe: person.c -& -\sphinxAtStartPar -2 -\\ -\hline -\sphinxAtStartPar -2 -& -\sphinxAtStartPar -Teilaufgabe: list.c -& -\sphinxAtStartPar -2 -\\ -\hline -\sphinxAtStartPar -3 -& -\sphinxAtStartPar -Unit Tests -& -\sphinxAtStartPar -2 -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 11.01.2022 - - -\chapter{07 \sphinxhyphen{} Prozesse und Threads} -\label{\detokenize{P07_Prozesse_und_Threads/README:prozesse-und-threads}}\label{\detokenize{P07_Prozesse_und_Threads/README::doc}} - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -\sphinxincludegraphics{{ein_mann_orchester}.png} - -\sphinxAtStartPar -\sphinxhref{https://www.wikiwand.com/de/Ein-Mann-Orchester}{Quelle: https://www.wikiwand.com/de/Ein\sphinxhyphen{}Mann\sphinxhyphen{}Orchester} - - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P07_Prozesse_und_Threads/README:ubersicht}} -\sphinxAtStartPar -In diesem Praktikum werden wir uns mit Prozessen, Prozesshierarchien und Threads beschäftigen, um ein gutes Grundverständnis dieser Abstraktionen zu erhalten. Sie werden bestehenden Code analysieren und damit experimentieren. D.h. dies ist nicht ein «Codierungs»\sphinxhyphen{}Praktikum, sondern ein «Analyse»\sphinxhyphen{} und «Experimentier»\sphinxhyphen{}Praktikum. - - -\bigskip\hrule\bigskip - - - -\subsection{1.1 Nachweis} -\label{\detokenize{P07_Prozesse_und_Threads/README:nachweis}} -\sphinxAtStartPar -Dieses Praktikum ist eine leicht abgewandelte Variante des ProcThreads Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins\sphinxhyphen{}zu\sphinxhyphen{}ein übernommen. - -\sphinxAtStartPar -Als Autoren des BSY Praktikums sind genannt: M. Thaler, J. Zeman. - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P07_Prozesse_und_Threads/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum werden Sie sich mit Prozessen, Prozesshierarchien und Threads beschäftigen. Sie erhalten einen vertieften Einblick und Verständnis zur Erzeugung, Steuerung und Terminierung von Prozessen unter Unix/Linux und Sie werden die unterschiedlichen Eigenschaften von Prozessen und Threads kennenlernen. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können Prozesse erzeugen und die Prozesshierarchie erklären - -\item {} -\sphinxAtStartPar -Sie wissen was beim Erzeugen eines Prozesses vom Elternprozess vererbt wird - -\item {} -\sphinxAtStartPar -Sie wissen wie man auf die Terminierung von Kindprozessen wartet - -\item {} -\sphinxAtStartPar -Sie kennen die Unterschiede zwischen Prozessen und Threads - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{3. Aufgaben} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgaben}} -\sphinxAtStartPar -Das Betriebssystem bietet Programme um die aktuellen Prozesse und Threads darzustellen. - -\sphinxAtStartPar -Die Werkzeuge kommen mit einer Vielzahl von Optionen für die Auswahl und Darstellung der Daten, z.B. ob nur Prozesse oder auch Threads aufgelistet werden sollen, und ob alle Prozesse oder nur die «eigenen» Prozesse ausgewählt werden sollen, etc. - -\sphinxAtStartPar -Siehe die entsprechenden \sphinxcode{\sphinxupquote{man}} Pages für weitere Details. - -\sphinxAtStartPar -Eine Auswahl, welche unter Umständen für die folgenden Aufgaben nützlich sind: - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|} -\hline - -\sphinxAtStartPar - -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{ps}} -& -\sphinxAtStartPar -Auflisten der Prozess Zustände zum gegebenen Zeitpunkt. -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{pstree}} -& -\sphinxAtStartPar -Darstellung der gesamten Prozesshierarchie. -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{top}} -& -\sphinxAtStartPar -Wie \sphinxcode{\sphinxupquote{ps}}, aber die Darstellung wird in Zeitintervallen aufdatiert. -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{htop}} -& -\sphinxAtStartPar -Wie \sphinxcode{\sphinxupquote{top}}, aber zusätzlich dazu die Auslastung der CPU in einem System mit mehreren CPUs. -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{lscpu}} -& -\sphinxAtStartPar -Auflisten der CPUs. -\\ -\hline -\sphinxAtStartPar -\sphinxcode{\sphinxupquote{cat}}/\sphinxcode{\sphinxupquote{proc}}/\sphinxcode{\sphinxupquote{cpuinfo}} -& -\sphinxAtStartPar -Ähnlich zu \sphinxcode{\sphinxupquote{lscpu}}, aber mit Zusatzinformationen wie enthaltene CPU Bugs (z.B. \sphinxcode{\sphinxupquote{bugs: cpu\_meltdown spectre\_v1 spect\sphinxhyphen{}re\_v2 spec\_store\_bypass l1tf mds swapgs itlb\_multihit}}) -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - - -\subsection{3.1 Aufgabe 1: Prozess mit fork() erzeugen} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-1-prozess-mit-fork-erzeugen}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, wie mit \sphinxcode{\sphinxupquote{fork()}} Prozesse erzeugt werden. - -\item {} -\sphinxAtStartPar -Einfache Prozesshierarchien kennenlernen. - -\item {} -\sphinxAtStartPar -Verstehen, wie ein Programm, das \sphinxcode{\sphinxupquote{fork()}} aufruft, durchlaufen wird. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Studieren Sie zuerst das Programm \sphinxcode{\sphinxupquote{ProcA1.c}} und beschrieben Sie was geschieht. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Notieren Sie sich, was ausgegeben wird. Starten Sie das Programm und vergleichen Sie die Ausgabe mit ihren Notizen? Was ist gleich, was anders und wieso? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.2 Aufgabe 2: Prozess mit fork() und exec(): Programm Image ersetzen} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-2-prozess-mit-fork-und-exec-programm-image-ersetzen}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -An einem Beispiel die Funktion \sphinxcode{\sphinxupquote{execl()}} kennenlernen. - -\item {} -\sphinxAtStartPar -Verstehen, wie nach \sphinxcode{\sphinxupquote{fork()}} ein neues Programm gestartet wird. -\sphinxstylestrong{Aufgaben} - -\end{itemize} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Studieren Sie zuerst die Programme \sphinxcode{\sphinxupquote{ProcA2.c}} und \sphinxcode{\sphinxupquote{ChildProcA2.c}}. - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA2.e}} und vergleichen Sie die Ausgabe mit der Ausgabe unter Aufgabe 1. Diskutieren und erklären Sie was gleich ist und was anders. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Benennen Sie \sphinxcode{\sphinxupquote{ChildProcA2.e}} auf \sphinxcode{\sphinxupquote{ChildProcA2.f}} um (Shell Befehl \sphinxcode{\sphinxupquote{mv}}) und überlegen Sie, was das Programm nun ausgibt. Starten Sie \sphinxcode{\sphinxupquote{ProcA2.e}} und vergleichen Sie Ihre Überlegungen mit der Programmausgabe. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Nennen Sie das Kindprogramm wieder \sphinxcode{\sphinxupquote{ChildProcA2.e}} und geben Sie folgenden Befehl ein: \sphinxcode{\sphinxupquote{chmod \sphinxhyphen{}x ChildProcA2.e}}. Starten Sie wiederum \sphinxcode{\sphinxupquote{ProcA2.e}} und analysieren Sie die Ausgabe von \sphinxcode{\sphinxupquote{perror("...")}}. Wieso verwenden wir \sphinxcode{\sphinxupquote{perror()}}? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.3 Aufgabe 3: Prozesshierarchie analysieren} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-3-prozesshierarchie-analysieren}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, was \sphinxcode{\sphinxupquote{fork()}} wirklich macht. - -\item {} -\sphinxAtStartPar -Verstehen, was Prozesshierarchien sind. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Studieren Sie zuerst Programm \sphinxcode{\sphinxupquote{ProcA3.c}} und zeichnen Sie die entstehende Prozesshierarchie (Baum) von Hand auf. Starten Sie das Programm und verifizieren Sie ob Ihre Prozesshierarchie stimmt. - -\item {} -\sphinxAtStartPar -Mit dem Befehl \sphinxcode{\sphinxupquote{ps f}} oder \sphinxcode{\sphinxupquote{pstree}} können Sie die Prozesshierarchie auf dem Bildschirm ausgeben. Damit die Ausgabe von \sphinxcode{\sphinxupquote{pstree}} übersichtlich ist, müssen Sie in dem Fenster, wo Sie das Programm \sphinxcode{\sphinxupquote{ProcA3.e}} starten, zuerst die PID der Shell erfragen, z.B. über \sphinxcode{\sphinxupquote{echo \$\$}}. Wenn Sie nun den Befehl \sphinxcode{\sphinxupquote{pstree \sphinxhyphen{}n \sphinxhyphen{}p pid\sphinxhyphen{}von\sphinxhyphen{}oben}} eingeben, wird nur die Prozesshierarchie ausgehend von der Bash Shell angezeigt: \sphinxcode{\sphinxupquote{\sphinxhyphen{}n}} sortiert die Prozesse numerisch, \sphinxcode{\sphinxupquote{\sphinxhyphen{}p}} zeigt für jeden Prozess die PID an. - -\end{enumerate} - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} alle erzeugten Prozesse müssen arbeiten (d.h. nicht terminiert sein), damit die Darstellung gelingt. Wie wird das im gegebenen Programm erreicht? - - -\bigskip\hrule\bigskip - - - -\subsection{3.4 Aufgabe 4: Zeitlicher Ablauf von Prozessen} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-4-zeitlicher-ablauf-von-prozessen}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, wie Kind\sphinxhyphen{} und Elternprozesse zeitlich ablaufen. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Studieren Sie Programm \sphinxcode{\sphinxupquote{ProcA4.c.}} Starten Sie nun mehrmals hintereinander das Programm \sphinxcode{\sphinxupquote{ProcA4.e}} und vergleichen Sie die jeweiligen Outputs (leiten Sie dazu auch die Ausgabe auf verschiedene Dateien um). Was schliessen Sie aus dem Resultat? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - -\sphinxAtStartPar -\sphinxstylestrong{Anmerkung:} Der Funktionsaufruf \sphinxcode{\sphinxupquote{selectCPU(0)}} erzwingt die Ausführung des Eltern\sphinxhyphen{} und Kindprozesses auf CPU 0 (siehe Modul \sphinxcode{\sphinxupquote{setCPU.c}}). Die Prozedur \sphinxcode{\sphinxupquote{justWork(HARD\_WORK)}} simuliert CPU\sphinxhyphen{}Load durch den Prozess (siehe Modul \sphinxcode{\sphinxupquote{workerUtils.c}}). - - -\bigskip\hrule\bigskip - - - -\subsection{3.5 Aufgabe 5: Waisenkinder (Orphan Processes)} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-5-waisenkinder-orphan-processes}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, was mit verwaisten Kindern geschieht. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Analysieren Sie Programm \sphinxcode{\sphinxupquote{ProcA5.c}}: was läuft ab und welche Ausgabe erwarten Sie? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA5.e}}: der Elternprozess terminiert: was geschieht mit dem Kind? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Was geschieht, wenn der Kindprozess vor dem Elternprozess terminiert? Ändern Sie dazu im \sphinxcode{\sphinxupquote{sleep()}} Befehl die Zeit von 2 Sekunden auf 12 Sekunden und verfolgen Sie mit top das Verhalten der beiden Prozesse, speziell auch die Spalte S. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.6 Aufgabe 6: Terminierte, halbtote Prozesse (Zombies)} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-6-terminierte-halbtote-prozesse-zombies}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, was ein Zombie ist. - -\item {} -\sphinxAtStartPar -Eine Möglichkeit kennenlernen, um Zombies zu verhindern. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Analysieren Sie das Programm \sphinxcode{\sphinxupquote{ProcA6.c}}. - -\item {} -\sphinxAtStartPar -Starten Sie das Script \sphinxcode{\sphinxupquote{mtop}} bzw. \sphinxcode{\sphinxupquote{mtop aaaa.e}}. Es stellt das Verhalten der Prozesse dynamisch dar. - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} \sphinxcode{\sphinxupquote{\textless{}defunct\textgreater{}}} = Zombie. - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{aaaa.e}} und verfolgen Sie im \sphinxcode{\sphinxupquote{mtop}}\sphinxhyphen{}Fenster was geschieht. Was beachten Sie? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -In gewissen Fällen will man nicht auf die Terminierung eines Kindes mit \sphinxcode{\sphinxupquote{wait()}}, bzw. \sphinxcode{\sphinxupquote{waitpid()}} warten. Überlegen Sie sich, wie Sie in diesem Fall verhindern können, dass ein Kind zum Zombie wird. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.7 Aufgabe 7: Auf Terminieren von Kindprozessen warten} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-7-auf-terminieren-von-kindprozessen-warten}} -\sphinxAtStartPar -\sphinxstylestrong{Vorbemerkung:} Diese Aufgabe verwendet Funktionen welche erst in der Vorlesung über \sphinxstyleemphasis{Inter\sphinxhyphen{}Process\sphinxhyphen{}Communication (IPC)} im Detail behandelt werden. - -\sphinxAtStartPar -Sie können diese Aufgabe bis dann aufsparen oder die verwendeten Funktionen selber via \sphinxcode{\sphinxupquote{man}} Pages im benötigten Umfang kennenlernen: \sphinxcode{\sphinxupquote{man 2 kill}} und \sphinxcode{\sphinxupquote{man 7 signal}}. - -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, wie Informationen zu Kindprozessen abgefragt werden können. - -\item {} -\sphinxAtStartPar -Die Befehle \sphinxcode{\sphinxupquote{wait()}} und \sphinxcode{\sphinxupquote{waitpid()}} verwenden können. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Starten Sie das Programm \sphinxcode{\sphinxupquote{ProcA7.e}} und analysieren Sie wie die Ausgabe im Hauptprogramm zustande kommt und was im Kindprozess \sphinxcode{\sphinxupquote{ChildProcA7.c}} abläuft. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA7.e}} und danach nochmals mit \sphinxcode{\sphinxupquote{1}} als erstem Argument. Dieser Argument Wert bewirkt, dass im Kindprozess ein ”Segmentation Error” erzeugt wird, also eine Speicherzugriffsverletzung. Welches Signal wird durch die Zugriffsverletzung an das Kind geschickt? Diese Information finden Sie im Manual mit \sphinxcode{\sphinxupquote{man 7 signal}}. Schalten Sie nun core dump ein (siehe README) und starten Sie \sphinxcode{\sphinxupquote{ProcA7.e 1}} erneut und analysieren Sie die Ausgabe. - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} ein core Dump ist ein Abbild des Speichers z.B. zum Zeitpunkt, wenn das Programm abstürzt (wie oben mit der Speicher Zugriff Verletzung). Der Dump wird im File \sphinxstylestrong{core} abgelegt und kann mit dem \sphinxstylestrong{gdb} (GNU\sphinxhyphen{}Debugger) gelesen werden (siehe \sphinxcode{\sphinxupquote{README}}). Tippen Sie nach dem Starten des Command Line UI des \sphinxcode{\sphinxupquote{gdb where}} gefolgt von list ein, damit sie den Ort des Absturzes sehen. Mit \sphinxcode{\sphinxupquote{quit}} verlassen Sie \sphinxstylestrong{gdb} wieder. -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Wenn Sie \sphinxcode{\sphinxupquote{ProcA7.e 2}} starten, sendet das Kind das Signal 30 an sich selbst. Was geschieht? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Wenn Sie \sphinxcode{\sphinxupquote{ProcA7.e 3}} starten, sendet ProcA7.e das Signal SIGABRT (abort) an das Kind: was geschieht in diesem Fall? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Mit \sphinxcode{\sphinxupquote{ProcA7.e 4}} wird das Kind gestartet und terminiert nach 5 Sekunden. Analysieren Sie wie in ProcA7.e der Lauf\sphinxhyphen{} bzw. Exit\sphinxhyphen{}Zustand des Kindes abgefragt wird (siehe dazu auch \sphinxcode{\sphinxupquote{man 3 exit}}). - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.8 Aufgabe 8: Kindprozess als Kopie des Elternprozesses} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-8-kindprozess-als-kopie-des-elternprozesses}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Verstehen, wie Prozessräume vererbt werden. - -\item {} -\sphinxAtStartPar -Unterschiede zwischen dem Prozessraum von Eltern und Kindern erfahren. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Analysieren Sie Programm \sphinxcode{\sphinxupquote{ProcA8\_1.c}}: was gibt das Programm aus? -\begin{itemize} -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA8\_1.e }}und überprüfen Sie Ihre Überlegungen. - -\item {} -\sphinxAtStartPar -Waren Ihre Überlegungen richtig? Falls nicht, was könnten Sie falsch überlegt haben? - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Analysieren Sie Programm \sphinxcode{\sphinxupquote{ProcA8\_2.c}}: was gibt das Programm aus? -\begin{itemize} -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA8\_2.e}} und überprüfen Sie Ihre Überlegungen. - -\item {} -\sphinxAtStartPar -Waren Ihre Überlegungen richtig? Falls nicht, was könnten Sie falsch gemacht haben? - -\item {} -\sphinxAtStartPar -Kind und Eltern werden in verschiedener Reihenfolge ausgeführt: ist ein Unterschied ausser der Reihenfolge festzustellen? - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Analysieren Sie Programm \sphinxcode{\sphinxupquote{ProcA8\_3.c}} und Überlegen Sie, was in die Datei \sphinxcode{\sphinxupquote{AnyOutPut.txt}} geschrieben wird, wer schreibt alles in diese Datei (sie wird ja vor \sphinxcode{\sphinxupquote{fork()}} geöffnet) und wieso ist das so? -\begin{itemize} -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA8\_3.e}} und überprüfen Sie Ihre Überlegungen. - -\item {} -\sphinxAtStartPar -Waren Ihre Überlegungen richtig? Falls nicht, wieso nicht? - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsection{3.9 Aufgabe 9: Unterschied von Threads gegenüber Prozessen} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-9-unterschied-von-threads-gegenuber-prozessen}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Den Unterschied zwischen Thread und Prozess kennenlernen. - -\item {} -\sphinxAtStartPar -Problemstellungen um Threads kennenlernen. - -\item {} -\sphinxAtStartPar -Die \sphinxcode{\sphinxupquote{pthread}}\sphinxhyphen{}Implementation kennen lernen. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Studieren Sie Programm \sphinxcode{\sphinxupquote{ProcA9.c}} und überlegen Sie, wie die Programmausgabe aussieht. Vergleichen Sie Ihre Überlegungen mit denjenigen aus Aufgabe 8.2 b) (\sphinxcode{\sphinxupquote{Pro\sphinxhyphen{}cA8\_2.e}}). -\begin{itemize} -\item {} -\sphinxAtStartPar -Starten Sie \sphinxcode{\sphinxupquote{ProcA9.e}} und vergleichen das Resultat mit Ihren Überlegungen. - -\item {} -\sphinxAtStartPar -Was ist anders als bei \sphinxcode{\sphinxupquote{ProcA8\_2.e}}? - -\end{itemize} - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Setzen Sie in der Thread\sphinxhyphen{}Routine vor dem Befehl \sphinxcode{\sphinxupquote{pthread\_exit()}} eine unendliche Schleife ein, z.B. \sphinxcode{\sphinxupquote{while(1) \{ \}}}; . -\begin{itemize} -\item {} -\sphinxAtStartPar -Starten Sie das Programm und beobachten Sie das Verhalten mit \sphinxcode{\sphinxupquote{top}}. Was beobachten Sie und was schliessen Sie daraus? - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} wenn Sie in \sphinxcode{\sphinxupquote{top}} den Buchstaben H eingeben, werden die Threads einzeln dargestellt. - -\item {} -\sphinxAtStartPar -Kommentieren Sie im Hauptprogram die beiden \sphinxcode{\sphinxupquote{pthread\_join()}} Aufrufe aus und starten Sie das Programm. Was geschieht? Erklären Sie das Verhalten. - -\end{itemize} - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - - -\bigskip\hrule\bigskip - - - -\subsection{3.10 Aufgabe 10 (optional):} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-10-optional}} - -\subsubsection{3.10.1 Übersicht} -\label{\detokenize{P07_Prozesse_und_Threads/README:id1}} -\sphinxAtStartPar -Dieser Teil des Praktikums behandelt spezielle Prozesse: die Dämon Prozesse («daemon pro\sphinxhyphen{}cesses»). Es ist gedacht als Zusatz zum Basis Praktikum über Prozesse und Threads. - -\sphinxAtStartPar -Auch dieser Teil ist ein «Analyse»\sphinxhyphen{} und «Experimentier»\sphinxhyphen{}Praktikum. - - -\bigskip\hrule\bigskip - - - -\paragraph{3.10.1.1 Nachweis} -\label{\detokenize{P07_Prozesse_und_Threads/README:id2}} -\sphinxAtStartPar -Dieses Praktikum ist eine leicht abgewandelte Variante des ProcThreads Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins\sphinxhyphen{}zu\sphinxhyphen{}ein übernommen. - -\sphinxAtStartPar -Als Autoren des BSY Praktikums sind genannt: M. Thaler, J. Zeman. - - -\bigskip\hrule\bigskip - - - -\subsubsection{3.10.2 Lernziele} -\label{\detokenize{P07_Prozesse_und_Threads/README:id3}} -\sphinxAtStartPar -In diesem Praktikum werden Sie sich mit Dämon Prozessen beschäftigen. -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie können die Problemstellung der Dämon Prozesse erklären - -\item {} -\sphinxAtStartPar -Sie können einen Dämon Prozess kreieren - -\item {} -\sphinxAtStartPar -Sie können aus dem Dämon Prozess mit der Umgebung kommunizieren - -\item {} -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\subsubsection{3.10.3 Aufgabe: Dämon Prozesse} -\label{\detokenize{P07_Prozesse_und_Threads/README:aufgabe-damon-prozesse}} -\sphinxAtStartPar -\sphinxstylestrong{Ziele} -\begin{itemize} -\item {} -\sphinxAtStartPar -Problemstellungen um Daemons kennenlernen: -\begin{itemize} -\item {} -\sphinxAtStartPar -wie wird ein Prozess zum Daemon? - -\item {} -\sphinxAtStartPar -wie erreicht man, dass nur ein Daemon vom gleichen Typ aktiv ist? - -\item {} -\sphinxAtStartPar -wie teilt sich ein Daemon seiner Umwelt mit? - -\item {} -\sphinxAtStartPar -wo “lebt” ein Daemon? - -\end{itemize} - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Einleitung} - -\sphinxAtStartPar -Für diese Aufgabe haben wir einen Daemon implementiert: \sphinxstylestrong{MrTimeDaemon} gibt auf Anfrage die Systemzeit Ihres Rechners bekannt. Abfragen können Sie diese Zeit mit dem Programm \sphinxcode{\sphinxupquote{WhatsTheTimeMr localhost}}. Die Kommunikation zwischen den beiden Prozessen haben wir mit TCP/IP Sockets implementiert. Weitere Infos zum Daemon finden Sie nach den Aufgaben. - -\sphinxAtStartPar -Im Abschnitt 4 finden Sie Zusatzinformationen über diese Implementation eines Dämon Prozesses plus weiterführende Informationen. - -\sphinxAtStartPar -\sphinxstylestrong{Aufgaben} -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen\sphinxhyphen{}Konsolen). Übersetzen Sie die Programme mit \sphinxcode{\sphinxupquote{make}} und starten Sie das Programm \sphinxstylestrong{PlapperMaul} in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden \sphinxstyleemphasis{Hallo, ich bins…. Pidi} plus seine Prozess\sphinxhyphen{}ID auf den Bildschirm. Mit dem Shell Befehl \sphinxcode{\sphinxupquote{ps}} können Sie Ihre aktiven Prozesse auflisten, auch \sphinxstylestrong{PlapperMaul}. Überlegen Sie sich zuerst, was mit \sphinxstylestrong{PlapperMaul} geschieht, wenn Sie das Fenster schliessen: läuft \sphinxstylestrong{PlapperMaul} weiter? Was geschieht mit \sphinxstylestrong{PlapperMaul} wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Starten Sie nun das Programm bzw. den Daemon \sphinxstylestrong{MrTimeDaemon}. Stellen Sie die gleichen Überlegungen an wie mit \sphinxstylestrong{PlapperMaul} und testen Sie wiederum, ob Ihre Überlegungen stimmen. Ob \sphinxstylestrong{MrTimeDaemon} noch läuft können Sie feststellen, indem Sie die Zeit abfragen oder den Befehl \sphinxcode{\sphinxupquote{ps ajx | grep MrTimeDaemon}} eingeben: was fällt Ihnen am Output auf? Was schliessen Sie aus Ihren Beobachtungen? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxstylestrong{MrTimeDaemon} erneut, was geschieht? - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Stoppen Sie nun \sphinxstylestrong{MrTimeDaemon} mit \sphinxcode{\sphinxupquote{killall MrTimeDaemon}}. - -\item {} -\sphinxAtStartPar -Starten Sie \sphinxstylestrong{MrTimeDaemon} und fragen Sie mit \sphinxcode{\sphinxupquote{WhatsTheTimeMr localhost}} oder mit \sphinxcode{\sphinxupquote{WhatsTheTimeMr 127.0.0.1}} die aktuelle Zeit auf Ihrem Rechner ab. - -\sphinxAtStartPar -\sphinxstylestrong{Optional:} -Fragen Sie die Zeit bei einem Ihrer Kollegen ab. Dazu muss beim Server (dort wo \sphinxstylestrong{MrTimeDaemon} läuft) ev. die Firewall angepasst werden. Folgende Befehle müssen dazu mit \sphinxstylestrong{root\sphinxhyphen{}Privilegien} ausgeführt werden: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -iptables\PYGZhy{}save \PYGZgt{} myTables.txt \PYG{c+c1}{\PYGZsh{} sichert die aktuelle Firewall} -iptables \PYGZhy{}I INPUT \PYG{l+m}{1} \PYGZhy{}p tcp \PYGZhy{}\PYGZhy{}dport \PYG{l+m}{65534} \PYGZhy{}j ACCEPT -iptables \PYGZhy{}I OUTPUT \PYG{l+m}{2} \PYGZhy{}p tcp \PYGZhy{}\PYGZhy{}sport \PYG{l+m}{65534} \PYGZhy{}j ACCEPT -\end{sphinxVerbatim} - -\sphinxAtStartPar -Nun sollten Sie über die IP\sphinxhyphen{}Nummer oder über den Rechner\sphinxhyphen{}Namen auf den \sphinxstylestrong{TimeServer} mit \sphinxcode{\sphinxupquote{WhatsTheTimeMr}} zugreifen können. -Die Firewall können Sie mit folgendem Befehl wiederherstellen: - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -iptables\PYGZhy{}restore myTables.txt -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Studieren Sie \sphinxcode{\sphinxupquote{MrTimeDaemon.c}}, \sphinxcode{\sphinxupquote{Daemonizer.c}} und \sphinxcode{\sphinxupquote{TimeDaemon.c}} und analysieren Sie, wie die Daemonisierung abläuft. Entfernen Sie die Kommentare im Macro \sphinxcode{\sphinxupquote{Out\sphinxhyphen{}PutPIDs}} am Anfang des Moduls \sphinxcode{\sphinxupquote{Daemonizer.c}}. Übersetzen Sie die Programme mit make und starten Sie \sphinxcode{\sphinxupquote{MrTimeDaemon}} erneut. Analysieren Sie die Ausgabe, was fällt Ihnen auf? Notieren Sie alle für die vollständige Daemonisierung notwendigen Schritte. - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\item {} -\sphinxAtStartPar -Setzen Sie beim Aufruf von \sphinxcode{\sphinxupquote{Daemonizer()}} in \sphinxcode{\sphinxupquote{MrTimeDaemon.c}} anstelle von \sphinxcode{\sphinxupquote{lock\sphinxhyphen{}FilePath}} den Null\sphinxhyphen{}Zeiger \sphinxcode{\sphinxupquote{NULL}} ein. Damit wird keine lock\sphinxhyphen{}Datei erzeugt. Übersetzen Sie die Programme und starten Sie erneut \sphinxcode{\sphinxupquote{MrTimedaemon}}. Was geschieht bzw. wie können Sie feststellen, was geschehen ist? - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} lesen Sie das log\sphinxhyphen{}File: \sphinxcode{\sphinxupquote{/tmp/timeDaemon.log.}} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] - -\end{sphinxVerbatim} - -\sphinxAtStartPar -Wenn Sie noch Zeit und Lust haben: messen Sie die Zeit, zwischen Start der Zeitanfrage und Eintreffen der Antwort. Dazu müssen Sie die Datei \sphinxcode{\sphinxupquote{WhatsTheTimeMr.c}} entsprechend anpassen. - -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\subsubsection{3.10.4 Zusatzinformationen} -\label{\detokenize{P07_Prozesse_und_Threads/README:zusatzinformationen}} - -\bigskip\hrule\bigskip - - - -\paragraph{3.10.4.1 Diese Implementation} -\label{\detokenize{P07_Prozesse_und_Threads/README:diese-implementation}} -\sphinxAtStartPar -Dieser Daemon besteht aus den 3 Komponenten. - -\sphinxAtStartPar -\sphinxstylestrong{Hauptprogramm: MrTimeDaemon.c} - -\sphinxAtStartPar -Hier werden die Pfade für die lock\sphinxhyphen{}Datei, die log\sphinxhyphen{}Datei und der ”Aufenthaltsort” des Daemons gesetzt. Die lock\sphinxhyphen{}Datei wird benötigt um sicherzustellen, dass der Daemon nur einmal gestartet werden kann. In die lock\sphinxhyphen{}Datei schreibt der Daemon z.B. seine PID und sperrt sie dann für Schreiben. Wird der Daemon ein zweites Mal gestartet und will seine PID in diese Datei schreiben, erhält er eine Fehlermeldung und terminiert (es soll ja nur ein Daemon arbeiten). Terminiert der Daemon, wird die Datei automatisch freigegeben. Weil Daemonen sämtliche Kontakte mit ihrer Umwelt im Normalfall abbrechen und auch kein Kontrollterminal besitzen, ist es sinnvoll, zumindest die Ausgabe des Daemons in eine log\sphinxhyphen{}Datei umzuleiten. Dazu stehen einige Systemfunktionen für Logging zur Verfügung. Der Einfachheit halber haben wir hier eine normale Datei im Verzeichnis \sphinxcode{\sphinxupquote{/tmp}} gewählt. -\begin{quote} - -\sphinxAtStartPar -\sphinxstylestrong{Anmerkung:} die Wahl des Verzeichnisses \sphinxcode{\sphinxupquote{/tmp}} für die lock\sphinxhyphen{} und log\sphinxhyphen{}Datei ist für den normalen Betrieb problematisch, weil der Inhalt dieses Verzeichnisses jederzeit gelöscht werden kann, bzw. darf. Wir haben dieses Verzeichnis gewählt, weil wir die beiden Dateien nur für die kurze Zeit des Praktikums benötigen. -\end{quote} - -\sphinxAtStartPar -Der Daemon erbt sein Arbeitsverzeichnis vom Elternprozesse, er sollte deshalb in ein festes Verzeichnis des Systems wechseln, um zu verhindern, dass er sich in einem montierten (gemounteten) Verzeichnis aufhält, das dann beim Herunterfahren nicht demontiert werden könnte (wir haben hier wiederum \sphinxcode{\sphinxupquote{/tmp}} gewählt). - -\sphinxAtStartPar -\sphinxstylestrong{Daemonizer: Daemonizer.c} - -\sphinxAtStartPar -Der Daemonizer macht aus dem aktuellen Prozess einen Daemon. Z.B. sollte er Signale (eine Art Softwareinterrupts) ignorieren: wenn Sie die CTRL\sphinxhyphen{}C Taste während dem Ausführen eines Vordergrundprozess drücken, erhält dieser vom Betriebssystem das Signal SIGINT und bricht seine Ausführung ab. Weiter sollte er die Dateierzeugungsmaske auf 0 setzen (Dateizugriffsrechte), damit kann er beim Öffnen von Dateien beliebige Zugriffsrechte verlangen (die Dateierzeugungsmaske erbt er vom Elternprozess). Am Schluss startet der Daemonizer das eigentliche Daemonprogramm: TimeDaemon.e. - -\sphinxAtStartPar -\sphinxstylestrong{Daemonprogramm: TimeDaemon.c} - -\sphinxAtStartPar -Das Daemonprogramm wartet in einer unendlichen Schleife auf Anfragen zur Zeit und schickt die Antwort an den Absender zurück. Die Datenkommunikation ist, wie schon erwähnt, mit Sockets implementiert, auf die wir aber im Rahmen dieses Praktikums nicht weiter eingehen wollen (wir stellen lediglich Hilfsfunktionen zur Verfügung). - - -\bigskip\hrule\bigskip - - - -\paragraph{3.10.4.2 Zusatzinformation zu Dämon Prozessen} -\label{\detokenize{P07_Prozesse_und_Threads/README:zusatzinformation-zu-damon-prozessen}} -\sphinxAtStartPar -Dämonen oder englisch Daemons sind eine spezielle Art von Prozessen, die vollständig unabhängig arbeiten, d.h. ohne direkte Interaktion mit dem Anwender. Dämonen sind Hintergrundprozesse und terminieren i.A. nur, wenn das System heruntergefahren wird oder abstürzt. Dämonen erledigen meist Aufgaben, die periodisch ausgeführt werden müssen, z.B. Überwachung von Systemkomponenten, abfragen, ob neue Mails angekommen sind, etc. - -\sphinxAtStartPar -Ein typisches Beispiel unter Unix ist der Printer Daemon \sphinxcode{\sphinxupquote{lpd}}, der periodisch nachschaut, ob ein Anwender eine Datei zum Ausdrucken hinterlegt hat. Wenn ja, schickt er die Datei auf den Drucker. - -\sphinxAtStartPar -Hier wird eine weitere Eigenschaft von Daemons ersichtlich: meist kann nur ein Dämon pro Aufgabe aktiv sein: stellen Sie sich vor, was passiert, wenn zwei Druckerdämonen gleichzeitig arbeiten. Andererseits muss aber auch dafür gesorgt werden, dass ein Dämon wieder gestartet wird, falls er stirbt. - - -\bigskip\hrule\bigskip - - - -\bigskip\hrule\bigskip - - - -\section{4. Bewertung} -\label{\detokenize{P07_Prozesse_und_Threads/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Punkte -\\ -\hline -\sphinxAtStartPar - -& -\sphinxAtStartPar -Sie können die gestellten Fragen erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -1 -& -\sphinxAtStartPar -Prozess mit \sphinxcode{\sphinxupquote{fork()}} erzeugen -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -2 -& -\sphinxAtStartPar -Prozess mit \sphinxcode{\sphinxupquote{fork()}} und \sphinxcode{\sphinxupquote{exec()}}: Programm Image ersetzen -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -3 -& -\sphinxAtStartPar -Prozesshierarchie analysieren -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -4 -& -\sphinxAtStartPar -Zeitlicher Ablauf von Prozessen -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -5 -& -\sphinxAtStartPar -Waisenkinder (Orphan Processes) -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -6 -& -\sphinxAtStartPar -Terminierte, halbtote Prozesse (Zombies) -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -7 -& -\sphinxAtStartPar -Auf Terminieren von Kindprozessen warten -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -8 -& -\sphinxAtStartPar -Kindprozess als Kopie des Elternprozesses -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -9 -& -\sphinxAtStartPar -Unterschied von Threads gegenüber Prozessen -& -\sphinxAtStartPar -0.5 -\\ -\hline -\sphinxAtStartPar -10 -& -\sphinxAtStartPar -Dämon Prozesse -& -\sphinxAtStartPar -(4) -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 11.01.2022 - - -\chapter{08 \sphinxhyphen{} Synchronisationsprobleme} -\label{\detokenize{P08_Sync/README:synchronisationsprobleme}}\label{\detokenize{P08_Sync/README::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P08_Sync/README:ubersicht}} -\sphinxAtStartPar -\sphinxincludegraphics{{synchronisationsprobleme}.png} - -\sphinxAtStartPar -\sphinxhref{https://commons.wikimedia.org/wiki/File:Velgast-suedbahn.jpg}{Quelle: https://commons.wikimedia.org/wiki/File:Velgast\sphinxhyphen{}suedbahn.jpg} - -\sphinxAtStartPar -In diesem Praktikum lernen sie zuerst am Beispiel eines Kaffee\sphinxhyphen{}Automaten verschiedene grundlegende Synchronisationsprobleme kennen und mit Hilfe von Locks (Mutexes) und Semaphoren lösen: -\begin{itemize} -\item {} -\sphinxAtStartPar -gegenseitiger Ausschluss mit einem Lock - -\item {} -\sphinxAtStartPar -Erzwingen einer einfachen Reihenfolge - -\item {} -\sphinxAtStartPar -Erzwingen einer erweiterten Reihenfolge - -\end{itemize} - -\sphinxAtStartPar -Im zweiten Teil werden sie auf Basis dieser Grundlagen ein komplexeres Synchronisationsproblem bearbeiten, diesmal am Beispiel von Bank Transaktionen. - - -\bigskip\hrule\bigskip - - - -\subsection{1.1 Nachweis} -\label{\detokenize{P08_Sync/README:nachweis}} -\sphinxAtStartPar -Dieses Praktikum ist eine leicht abgewandelte Variante des Sync Praktikum des Moduls BSY, angepasst an die Verhältnisse des SNP Moduls. Die Beispiele und Beschreibungen wurden, wo möglich, eins\sphinxhyphen{}zu\sphinxhyphen{}ein übernommen. - -\sphinxAtStartPar -Als Autor des BSY Praktikums ist genannt: M. Thaler. - - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P08_Sync/README:lernziele}} -\sphinxAtStartPar -In diesem Praktikum werden sie Synchronisationsprobleme lösen -\begin{itemize} -\item {} -\sphinxAtStartPar -Sie wissen wie man systematisch Synchronisationsprobleme analysiert - -\item {} -\sphinxAtStartPar -Sie wissen wann ein potentieller Deadlock entstehen kann - -\item {} -\sphinxAtStartPar -Sie können Mutex mit Threads anwenden - -\item {} -\sphinxAtStartPar -Sie können Semaphoren mit Prozessen anwenden - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{3. Einführung} -\label{\detokenize{P08_Sync/README:einfuhrung}} -\sphinxAtStartPar -Das Lösen von Synchronisationsproblemen ist oft nicht einfach, weil Prozesse bzw. Threads gleichzeitig ablaufen, ihre Aktivitäten jedoch nach Vorgaben koordiniert werden müssen: man verliert schnell den Überblick. Systematisches Vorgehen mit Aufzeichnen der Abläufe und Synchronisationsbedingungen bewährt ich sich in diesem Fall. - - -\bigskip\hrule\bigskip - - - -\subsection{3.1 Wie löst man Synchronisationsprobleme?} -\label{\detokenize{P08_Sync/README:wie-lost-man-synchronisationsprobleme}} -\sphinxAtStartPar -Gehen sie beim Lösen von Synchronisationsproblemen in folgenden Schritten vor: -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 1: Prozesse (Threads) der Problemstellung identifizieren.}\\ -Prozesse sind die Aktivitäten, die gleichzeitig ausgeführt werden. In diesem Sinne sind sie eigenständige Ausführungs\sphinxhyphen{}Einheiten, deren zeitliches Verhalten synchronisiert werden muss. - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 2: Ausführungsschritte der einzelnen Prozesse (Threads) ermitteln.}\\ -Erstellen sie eine Liste mit einer Spalte für jeden Prozess. Notieren sie für jeden Prozess stichwortartig die wesentlichen Aktionen in der gewünschten zeitlichen Reihenfolge. Tragen sie noch keine Synchronisationsoperationen ein, sondern Texte wie warten auf Geld, etc. Übertragen sie anschliessend die Liste in einen Ablaufgraphen (Siehe Beispiel in Abbildung 1). - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 3: Synchronisationsbedingungen ermitteln.}\\ -Eine Synchronisationsbedingung ist eine zeitliche Beziehung (Abhängigkeit) zwischen Aktionen verschiedener Prozesse, die für das korrekte Arbeiten erforderlich ist. Zeichnen sie diese Beziehungen mit Pfeilen in den Ablaufgraphen aus Schritt 2 ein (Siehe Abbildung 1). - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 4: Benötigte Semaphore definieren.}\\ -Für jede Synchronisationsbedingung wird ein eigener Semaphor benötigt. Notieren sie für jeden Semaphor einen Namen und den Wert, mit dem er initialisiert werden muss. - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 5: Prozesse mit Semaphore Operationen ergänzen.}\\ -Erweitern sie nun alle Prozesse aus Schritt 2 mit den notwendigen Semaphore Operati\sphinxhyphen{}onen (Siehe Pseudocode in Abbildung 1). - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Schritt 6: Implementation.}\\ -Implementieren und testen sie das vollständige Programm. - -\end{itemize} - -\sphinxAtStartPar -\sphinxincludegraphics{{coffee_customer}.png} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{coin} \PYG{o}{=} \PYG{n}{sem\PYGZus{}open}\PYG{p}{(}\PYG{p}{.}\PYG{p}{.}\PYG{p}{.}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{)}\PYG{p}{;} -\PYG{n}{coffee} \PYG{o}{=} \PYG{n}{sem\PYGZus{}open}\PYG{p}{(}\PYG{p}{.}\PYG{p}{.}\PYG{p}{.}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Ablaufgraph und Pseudocode für 2 Prozesse und zwei Semaphore\\ -\sphinxincludegraphics{{sequence_graph}.png} - - -\section{4. Der Kaffee\sphinxhyphen{}Automat} -\label{\detokenize{P08_Sync/README:der-kaffee-automat}} -\sphinxAtStartPar -Als Beispiel verwenden wir einen Automaten, der Kaffee verkauft. Der Kunde muss zum Kauf eines Kaffees zuerst eine bzw. mehrere Münzen einwerfen und anschliessend den gewünsch\sphinxhyphen{}ten Kaffee wählen. Der Automat gibt dann das entsprechende Getränk aus. - -\sphinxAtStartPar -Im ersten Beispiel werden der Automat und die Kunden mit Threads modelliert und tauschen Daten über gemeinsame Speichervariablen aus. Im zweiten und dritten Beispiel werden der Automat und die Kunden mit Prozessen modelliert, dabei wird der Ablauf mit Hilfe von Sema\sphinxhyphen{}phoren gesteuert bzw. erzwungen. - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} die Programme zu den folgenden Aufgaben können alle mit \sphinxstylestrong{startApp.e} gestartet werden. Dieses Programm startet und stoppt Threads und Prozesse, alloziert und dealloziert die Ressourcen (Mutexes, Semaphore). - - -\bigskip\hrule\bigskip - - - -\subsection{4.1 Aufgabe: Mutual Exclusion} -\label{\detokenize{P08_Sync/README:aufgabe-mutual-exclusion}} -\sphinxAtStartPar -Greifen mehrere Threads (oder Prozesse) auf gemeinsame Daten zu, können sogenannte Race Conditions entstehen. Das Resultat ist in diesem Fall abhängig von der Reihenfolge, in der die Threads (Prozesse) ausgeführt werden. - -\sphinxAtStartPar -Im vorliegenden Beispiel wirft der Kunde eine 1 Euro Münze ein und drückt anschliessend auf eine von zwei Kaffeewahltasten. Dabei wird die Anzahl Münzen (\sphinxstyleemphasis{coinCount}) und die gewählte Kaffeesorte (\sphinxstyleemphasis{selCount1}, \sphinxstyleemphasis{selCount2}) inkrementiert. Diese Variablen sind in der Datenstruktur \sphinxstyleemphasis{cData} abgelegt, auf die gemeinsam Kaffee\sphinxhyphen{}Automat und Kunden zugreifen können. Der Auto\sphinxhyphen{}mat überprüft, ob die Anzahl Münzen und die Anzahl der Kaffeewahlen gleich gross sind, falls nicht, wird eine Fehlermeldung ausgegeben und alle Zähler auf \sphinxstyleemphasis{Null} gesetzt. - - -\subsubsection{Aufgaben} -\label{\detokenize{P08_Sync/README:aufgaben}}\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Übersetzen sie die Programme im Verzeichnis \sphinxstyleemphasis{mutex} mit \sphinxstyleemphasis{make} und starten sie den Kaffee\sphinxhyphen{}Automaten mit \sphinxstylestrong{startApp.e} mehrmals hintereinander. -Analysieren sie die Datenwerte in den Fehlermeldungen, beschreiben sie was die Gründe dafür sind bzw. sein können. - -\item {} -\sphinxAtStartPar -Schützen sie nun den Zugriff auf die gemeinsamen Daten mit einem Mutex so, dass alle Threads eine konsistente Sicht der Daten haben. -Wir haben für sie einen Mutex vorbereitet: die Datenstruktur \sphinxstyleemphasis{cData} enthält die Mutex\sphinxhyphen{}Variable \sphinxstyleemphasis{mutex}, die in \sphinxstylestrong{startApp.c} initialisiert wird. Die Funktionen für das Schliessen und das Öffnen des Mutex (Locks) aus der \sphinxstyleemphasis{pthread} Bibliothek sind: - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{pthread} \PYG{n}{mutex} \PYG{n}{lock}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{p}{(}\PYG{n}{cD}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{n}{lock}\PYG{p}{)}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} -\begin{itemize} -\item {} -\sphinxAtStartPar -und - -\end{itemize} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{pthread} \PYG{n}{mutex} \PYG{n}{unlock}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{p}{(}\PYG{n}{cD}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{n}{lock}\PYG{p}{)}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Überprüfen sie, ob der Kaffee\sphinxhyphen{}Automat nun keine Fehlermeldungen mehr ausgibt. Erhö\sphinxhyphen{}hen sie dazu auch die Anzahl Kunden \sphinxstyleemphasis{CUSTOMERS} in \sphinxstylestrong{commonDefs.h}, z.B. auf 10. -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Im Thread des Kaffee\sphinxhyphen{}Automaten wird an verschiedenen Orten mehrmals auf die gemeinsamen Daten in \sphinxstyleemphasis{cD} zugegriffen. Wenn sie die gemeinsamen Daten in lokale Variablen kopieren und dann nur noch auf diese lokalen Variablen zugreifen würden, könn\sphinxhyphen{}ten sie dann auf die Synchronisation mit dem Mutex verzichten? - -\item {} -\sphinxAtStartPar -Wie oft kann ein einzelner Kunde einen Kaffee beziehen, bis der nächste Kunde an die Reihe kommt? Hier reicht eine qualitative Aussage. - -\end{enumerate} - - -\subsection{4.2 Aufgabe: Einfache Reihenfolge} -\label{\detokenize{P08_Sync/README:aufgabe-einfache-reihenfolge}} -\sphinxAtStartPar -Wie sie im ersten Beispiel festgestellt haben, verhindert ein Mutex zwar, dass Race Conditions auftreten, die Verarbeitungsreihenfolge der Threads lässt sich jedoch nicht beeinflussen und ist zufällig. -Im Folgenden soll eine erzwungene Verarbeitungsreihenfolge implementiert werden: -\begin{itemize} -\item {} -\sphinxAtStartPar -Ein Kunde benutzt den Automat für einen Kaffeekauf exklusiv, d.h. alle Schritte des Kunden werden innerhalb eines Mutexes ausgeführt. Ist ein Kunde an der Reihe, wartet er bis der Automat bereit ist, wirft eine Münze ein, wartet auf den Kaffee und gibt anschlies\sphinxhyphen{}send den Automaten für den nächsten Kunden frei. - -\item {} -\sphinxAtStartPar -Der Automat meldet zuerst in einer Endlos\sphinxhyphen{}Schleife, dass er für die Geld\sphinxhyphen{}Eingabe bereit ist, wartet dann auf die Eingabe einer Münze, gibt den Kaffee aus und meldet anschliessend wieder, wenn er bereit ist, etc. - -\end{itemize} - -\sphinxAtStartPar -Für die Lösung dieses Problems benötigen wir Semaphore, die, im Gegensatz zu Mutexes, auch in verschiedenen Prozessen gesetzt bzw. zurückgesetzt werden dürfen. Den Kaffee\sphinxhyphen{}Automat und die Kunden implementieren wir mit Prozessen. sie finden die entsprechenden Prozesse im Verzeichnis \sphinxstylestrong{basicSequence}. - - -\subsubsection{Aufgaben} -\label{\detokenize{P08_Sync/README:id1}}\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Beschreiben sie den Kaffee\sphinxhyphen{}Automaten mit Hilfe der 6 Schritte aus Abschnitt 3 auf Papier, dokumentieren sie dabei alle Schritte schriftlich. - -\item {} -\sphinxAtStartPar -Implementieren sie nun den Kaffee\sphinxhyphen{}Automaten. Ergänzen sie dazu den \sphinxstyleemphasis{coffeeTeller} und den \sphinxstyleemphasis{customer} Prozess so mit vier Semaphoren, dass die vorgegebenen Ablaufbedingungen eingehalten werden. Mit welchen Werten müssen die Semaphore initialisiert werden? -Wir haben für sie vier Semaphore vorbereitet: Achtung, sie sind aber noch auskommentiert (siehe commonDefs.h und startApp.c. Die benötigten Semaphor\sphinxhyphen{}Funktionen aus der POSIX Bibliothek sind: - -\end{enumerate} - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{sem\PYGZus{}wait}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n}{semaphor}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -und - -\begin{sphinxVerbatim}[commandchars=\\\{\}] -\PYG{n}{sem\PYGZus{}post}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n}{semaphor}\PYG{p}{)}\PYG{p}{;} -\end{sphinxVerbatim} - -\sphinxAtStartPar -Analysieren sie die Ausgabe der Prozesse (mehrmals starten). Was fällt auf? -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Gibt Ihr Programm den Output in der korrekten Reihenfolge aus? Falls nicht, wie könnte das gelöst werden? - -\end{enumerate} - - -\subsection{4.3 Aufgabe: Erweiterte Reihenfolge} -\label{\detokenize{P08_Sync/README:aufgabe-erweiterte-reihenfolge}} -\sphinxAtStartPar -Die Preise steigen dauernd … auch der Kaffee wird immer teurer, er kostet nun 3 Euro. Da der Automat nur 1 Euro Stücke annehmen kann, muss der Kunde 3 Münzen einwerfen. Erweitern sie die Prozesse aus Aufgabe 4.2 so, dass eine vordefinierte Anzahl Münzen eingegeben werden muss (die Anzahl Münzen ist in \sphinxstyleemphasis{commonDefs.h} als \sphinxstyleemphasis{NUM\_COINS} definiert). Verwenden sie keine zusätzlichen Semaphore, sondern nutzen sie, dass wir Counting Semaphore verwenden. Die vordefinierten Prozesse finden sie im Verzeichnis \sphinxstyleemphasis{advancedSequence}. - - -\subsubsection{Aufgabe} -\label{\detokenize{P08_Sync/README:aufgabe}}\begin{itemize} -\item {} -\sphinxAtStartPar -Passen sie den coffeeTeller und den customer Prozess so an, dass der Kunde mehrere Münzen einwerfen muss, bis der Automat einen Kaffee ausgeben kann. - -\end{itemize} - -\sphinxAtStartPar -\sphinxstylestrong{Hinweis:} POSIX Semaphore sind Counting Semaphore, können aber nicht auf vordefinierte Werte gesetzt werden (ausser bei der Initialisierung). Abhilfe schafft hier das mehrmalige Aufrufen von \sphinxstyleemphasis{sem\_post()}, z.B. in einer for\sphinxhyphen{}Schleife. - - -\subsection{4.4 Zusammenfassung} -\label{\detokenize{P08_Sync/README:zusammenfassung}} -\sphinxAtStartPar -Wir haben drei grundlegenden Typen von Synchronisationsproblemen kennen gelernt: -\begin{itemize} -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Mutex} nur ein Prozess bzw. Thread kann gleichzeitig auf gemeinsame Daten zugreifen. -\begin{itemize} -\item {} -\sphinxAtStartPar -Beispiel: entweder liest der Kaffee\sphinxhyphen{}Automat die Daten oder ein Kunde verändert sie. - -\end{itemize} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Einfache Reihenfolge} ein Prozess wartet auf die Freigabe durch einen anderen Prozess. -\begin{itemize} -\item {} -\sphinxAtStartPar -Beispiel: der Kaffee\sphinxhyphen{}Automat wartet auf die Eingabe einer Münze. - -\end{itemize} - -\item {} -\sphinxAtStartPar -\sphinxstylestrong{Erweiterte Reihenfolge} ein Prozess wartet auf mehrere Freigaben durch einen anderen Pro\sphinxhyphen{}zess. -\begin{itemize} -\item {} -\sphinxAtStartPar -Beispiel: der Kaffee\sphinxhyphen{}Automat wartet auf die Eingabe von drei Münzen. - -\end{itemize} - -\end{itemize} - - -\bigskip\hrule\bigskip - - - -\section{5. International Banking} -\label{\detokenize{P08_Sync/README:international-banking}} -\sphinxAtStartPar -Die International Bank of Transfer (IBT) besitzt in 128 Ländern Filialen und stellt für 2048 spezielle Handels\sphinxhyphen{}Kunden in jeder Filiale ein Konto zur Verfügung. Gelder dieser Kunden werden dauernd zwischen den Filialen hin und her transferiert, dazu beschäftigt die Bank sogenannte Pusher. Pusher heben Geldbeträge von Konten in einer Filiale ab und buchen sie auf den entsprechenden Konten in irgendeiner (auch in der eigenen) Filiale wieder ein. Die Beträge liegen zwischen 1000 und 100’000 Dollar und werden zufällig ausgewählt, die Wahl der beiden Filialen ist ebenfalls zufällig. - - -\subsection{5.1 Implementation} -\label{\detokenize{P08_Sync/README:implementation}} -\sphinxAtStartPar -Im Folgenden arbeiten wir mit einer \sphinxstyleemphasis{pthread}\sphinxhyphen{}basierten Implementation der IBT, die Pusher werden dabei mit Threads implementiert. Die Filialen der Bank sind als Array von Strukturen implementiert, wobei pro Filiale ein Lock (\sphinxstyleemphasis{branchLock}) und ein Array von Konten (Accounts) definiert ist. Die Konten sind wiederum Strukturen mit dem Kontostand (\sphinxstyleemphasis{account}) und dem Lock (\sphinxstyleemphasis{acntLock}), siehe dazu auch den Source Code. Die Zugriffe auf die Gelder sind imple\sphinxhyphen{}mentiert (Funktionen \sphinxstyleemphasis{withdraw()}, \sphinxstyleemphasis{deposit()}, \sphinxstyleemphasis{transfer()}), aber nicht synchronisiert. -\sphinxstylestrong{Hinweis:} es ist von Vorteil hier mit mehreren CPUs zu arbeiten. Falls sie eine VM verwenden, setzen sie die Anzahl CPUs auf das Maximum. - - -\subsection{5.2 Aufgabe: Konto Synchronisation} -\label{\detokenize{P08_Sync/README:aufgabe-konto-synchronisation}}\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Wechseln sie ins Verzeichnis \sphinxstylestrong{banking/a1}, übersetzen sie das Programm und starten sie es mit dem Skript \sphinxcode{\sphinxupquote{./startApp}}. Analysieren und erklären sie die Resultate. Notie\sphinxhyphen{}ren sie sich zudem die Laufzeiten für 1, 2 und 4 Threads. - -\item {} -\sphinxAtStartPar -Synchronisieren sie die Kontenzugriffe so, dass möglichst viele Zugriffe gleichzeitig ausgeführt werden können und die Zugriffe atomar sind. Sie dürfen nur eines der beiden Locks \sphinxstyleemphasis{branchLock} bzw. \sphinxstyleemphasis{acntLock} verwenden: welches wählen sie und wieso? Be\sphinxhyphen{}gründen sie ihre Antwort und testen sie ihre Lösung. - -\end{enumerate} - - -\subsection{5.3 Aufgabe: Filialen Zugriff in Critical Section} -\label{\detokenize{P08_Sync/README:aufgabe-filialen-zugriff-in-critical-section}} -\sphinxAtStartPar -Ihr Chef meint, dass es wohl aus Sicherheitsgründen besser wäre, sowohl die Filialen und die jeweiligen Kontenzugriffen zu ”locken”. -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Wechseln sie ins Verzeichnis banking/a2 und kopieren sie banking.c aus Aufgabe 5.2. Implementieren sie diese zusätzlichen Anforderungen. Analysieren sie die Resultate. Was stellen sie fest im Vergleich mit den Resultaten aus der Aufgabe 5.2? Was raten sie ihrem Chef? - -\item {} -\sphinxAtStartPar -Ein Kollege meint, es wäre effizienter beim Abheben des Betrags zuerst das Konto zu locken und dann die Filiale, hingegen beim Einbuchen zuerst die die Filiale und dann das Konto. Was für eine Antwort geben sie ihrem Kollegen?\sphinxstylestrong{Hinweis:} falls sie nicht sicher sind: probieren sie es aus. - -\end{enumerate} - - -\subsection{5.4 Aufgabe: Refactoring der Synchronisation} -\label{\detokenize{P08_Sync/README:aufgabe-refactoring-der-synchronisation}} -\sphinxAtStartPar -Das International Banking Committe (IBC) erlässt neue Richtlinien, die unter anderem fordern, dass die Gesamtbilanz einer Bank über sämtliche Filialen zu jeder Zeit konsistent sein muss. -\begin{enumerate} -\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% -\item {} -\sphinxAtStartPar -Erklären sie wieso die Implementationen aus Aufgabe 5.2 und 5.3 diese Anforderungen nicht erfüllen. - -\item {} -\sphinxAtStartPar -Ihr Entwicklungsteam kommt zum Schluss, dass den Pushern neu nur noch eine Funktion \sphinxstyleemphasis{transfer()} für die Überweisung von Beträgen zwischen den Filialen und Konten zur Verfügung gestellt werden darf. -Welche Locks bzw. welches Lock muss verwendet werden, damit die Forderung des IBC erfüllt werden kann? Wechseln sie ins Verzeichnis \sphinxstyleemphasis{banking/a3} und ergänzen sie die Funktion \sphinxstyleemphasis{transfer()} in banking.c um die entsprechenden Lock\sphinxhyphen{}Funktionen. -Wichtiger -\sphinxstylestrong{Hinweis:} es darf kein neues Lock eingeführt werden und die Gesamtbilanz über sämtliche Filialen muss jederzeit konsistent sein. - -\item {} -\sphinxAtStartPar -Testen und analysieren sie das Programm und vergleichen sie die Resultate (Funktionalität, Laufzeit) mit den Lösungen aus Aufgabe 5.2 und 5.3. Notieren sie sich, was ihnen bei dieser Aufgabe wichtig erscheint. - -\item {} -\end{enumerate} - - -\bigskip\hrule\bigskip - - - -\section{6. Bewertung} -\label{\detokenize{P08_Sync/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Gewicht -\\ -\hline -\sphinxAtStartPar - -& -\sphinxAtStartPar -Sie können die gestellten Fragen erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -4 -& -\sphinxAtStartPar -4.1 Aufgabe: Mutual Exclusion4.2 Aufgabe: Einfache Reihenfolge4.3 Aufgabe: Erweiterte Reihenfolge -& -\sphinxAtStartPar -4 -\\ -\hline -\sphinxAtStartPar -5 -& -\sphinxAtStartPar -5.2 Aufgabe: Konto Synchronisation5.3 Aufgabe: Filialen Zugriff in Critical Section5.4 Aufgabe: Refactoring der Synchronisation -& -\sphinxAtStartPar -4 -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 18.08.2021 - - -\chapter{09 \sphinxhyphen{} File Operations} -\label{\detokenize{P09_File_Operations/README:file-operations}}\label{\detokenize{P09_File_Operations/README::doc}} - -\bigskip\hrule\bigskip - - - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P09_File_Operations/README:ubersicht}} - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P09_File_Operations/README:lernziele}} - -\bigskip\hrule\bigskip - - - -\section{3. Aufgabe 1:} -\label{\detokenize{P09_File_Operations/README:aufgabe-1}} - -\bigskip\hrule\bigskip - - - -\section{4. Bewertung} -\label{\detokenize{P09_File_Operations/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Punkte -\\ -\hline -\sphinxAtStartPar - -& -\sphinxAtStartPar -Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -1 -& -\sphinxAtStartPar -\sphinxhyphen{} -& -\sphinxAtStartPar -\sphinxhyphen{} -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 16.02.2022 - - -\chapter{10 \sphinxhyphen{} IPC} -\label{\detokenize{P10_IPC/README:ipc}}\label{\detokenize{P10_IPC/README::doc}} - -\bigskip\hrule\bigskip - - - -\section{1. Übersicht} -\label{\detokenize{P10_IPC/README:ubersicht}} - -\bigskip\hrule\bigskip - - - -\section{2. Lernziele} -\label{\detokenize{P10_IPC/README:lernziele}} - -\bigskip\hrule\bigskip - - - -\section{3. Aufgabe 1:} -\label{\detokenize{P10_IPC/README:aufgabe-1}} - -\bigskip\hrule\bigskip - - - -\section{4. Bewertung} -\label{\detokenize{P10_IPC/README:bewertung}} -\sphinxAtStartPar -Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. - - -\begin{savenotes}\sphinxattablestart -\centering -\begin{tabulary}{\linewidth}[t]{|T|T|T|} -\hline -\sphinxstyletheadfamily -\sphinxAtStartPar -Aufgabe -&\sphinxstyletheadfamily -\sphinxAtStartPar -Kriterium -&\sphinxstyletheadfamily -\sphinxAtStartPar -Punkte -\\ -\hline -\sphinxAtStartPar - -& -\sphinxAtStartPar -Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. -& -\sphinxAtStartPar - -\\ -\hline -\sphinxAtStartPar -1 -& -\sphinxAtStartPar -\sphinxhyphen{} -& -\sphinxAtStartPar -\sphinxhyphen{} -\\ -\hline -\end{tabulary} -\par -\sphinxattableend\end{savenotes} - - -\bigskip\hrule\bigskip - - -\sphinxAtStartPar -Version: 16.02.2022 - - - -\renewcommand{\indexname}{Index} -\printindex -\end{document} \ No newline at end of file diff --git a/main.toc b/main.toc deleted file mode 100644 index 3ebe31f..0000000 --- a/main.toc +++ /dev/null @@ -1,122 +0,0 @@ -\babel@toc {english}{}\relax -\contentsline {chapter}{Table of contents}{i}{chapter*.1}% -\contentsline {chapter}{\numberline {1}01 \sphinxhyphen {} Erste Schritte mit C}{1}{chapter.1}% -\contentsline {section}{\numberline {1.1}1. Übersicht}{1}{section.1.1}% -\contentsline {section}{\numberline {1.2}2. Lernziele}{1}{section.1.2}% -\contentsline {section}{\numberline {1.3}3. Aufgabe 1: virtuelle Maschine}{1}{section.1.3}% -\contentsline {section}{\numberline {1.4}4. Aufgabe 2: Hello World}{2}{section.1.4}% -\contentsline {section}{\numberline {1.5}5. Aufgabe 3: Tabellenausgabe}{2}{section.1.5}% -\contentsline {section}{\numberline {1.6}6. Aufgabe 4: Zeichen und Wörter zählen}{3}{section.1.6}% -\contentsline {section}{\numberline {1.7}7. Bewertung}{3}{section.1.7}% -\contentsline {chapter}{\numberline {2}02: Funktionen, Datentyp “enum”}{4}{chapter.2}% -\contentsline {section}{\numberline {2.1}1. Übersicht}{4}{section.2.1}% -\contentsline {section}{\numberline {2.2}2. Lernziele}{5}{section.2.2}% -\contentsline {section}{\numberline {2.3}3. Aufgaben}{5}{section.2.3}% -\contentsline {subsection}{\numberline {2.3.1}3.1 Aufgabe 1 Tage pro Monat}{6}{subsection.2.3.1}% -\contentsline {subsection}{\numberline {2.3.2}3.2 Aufgabe 2 Bestimmen des Wochentags}{7}{subsection.2.3.2}% -\contentsline {subsubsection}{\numberline {2.3.2.1}3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen}{7}{subsubsection.2.3.2.1}% -\contentsline {paragraph}{3.2.1.1 Argument Format}{7}{paragraph*.3}% -\contentsline {paragraph}{3.2.1.2 Korrektes Datum}{7}{paragraph*.4}% -\contentsline {paragraph}{3.2.1.3 Vorgaben an die Umsetzung}{7}{paragraph*.5}% -\contentsline {paragraph}{3.2.1.4 Hinweise}{8}{paragraph*.6}% -\contentsline {subsubsection}{\numberline {2.3.2.2}3.2.2 Teilaufgabe Wochentag Berechnung}{8}{subsubsection.2.3.2.2}% -\contentsline {section}{\numberline {2.4}4. Bewertung}{8}{section.2.4}% -\contentsline {section}{\numberline {2.5}5. Anhang}{9}{section.2.5}% -\contentsline {subsection}{\numberline {2.5.1}5.1 Sprach Element}{9}{subsection.2.5.1}% -\contentsline {subsection}{\numberline {2.5.2}5.2 Beschreibung}{9}{subsection.2.5.2}% -\contentsline {chapter}{\numberline {3}03 \sphinxhyphen {} Bit Operationen, Struct, Typedef}{10}{chapter.3}% -\contentsline {section}{\numberline {3.1}1. Bit Operationen}{10}{section.3.1}% -\contentsline {subsection}{\numberline {3.1.1}1.1 Übungen}{11}{subsection.3.1.1}% -\contentsline {subsubsection}{\numberline {3.1.1.1}1. Basis Operationen}{11}{subsubsection.3.1.1.1}% -\contentsline {subsubsection}{\numberline {3.1.1.2}2. Variablen tauschen (ohne Dritt\sphinxhyphen {}Variable)}{11}{subsubsection.3.1.1.2}% -\contentsline {subsubsection}{\numberline {3.1.1.3}3. Lower\sphinxhyphen {} / Uppercase}{12}{subsubsection.3.1.1.3}% -\contentsline {subsubsection}{\numberline {3.1.1.4}4. Prüfen auf 2\sphinxhyphen {}er Potenz}{12}{subsubsection.3.1.1.4}% -\contentsline {section}{\numberline {3.2}2. Struct \& typedef}{13}{section.3.2}% -\contentsline {subsection}{\numberline {3.2.1}2.1 Übungen}{13}{subsection.3.2.1}% -\contentsline {subsubsection}{\numberline {3.2.1.1}1. Bit Operationen Rechner}{13}{subsubsection.3.2.1.1}% -\contentsline {chapter}{\numberline {4}04 \sphinxhyphen {} Modularisieren von C Code}{14}{chapter.4}% -\contentsline {section}{\numberline {4.1}1. Übersicht}{14}{section.4.1}% -\contentsline {section}{\numberline {4.2}2. Lernziele}{14}{section.4.2}% -\contentsline {section}{\numberline {4.3}3. Aufgabe 1: Modularisieren}{15}{section.4.3}% -\contentsline {subsection}{\numberline {4.3.1}3.1 Teilaufgabe Modules einbinden, Header Files schreiben}{15}{subsection.4.3.1}% -\contentsline {section}{\numberline {4.4}4. Aufgabe 2: Makefile Regeln}{16}{section.4.4}% -\contentsline {subsection}{\numberline {4.4.1}4.1 Neue Regeln hinzufügen}{16}{subsection.4.4.1}% -\contentsline {section}{\numberline {4.5}5. Aufgabe 3}{16}{section.4.5}% -\contentsline {section}{\numberline {4.6}6. Bewertung}{16}{section.4.6}% -\contentsline {section}{\numberline {4.7}7. Erweiterung Doxyfile für Abhängigkeitsanalyse}{16}{section.4.7}% -\contentsline {chapter}{\numberline {5}05 \sphinxhyphen {} Arrays/Strings/TicTacToe}{18}{chapter.5}% -\contentsline {section}{\numberline {5.1}1. Übersicht}{18}{section.5.1}% -\contentsline {section}{\numberline {5.2}2. Lernziele}{18}{section.5.2}% -\contentsline {section}{\numberline {5.3}3. Aufgabe 1: Sortieren von Strings}{18}{section.5.3}% -\contentsline {section}{\numberline {5.4}4. Aufgabe 2: TicTacToe}{19}{section.5.4}% -\contentsline {subsection}{\numberline {5.4.1}4.1 Teilaufgabe test\_model\_init}{20}{subsection.5.4.1}% -\contentsline {subsection}{\numberline {5.4.2}4.2 Teilaufgabe test\_model\_get\_state und test\_model\_get\_winner}{21}{subsection.5.4.2}% -\contentsline {subsection}{\numberline {5.4.3}4.3 Teilaufgabe test\_model\_can\_move}{22}{subsection.5.4.3}% -\contentsline {subsection}{\numberline {5.4.4}4.4 Teilaufgabe test\_model\_move und test\_model\_get\_win\_line}{22}{subsection.5.4.4}% -\contentsline {section}{\numberline {5.5}5. Bewertung}{23}{section.5.5}% -\contentsline {chapter}{\numberline {6}06 \sphinxhyphen {} Personen Verwaltung \textendash {} Linked List}{24}{chapter.6}% -\contentsline {section}{\numberline {6.1}1. Übersicht}{24}{section.6.1}% -\contentsline {section}{\numberline {6.2}2. Lernziele}{25}{section.6.2}% -\contentsline {section}{\numberline {6.3}3. Personenverwaltung}{25}{section.6.3}% -\contentsline {subsection}{\numberline {6.3.1}3.1 Programmfunktion}{25}{subsection.6.3.1}% -\contentsline {subsection}{\numberline {6.3.2}3.2 Designvorgaben}{25}{subsection.6.3.2}% -\contentsline {subsection}{\numberline {6.3.3}3.3 Bestehender Programmrahmen}{28}{subsection.6.3.3}% -\contentsline {section}{\numberline {6.4}4. Aufgabe 1: Modularisierung \textendash {} API und Implementation main.c}{28}{section.6.4}% -\contentsline {section}{\numberline {6.5}5. Aufgabe 2: Implementierung von person.c und list.c}{29}{section.6.5}% -\contentsline {subsection}{\numberline {6.5.1}5.1 Teilaufgabe: Implementierung von person.c}{29}{subsection.6.5.1}% -\contentsline {subsection}{\numberline {6.5.2}5.2 Teilaufgabe: Implementierung von list.c}{29}{subsection.6.5.2}% -\contentsline {section}{\numberline {6.6}6. Aufgabe 3: Unit Tests}{29}{section.6.6}% -\contentsline {section}{\numberline {6.7}7. Bewertung}{29}{section.6.7}% -\contentsline {chapter}{\numberline {7}07 \sphinxhyphen {} Prozesse und Threads}{31}{chapter.7}% -\contentsline {section}{\numberline {7.1}1. Übersicht}{32}{section.7.1}% -\contentsline {subsection}{\numberline {7.1.1}1.1 Nachweis}{32}{subsection.7.1.1}% -\contentsline {section}{\numberline {7.2}2. Lernziele}{32}{section.7.2}% -\contentsline {section}{\numberline {7.3}3. Aufgaben}{32}{section.7.3}% -\contentsline {subsection}{\numberline {7.3.1}3.1 Aufgabe 1: Prozess mit fork() erzeugen}{33}{subsection.7.3.1}% -\contentsline {subsection}{\numberline {7.3.2}3.2 Aufgabe 2: Prozess mit fork() und exec(): Programm Image ersetzen}{33}{subsection.7.3.2}% -\contentsline {subsection}{\numberline {7.3.3}3.3 Aufgabe 3: Prozesshierarchie analysieren}{33}{subsection.7.3.3}% -\contentsline {subsection}{\numberline {7.3.4}3.4 Aufgabe 4: Zeitlicher Ablauf von Prozessen}{34}{subsection.7.3.4}% -\contentsline {subsection}{\numberline {7.3.5}3.5 Aufgabe 5: Waisenkinder (Orphan Processes)}{34}{subsection.7.3.5}% -\contentsline {subsection}{\numberline {7.3.6}3.6 Aufgabe 6: Terminierte, halbtote Prozesse (Zombies)}{34}{subsection.7.3.6}% -\contentsline {subsection}{\numberline {7.3.7}3.7 Aufgabe 7: Auf Terminieren von Kindprozessen warten}{35}{subsection.7.3.7}% -\contentsline {subsection}{\numberline {7.3.8}3.8 Aufgabe 8: Kindprozess als Kopie des Elternprozesses}{36}{subsection.7.3.8}% -\contentsline {subsection}{\numberline {7.3.9}3.9 Aufgabe 9: Unterschied von Threads gegenüber Prozessen}{36}{subsection.7.3.9}% -\contentsline {subsection}{\numberline {7.3.10}3.10 Aufgabe 10 (optional):}{37}{subsection.7.3.10}% -\contentsline {subsubsection}{\numberline {7.3.10.1}3.10.1 Übersicht}{37}{subsubsection.7.3.10.1}% -\contentsline {paragraph}{3.10.1.1 Nachweis}{37}{paragraph*.7}% -\contentsline {subsubsection}{\numberline {7.3.10.2}3.10.2 Lernziele}{37}{subsubsection.7.3.10.2}% -\contentsline {subsubsection}{\numberline {7.3.10.3}3.10.3 Aufgabe: Dämon Prozesse}{37}{subsubsection.7.3.10.3}% -\contentsline {subsubsection}{\numberline {7.3.10.4}3.10.4 Zusatzinformationen}{38}{subsubsection.7.3.10.4}% -\contentsline {paragraph}{3.10.4.1 Diese Implementation}{38}{paragraph*.8}% -\contentsline {paragraph}{3.10.4.2 Zusatzinformation zu Dämon Prozessen}{39}{paragraph*.9}% -\contentsline {section}{\numberline {7.4}4. Bewertung}{39}{section.7.4}% -\contentsline {chapter}{\numberline {8}08 \sphinxhyphen {} Synchronisationsprobleme}{41}{chapter.8}% -\contentsline {section}{\numberline {8.1}1. Übersicht}{41}{section.8.1}% -\contentsline {subsection}{\numberline {8.1.1}1.1 Nachweis}{42}{subsection.8.1.1}% -\contentsline {section}{\numberline {8.2}2. Lernziele}{42}{section.8.2}% -\contentsline {section}{\numberline {8.3}3. Einführung}{42}{section.8.3}% -\contentsline {subsection}{\numberline {8.3.1}3.1 Wie löst man Synchronisationsprobleme?}{42}{subsection.8.3.1}% -\contentsline {section}{\numberline {8.4}4. Der Kaffee\sphinxhyphen {}Automat}{43}{section.8.4}% -\contentsline {subsection}{\numberline {8.4.1}4.1 Aufgabe: Mutual Exclusion}{44}{subsection.8.4.1}% -\contentsline {subsubsection}{\numberline {8.4.1.1}Aufgaben}{44}{subsubsection.8.4.1.1}% -\contentsline {subsection}{\numberline {8.4.2}4.2 Aufgabe: Einfache Reihenfolge}{44}{subsection.8.4.2}% -\contentsline {subsubsection}{\numberline {8.4.2.1}Aufgaben}{45}{subsubsection.8.4.2.1}% -\contentsline {subsection}{\numberline {8.4.3}4.3 Aufgabe: Erweiterte Reihenfolge}{45}{subsection.8.4.3}% -\contentsline {subsubsection}{\numberline {8.4.3.1}Aufgabe}{45}{subsubsection.8.4.3.1}% -\contentsline {subsection}{\numberline {8.4.4}4.4 Zusammenfassung}{45}{subsection.8.4.4}% -\contentsline {section}{\numberline {8.5}5. International Banking}{46}{section.8.5}% -\contentsline {subsection}{\numberline {8.5.1}5.1 Implementation}{46}{subsection.8.5.1}% -\contentsline {subsection}{\numberline {8.5.2}5.2 Aufgabe: Konto Synchronisation}{46}{subsection.8.5.2}% -\contentsline {subsection}{\numberline {8.5.3}5.3 Aufgabe: Filialen Zugriff in Critical Section}{46}{subsection.8.5.3}% -\contentsline {subsection}{\numberline {8.5.4}5.4 Aufgabe: Refactoring der Synchronisation}{46}{subsection.8.5.4}% -\contentsline {section}{\numberline {8.6}6. Bewertung}{47}{section.8.6}% -\contentsline {chapter}{\numberline {9}09 \sphinxhyphen {} File Operations}{48}{chapter.9}% -\contentsline {section}{\numberline {9.1}1. Übersicht}{48}{section.9.1}% -\contentsline {section}{\numberline {9.2}2. Lernziele}{48}{section.9.2}% -\contentsline {section}{\numberline {9.3}3. Aufgabe 1:}{48}{section.9.3}% -\contentsline {section}{\numberline {9.4}4. Bewertung}{48}{section.9.4}% -\contentsline {chapter}{\numberline {10}10 \sphinxhyphen {} IPC}{49}{chapter.10}% -\contentsline {section}{\numberline {10.1}1. Übersicht}{49}{section.10.1}% -\contentsline {section}{\numberline {10.2}2. Lernziele}{49}{section.10.2}% -\contentsline {section}{\numberline {10.3}3. Aufgabe 1:}{49}{section.10.3}% -\contentsline {section}{\numberline {10.4}4. Bewertung}{49}{section.10.4}% diff --git a/make.bat b/make.bat deleted file mode 100644 index 94bda21..0000000 --- a/make.bat +++ /dev/null @@ -1,31 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -pushd %~dp0 - -set PDFLATEX=latexmk -pdf -dvi- -ps- - -set "LATEXOPTS= " - -if "%1" == "" goto all-pdf - -if "%1" == "all-pdf" ( - :all-pdf - for %%i in (*.tex) do ( - %PDFLATEX% %LATEXMKOPTS% %%i - ) - goto end -) - -if "%1" == "all-pdf-ja" ( - goto all-pdf -) - -if "%1" == "clean" ( - del /q /s *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz *.fls *.fdb_latexmk - goto end -) - -:end -popd \ No newline at end of file diff --git a/python.ist b/python.ist deleted file mode 100644 index 70536a6..0000000 --- a/python.ist +++ /dev/null @@ -1,16 +0,0 @@ -line_max 100 -headings_flag 1 -heading_prefix " \\bigletter " - -preamble "\\begin{sphinxtheindex} -\\let\\bigletter\\sphinxstyleindexlettergroup -\\let\\spxpagem \\sphinxstyleindexpagemain -\\let\\spxentry \\sphinxstyleindexentry -\\let\\spxextra \\sphinxstyleindexextra - -" - -postamble "\n\n\\end{sphinxtheindex}\n" - -symhead_positive "{\\sphinxsymbolsname}" -numhead_positive "{\\sphinxnumbersname}" diff --git a/random_number.png b/random_number.png deleted file mode 100644 index 71b768c..0000000 Binary files a/random_number.png and /dev/null differ diff --git a/sequence_graph.png b/sequence_graph.png deleted file mode 100644 index e551d22..0000000 Binary files a/sequence_graph.png and /dev/null differ diff --git a/sphinx.sty b/sphinx.sty deleted file mode 100644 index 4d42199..0000000 --- a/sphinx.sty +++ /dev/null @@ -1,351 +0,0 @@ -% -% sphinx.sty -% -% Adapted from the old python.sty, mostly written by Fred Drake, -% by Georg Brandl. -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{sphinx}[2021/01/27 v4.0.0 LaTeX package (Sphinx markup)] - -% provides \ltx@ifundefined -% (many packages load ltxcmds: graphicx does for pdftex and lualatex but -% not xelatex, and anyhow kvoptions does, but it may be needed in future to -% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined) -\RequirePackage{ltxcmds} - -%% for deprecation warnings -\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name, -% #2 = when deprecated, #3 = when removed, #4 = additional info - \edef\spx@tempa{\detokenize{#1}}% - \ltx@ifundefined{sphinx_depr_\spx@tempa}{% - \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa - \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter - \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname - \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J - \sphinxdeprecatedmacro^^J - \@spaces- is deprecated at Sphinx #2^^J - \@spaces- and removed at Sphinx #3.^^J - #4^^J****}}% - }{% warning already emitted (at end of latex log), don't repeat - }} - - -%% OPTION HANDLING -% - -% We first handle options then load packages, but we need \definecolor from -% xcolor/color. - -% FIXME: we should \RequirePackage{xcolor} always now -% The xcolor package draws better fcolorboxes around verbatim code -\IfFileExists{xcolor.sty}{ - \RequirePackage{xcolor} -}{ - \RequirePackage{color} -} - -% Handle options via "kvoptions" (later loaded by hyperref anyhow) -\RequirePackage{kvoptions} -\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix - -% Sphinx legacy text layout: 1in margins on all four sides -\ifx\@jsc@uplatextrue\@undefined -\DeclareStringOption[1in]{hmargin} -\DeclareStringOption[1in]{vmargin} -\DeclareStringOption[.5in]{marginpar} -\else -% Japanese standard document classes handle \mag in a special way -\DeclareStringOption[\inv@mag in]{hmargin} -\DeclareStringOption[\inv@mag in]{vmargin} -\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar} -\fi - -\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0} -\DeclareStringOption[-1]{numfigreset} -\DeclareBoolOption[false]{nonumfigreset} -\DeclareBoolOption[false]{mathnumfig} -\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}} -\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}} -% \DeclareBoolOption[false]{usespart}% not used -% dimensions, we declare the \dimen registers here. -\newdimen\sphinxverbatimsep -\newdimen\sphinxverbatimborder -\newdimen\sphinxshadowsep -\newdimen\sphinxshadowsize -\newdimen\sphinxshadowrule -% \DeclareStringOption is not convenient for the handling of these dimensions -% because we want to assign the values to the corresponding registers. Even if -% we added the code to the key handler it would be too late for the initial -% set-up and we would need to do initial assignments explicitly. We end up -% using \define@key directly. -% verbatim -\sphinxverbatimsep=\fboxsep - \define@key{sphinx}{verbatimsep}{\sphinxverbatimsep\dimexpr #1\relax} -\sphinxverbatimborder=\fboxrule - \define@key{sphinx}{verbatimborder}{\sphinxverbatimborder\dimexpr #1\relax} -% topic boxes -\sphinxshadowsep =5pt - \define@key{sphinx}{shadowsep}{\sphinxshadowsep\dimexpr #1\relax} -\sphinxshadowsize=4pt - \define@key{sphinx}{shadowsize}{\sphinxshadowsize\dimexpr #1\relax} -\sphinxshadowrule=\fboxrule - \define@key{sphinx}{shadowrule}{\sphinxshadowrule\dimexpr #1\relax} -% verbatim -\DeclareBoolOption[true]{verbatimwithframe} -\DeclareBoolOption[true]{verbatimwrapslines} -\DeclareBoolOption[false]{verbatimforcewraps} -\DeclareStringOption[3]{verbatimmaxoverfull} -\DeclareStringOption[100]{verbatimmaxunderfull} -\DeclareBoolOption[true]{verbatimhintsturnover} -\DeclareBoolOption[true]{inlineliteralwraps} -\DeclareStringOption[t]{literalblockcappos} -\DeclareStringOption[r]{verbatimcontinuedalign} -\DeclareStringOption[r]{verbatimcontinuesalign} -% parsed literal -\DeclareBoolOption[true]{parsedliteralwraps} -% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX -\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace} -\DeclareStringOption % must use braces to hide the brackets - [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]% - {verbatimcontinued} -% notices/admonitions -% the dimensions for notices/admonitions are kept as macros and assigned to -% \spx@notice@border at time of use, hence \DeclareStringOption is ok for this -\newdimen\spx@notice@border -\DeclareStringOption[0.5pt]{noteborder} -\DeclareStringOption[0.5pt]{hintborder} -\DeclareStringOption[0.5pt]{importantborder} -\DeclareStringOption[0.5pt]{tipborder} -\DeclareStringOption[1pt]{warningborder} -\DeclareStringOption[1pt]{cautionborder} -\DeclareStringOption[1pt]{attentionborder} -\DeclareStringOption[1pt]{dangerborder} -\DeclareStringOption[1pt]{errorborder} -% footnotes -\DeclareStringOption[\mbox{ }]{AtStartFootnote} -% we need a public macro name for direct use in latex file -\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote} -% no such need for this one, as it is used inside other macros -\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote} -% some font styling. -\DeclareStringOption[\sffamily\bfseries]{HeaderFamily} -% colours -% same problems as for dimensions: we want the key handler to use \definecolor. -% first, some colours with no prefix, for backwards compatibility -\newcommand*{\sphinxDeclareColorOption}[2]{% - \definecolor{#1}#2% - \define@key{sphinx}{#1}{\definecolor{#1}##1}% -}% -\sphinxDeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}} -\sphinxDeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}} -\sphinxDeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}} -\sphinxDeclareColorOption{VerbatimColor}{{rgb}{1,1,1}} -\sphinxDeclareColorOption{VerbatimBorderColor}{{rgb}{0,0,0}} -% now the colours defined with "sphinx" prefix in their names -\newcommand*{\sphinxDeclareSphinxColorOption}[2]{% - % set the initial default - \definecolor{sphinx#1}#2% - % set the key handler. The "value" ##1 must be acceptable by \definecolor. - \define@key{sphinx}{#1}{\definecolor{sphinx#1}##1}% -}% -% Default color chosen to be as in minted.sty LaTeX package! -\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}} -% admonition boxes, "light" style -\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{importantBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{tipBorderColor}{{rgb}{0,0,0}} -% admonition boxes, "heavy" style -\sphinxDeclareSphinxColorOption{warningBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{cautionBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{attentionBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{dangerBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{errorBorderColor}{{rgb}{0,0,0}} -\sphinxDeclareSphinxColorOption{warningBgColor}{{rgb}{1,1,1}} -\sphinxDeclareSphinxColorOption{cautionBgColor}{{rgb}{1,1,1}} -\sphinxDeclareSphinxColorOption{attentionBgColor}{{rgb}{1,1,1}} -\sphinxDeclareSphinxColorOption{dangerBgColor}{{rgb}{1,1,1}} -\sphinxDeclareSphinxColorOption{errorBgColor}{{rgb}{1,1,1}} - -\DeclareDefaultOption{\@unknownoptionerror} -\ProcessKeyvalOptions* -% don't allow use of maxlistdepth via \sphinxsetup. -\DisableKeyvalOption{sphinx}{maxlistdepth} -\DisableKeyvalOption{sphinx}{numfigreset} -\DisableKeyvalOption{sphinx}{nonumfigreset} -\DisableKeyvalOption{sphinx}{mathnumfig} -% FIXME: this is unrelated to an option, move this elsewhere -% To allow hyphenation of first word in narrow contexts; no option, -% customization to be done via 'preamble' key -\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip} -% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex -\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi -% user interface: options can be changed midway in a document! -\newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}} - - -%% MISCELLANEOUS CONTEXT -% -% flag to be set in a framed environment -% (defined here as currently needed by three sphinxlatex....sty files and -% even if not needed if such files are replaced, the definition does no harm) -\newif\ifspx@inframed -% -% \spx@ifcaptionpackage (defined at begin document) -% is needed currently in macros from: -% sphinxlatexliterals.sty (sphinxVerbatim) -% sphinxlatextables.sty (for some macros used in the table templates) -% -% \sphinxcaption is mark-up injected by the tabular and tabulary templates -% it is defined in sphinxlatextables.sty -% -% store the original \caption macro for usage with figures inside longtable -% and tabulary cells. Make sure we get the final \caption in presence of -% caption package, whether the latter was loaded before or after sphinx. -\AtBeginDocument{% - \let\spx@originalcaption\caption - \@ifpackageloaded{caption} - {\let\spx@ifcaptionpackage\@firstoftwo - \caption@AtBeginDocument*{\let\spx@originalcaption\caption}% -% in presence of caption package, drop our own \sphinxcaption whose aim was to -% ensure same width of caption to all kinds of tables (tabular(y), longtable), -% because caption package has its own width (or margin) option - \def\sphinxcaption{\caption}% - }% - {\let\spx@ifcaptionpackage\@secondoftwo}% -} - -%% PASS OPTIONS -% -% pass options to hyperref; it must not have been loaded already -\input{sphinxoptionshyperref.sty} -% pass options to geometry; it must not have been loaded already -\input{sphinxoptionsgeometry.sty} - - -%% COLOR (general) -% -% FIXME: these two should be deprecated -% -% FIXME: \normalcolor should be used and \py@NormalColor never defined -\def\py@NormalColor{\color{black}} -% FIXME: \color{TitleColor} should be used directly and \py@TitleColor -% should never get defined. -\def\py@TitleColor{\color{TitleColor}} - - -%% PACKAGES -% -% as will be indicated below, secondary style files load some more packages -% -% For \text macro (sphinx.util.texescape) -% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty -\RequirePackage{amstext} -% It was passed "warn" option from latex template in case it is already loaded -% via some other package before \usepackage{sphinx} in preamble -\RequirePackage{textcomp} -% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code -% for allowing figures in tables. -\RequirePackage{float} -% For floating figures in the text. Better to load after float. -\RequirePackage{wrapfig} -% Provides \captionof, used once by latex writer (\captionof{figure}) -\RequirePackage{capt-of} -% Support hlist directive -\RequirePackage{multicol} - - -%% GRAPHICS -% -% It will always be needed, so let's load it here -\RequirePackage{graphicx} -\input{sphinxlatexgraphics.sty} - - -%% FRAMED ENVIRONMENTS -% -\input{sphinxlatexadmonitions.sty} -\input{sphinxlatexliterals.sty} -\input{sphinxlatexshadowbox.sty} - - -%% CONTAINERS -% -\input{sphinxlatexcontainers.sty} - - -%% PYGMENTS -% stylesheet for highlighting with pygments -\RequirePackage{sphinxhighlight} - - -%% TABLES -% -\input{sphinxlatextables.sty} - - -%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS -% -\input{sphinxlatexnumfig.sty} - - -%% LISTS -% -\input{sphinxlatexlists.sty} - - -%% FOOTNOTES -% -% Support scopes for footnote numbering -\newcounter{sphinxscope} -\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}} -% Explicitly numbered footnotes may be referred to, and for this to be -% clickable we need to have only one target. So we will step this at each -% explicit footnote and let \thesphinxscope take it into account -\newcounter{sphinxexplicit} -\newcommand{\sphinxstepexplicit}{\stepcounter{sphinxexplicit}} -% Some babel/polyglossia languages fiddle with \@arabic, so let's be extra -% cautious and redefine \thesphinxscope with \number not \@arabic. -% Memo: we expect some subtle redefinition of \thesphinxscope to be a part of page -% scoping for footnotes, when we shall implement it. -\renewcommand{\thesphinxscope}{\number\value{sphinxscope}.\number\value{sphinxexplicit}} -\newcommand\sphinxthefootnotemark[2]{% - % this is used to make reference to an explicitly numbered footnote not on same page - % #1=label of footnote text, #2=page number where footnote text was printed - \ifdefined\pagename - \pagename\space#2, % <- space - \else - p. #2, % <- space - \fi #1% no space -} -% support large numbered footnotes in minipage; but this is now obsolete -% from systematic use of savenotes environment around minipages -\def\thempfootnote{\arabic{mpfootnote}} -% This package is needed to support hyperlinked footnotes in tables and -% framed contents, and to allow code-blocks in footnotes. -\RequirePackage{sphinxpackagefootnote} - - -%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS -% -\input{sphinxlatexindbibtoc.sty} - - -%% STYLING -% -\input{sphinxlatexstylepage.sty} -\input{sphinxlatexstyleheadings.sty} -\input{sphinxlatexstyletext.sty} - - -%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS -% -\input{sphinxlatexobjects.sty} - - -% FIXME: this line should be dropped, as "9" is default anyhow. -\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi - - -\endinput diff --git a/sphinx.xdy b/sphinx.xdy deleted file mode 100644 index 0dcf113..0000000 --- a/sphinx.xdy +++ /dev/null @@ -1,230 +0,0 @@ -;;; -*- mode: lisp; coding: utf-8; -*- - -;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This -;; configuration is a workaround, which requires to pass option -;; hyperindex=false to hyperref. -;; textit and emph not currently used, spxpagem replaces former textbf -(define-attributes (("textbf" "textit" "emph" "spxpagem" "default"))) -(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf") -(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit") -(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph") -(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem") -(markup-locref :open "\hyperpage{" :close "}" :attr "default") - -(require "numeric-sort.xdy") - -;; xindy base module latex.xdy loads tex.xdy and the latter instructs -;; xindy to ignore **all** TeX macros in .idx entries, except those -;; explicitly described in merge rule. But when after applying all -;; merge rules an empty string results, xindy raises an error: - -;; ERROR: CHAR: index 0 should be less than the length of the string - -;; For example when using pdflatex with utf-8 characters the index -;; file will contain \IeC macros and they will get ignored except if -;; suitable merge rules are loaded early. The texindy script coming -;; with xindy provides this, but only for Latin scripts. The texindy -;; man page says to use rather xelatex or lualatex in case of Cyrillic -;; scripts. - -;; Sphinx contributes LICRcyr2utf8.xdy to provide support for Cyrillic -;; scripts for the pdflatex engine. - -;; Another issue caused by xindy ignoring all TeX macros except those -;; explicitly declared reveals itself when attempting to index ">>>", -;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX -;; escaping. - -;; To fix this, Sphinx does **not** use texindy, and does not even -;; load the xindy latex.xdy base module. - -;(require "latex.xdy") - -;; Rather it incorporates some suitable extracts from latex.xdy and -;; tex.xdy with additional Sphinx contributed rules. - -;; But, this means for pdflatex and Latin scripts that the xindy file -;; tex/inputenc/uf8.xdy is not usable because it refers to the macro -;; \IeC only sporadically, and as tex.xdy is not loaded, a rule such as -;; (merge-rule "\'e" "é" :string) -;; does not work, it must be -;; (merge-rule "\IeC {\'e}" "é" :string) -;; So Sphinx contributes LICRlatin2utf8.xdy to mitigate that problem. - -;;;;;;;; extracts from tex.xdy (discarding most original comments): - -;;; -;;; TeX conventions -;;; - -;; Discard leading and trailing white space. Collapse multiple white -;; space characters to blank. - -(merge-rule "^ +" "" :eregexp) -(merge-rule " +$" "" :eregexp) -(merge-rule " +" " " :eregexp) - -;; Handle TeX markup - -(merge-rule "\\([{}$%&#])" "\1" :eregexp) - -;;;;;;;; end of extracts from xindy's tex.xdy - -;;;;;;;; extracts from latex.xdy: - -;; Standard location classes: arabic and roman numbers, and alphabets. - -(define-location-class "arabic-page-numbers" ("arabic-numbers")) -(define-location-class "roman-page-numbers" ("roman-numbers-lowercase")) -(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase")) -(define-location-class "alpha-page-numbers" ("alpha")) -(define-location-class "Alpha-page-numbers" ("ALPHA")) - -;; Output Markup - -(markup-letter-group-list :sep "~n~n \indexspace~n") - -(markup-indexentry :open "~n \item " :depth 0) -(markup-indexentry :open "~n \subitem " :depth 1) -(markup-indexentry :open "~n \subsubitem " :depth 2) - -(markup-locclass-list :open ", " :sep ", ") -(markup-locref-list :sep ", ") - -;;;;;;;; end of extracts from latex.xdy - -;; The LaTeX \index command turns \ into normal character so the TeX macros -;; written to .idx files are not followed by a blank. This is different -;; from non-ascii letters which end up (with pdflatex) as \IeC macros in .idx -;; file, with a blank space after \IeC - -;; Details of the syntax are explained at -;; http://xindy.sourceforge.net/doc/manual-3.html -;; In absence of :string, "xindy uses an auto-detection mechanism to decide, -;; if the pattern is a regular expression or not". But it is not obvious to -;; guess, for example "\\_" is not detected as RE but "\\P\{\}" is, so for -;; being sure we apply the :string switch everywhere and do not use \\ etc... - -;; Go back from sphinx.util.texescape TeX macros to UTF-8 - -(merge-rule "\sphinxleftcurlybrace{}" "{" :string) -(merge-rule "\sphinxrightcurlybrace{}" "}" :string) -(merge-rule "\_" "_" :string) -(merge-rule "{[}" "[" :string) -(merge-rule "{]}" "]" :string) -(merge-rule "\textbackslash{}" "\" :string) ; " for Emacs syntax highlighting -(merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here -(merge-rule "\textasciicircum{}" "^" :string) -(merge-rule "\sphinxhyphen{}" "-" :string) -(merge-rule "\textquotesingle{}" "'" :string) -(merge-rule "\textasciigrave{}" "`" :string) -(merge-rule "\textless{}" "<" :string) -(merge-rule "\textgreater{}" ">" :string) -(merge-rule "\P{}" "¶" :string) -(merge-rule "\S{}" "§" :string) -(merge-rule "\texteuro{}" "€" :string) -(merge-rule "\(\infty\)" "∞" :string) -(merge-rule "\(\pm\)" "±" :string) -(merge-rule "\(\rightarrow\)" "→" :string) -(merge-rule "\(\checkmark\)" "✓" :string) -(merge-rule "\textendash{}" "–" :string) -(merge-rule "\textbar{}" "|" :string) -(merge-rule "\(\sp{\text{0}}\)" "⁰" :string) -(merge-rule "\(\sp{\text{1}}\)" "¹" :string) -(merge-rule "\(\sp{\text{2}}\)" "²" :string) -(merge-rule "\(\sp{\text{3}}\)" "³" :string) -(merge-rule "\(\sp{\text{4}}\)" "⁴" :string) -(merge-rule "\(\sp{\text{5}}\)" "⁵" :string) -(merge-rule "\(\sp{\text{6}}\)" "⁶" :string) -(merge-rule "\(\sp{\text{7}}\)" "⁷" :string) -(merge-rule "\(\sp{\text{8}}\)" "⁸" :string) -(merge-rule "\(\sp{\text{9}}\)" "⁹" :string) -(merge-rule "\(\sb{\text{0}}\)" "₀" :string) -(merge-rule "\(\sb{\text{1}}\)" "₁" :string) -(merge-rule "\(\sb{\text{2}}\)" "₂" :string) -(merge-rule "\(\sb{\text{3}}\)" "₃" :string) -(merge-rule "\(\sb{\text{4}}\)" "₄" :string) -(merge-rule "\(\sb{\text{5}}\)" "₅" :string) -(merge-rule "\(\sb{\text{6}}\)" "₆" :string) -(merge-rule "\(\sb{\text{7}}\)" "₇" :string) -(merge-rule "\(\sb{\text{8}}\)" "₈" :string) -(merge-rule "\(\sb{\text{9}}\)" "₉" :string) -(merge-rule "\IeC {\textalpha }" "α" :string) -(merge-rule "\IeC {\textbeta }" "β" :string) -(merge-rule "\IeC {\textgamma }" "γ" :string) -(merge-rule "\IeC {\textdelta }" "δ" :string) -(merge-rule "\IeC {\textepsilon }" "ε" :string) -(merge-rule "\IeC {\textzeta }" "ζ" :string) -(merge-rule "\IeC {\texteta }" "η" :string) -(merge-rule "\IeC {\texttheta }" "θ" :string) -(merge-rule "\IeC {\textiota }" "ι" :string) -(merge-rule "\IeC {\textkappa }" "κ" :string) -(merge-rule "\IeC {\textlambda }" "λ" :string) -(merge-rule "\IeC {\textmu }" "μ" :string) -(merge-rule "\IeC {\textnu }" "ν" :string) -(merge-rule "\IeC {\textxi }" "ξ" :string) -(merge-rule "\IeC {\textomicron }" "ο" :string) -(merge-rule "\IeC {\textpi }" "π" :string) -(merge-rule "\IeC {\textrho }" "ρ" :string) -(merge-rule "\IeC {\textsigma }" "σ" :string) -(merge-rule "\IeC {\texttau }" "τ" :string) -(merge-rule "\IeC {\textupsilon }" "υ" :string) -(merge-rule "\IeC {\textphi }" "φ" :string) -(merge-rule "\IeC {\textchi }" "χ" :string) -(merge-rule "\IeC {\textpsi }" "ψ" :string) -(merge-rule "\IeC {\textomega }" "ω" :string) -(merge-rule "\IeC {\textAlpha }" "Α" :string) -(merge-rule "\IeC {\textBeta }" "Β" :string) -(merge-rule "\IeC {\textGamma }" "Γ" :string) -(merge-rule "\IeC {\textDelta }" "Δ" :string) -(merge-rule "\IeC {\textEpsilon }" "Ε" :string) -(merge-rule "\IeC {\textZeta }" "Ζ" :string) -(merge-rule "\IeC {\textEta }" "Η" :string) -(merge-rule "\IeC {\textTheta }" "Θ" :string) -(merge-rule "\IeC {\textIota }" "Ι" :string) -(merge-rule "\IeC {\textKappa }" "Κ" :string) -(merge-rule "\IeC {\textLambda }" "Λ" :string) -(merge-rule "\IeC {\textMu }" "Μ" :string) -(merge-rule "\IeC {\textNu }" "Ν" :string) -(merge-rule "\IeC {\textTheta }" "Θ" :string) -(merge-rule "\IeC {\textIota }" "Ι" :string) -(merge-rule "\IeC {\textKappa }" "Κ" :string) -(merge-rule "\IeC {\textLambda }" "Λ" :string) -(merge-rule "\IeC {\textMu }" "Μ" :string) -(merge-rule "\IeC {\textNu }" "Ν" :string) -(merge-rule "\IeC {\textXi }" "Ξ" :string) -(merge-rule "\IeC {\textOmicron }" "Ο" :string) -(merge-rule "\IeC {\textPi }" "Π" :string) -(merge-rule "\IeC {\textRho }" "Ρ" :string) -(merge-rule "\IeC {\textSigma }" "Σ" :string) -(merge-rule "\IeC {\textTau }" "Τ" :string) -(merge-rule "\IeC {\textUpsilon }" "Υ" :string) -(merge-rule "\IeC {\textPhi }" "Φ" :string) -(merge-rule "\IeC {\textChi }" "Χ" :string) -(merge-rule "\IeC {\textPsi }" "Ψ" :string) -(merge-rule "\IeC {\textOmega }" "Ω" :string) -(merge-rule "\IeC {\textohm }" "Ω" :string) - -;; This xindy module provides some basic support for "see" -(require "makeindex.xdy") - -;; This creates one-letter headings and works fine with utf-8 letters. -;; For Cyrillic with pdflatex works thanks to LICRcyr2utf8.xdy -(require "latin-lettergroups.xdy") - -;; currently we don't (know how to easily) separate "Numbers" from -;; "Symbols" with xindy as is the case with makeindex. -(markup-index :open "\begin{sphinxtheindex} -\let\lettergroup\sphinxstyleindexlettergroup -\let\lettergroupDefault\sphinxstyleindexlettergroupDefault -\let\spxpagem\sphinxstyleindexpagemain -\let\spxentry\sphinxstyleindexentry -\let\spxextra\sphinxstyleindexextra - -" - :close " - -\end{sphinxtheindex} -" - :tree) - diff --git a/sphinxhighlight.sty b/sphinxhighlight.sty deleted file mode 100644 index 3b2fdcd..0000000 --- a/sphinxhighlight.sty +++ /dev/null @@ -1,106 +0,0 @@ -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{sphinxhighlight}[2016/05/29 stylesheet for highlighting with pygments] -% Its contents depend on pygments_style configuration variable. - - -\makeatletter -\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% - \let\PYG@ul=\relax \let\PYG@tc=\relax% - \let\PYG@bc=\relax \let\PYG@ff=\relax} -\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} -\def\PYG@toks#1+{\ifx\relax#1\empty\else% - \PYG@tok{#1}\expandafter\PYG@toks\fi} -\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% - \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} -\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} - -\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} -\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@cs}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}} -\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}} -\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} -\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} -\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} -\@namedef{PYG@tok@ne}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}} -\@namedef{PYG@tok@nl}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}} -\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}} -\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}} -\@namedef{PYG@tok@nd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} -\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@si}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}} -\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}} -\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}} -\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} -\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} -\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} -\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} -\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} -\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} -\@namedef{PYG@tok@ge}{\let\PYG@it=\textit} -\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf} -\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} -\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}} -\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} -\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{-\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}} -\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} -\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} - -\def\PYGZbs{\char`\\} -\def\PYGZus{\char`\_} -\def\PYGZob{\char`\{} -\def\PYGZcb{\char`\}} -\def\PYGZca{\char`\^} -\def\PYGZam{\char`\&} -\def\PYGZlt{\char`\<} -\def\PYGZgt{\char`\>} -\def\PYGZsh{\char`\#} -\def\PYGZpc{\char`\%} -\def\PYGZdl{\char`\$} -\def\PYGZhy{\char`\-} -\def\PYGZsq{\char`\'} -\def\PYGZdq{\char`\"} -\def\PYGZti{\char`\~} -% for compatibility with earlier versions -\def\PYGZat{@} -\def\PYGZlb{[} -\def\PYGZrb{]} -\makeatother - -\renewcommand\PYGZsq{\textquotesingle} diff --git a/sphinxhowto.cls b/sphinxhowto.cls deleted file mode 100644 index 951cf81..0000000 --- a/sphinxhowto.cls +++ /dev/null @@ -1,102 +0,0 @@ -% -% sphinxhowto.cls for Sphinx (https://www.sphinx-doc.org/) -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)] - -% 'oneside' option overriding the 'twoside' default -\newif\if@oneside -\DeclareOption{oneside}{\@onesidetrue} -% Pass remaining document options to the parent class. -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} -\ProcessOptions\relax - -% Default to two-side document -\if@oneside -% nothing to do (oneside is the default) -\else -\PassOptionsToClass{twoside}{\sphinxdocclass} -\fi - -\LoadClass{\sphinxdocclass} - -% Set some sane defaults for section numbering depth and TOC depth. You can -% reset these counters in your preamble. -% -\setcounter{secnumdepth}{2} -\setcounter{tocdepth}{2}% i.e. section and subsection - -% Adapt \and command to the flushright context of \sphinxmaketitle, to -% avoid ragged line endings if author names do not fit all on one single line -\DeclareRobustCommand{\and}{% - \end{tabular}\kern-\tabcolsep - \allowbreak - \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% -}% -% If it is desired that each author name be on its own line, use in preamble: -%\DeclareRobustCommand{\and}{% -% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% -%}% -% Change the title page to look a bit better, and fit in with the fncychap -% ``Bjarne'' style a bit better. -% -\newcommand{\sphinxmaketitle}{% - \noindent\rule{\textwidth}{1pt}\par - \begingroup % for PDF information dictionary - \def\endgraf{ }\def\and{\& }% - \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup - \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% - \endgroup - \begin{flushright} - \sphinxlogo - \py@HeaderFamily - {\Huge \@title }\par - {\itshape\large \py@release \releaseinfo}\par - \vspace{25pt} - {\Large - \begin{tabular}[t]{c} - \@author - \end{tabular}\kern-\tabcolsep}\par - \vspace{25pt} - \@date \par - \py@authoraddress \par - \end{flushright} - \@thanks - \setcounter{footnote}{0} - \let\thanks\relax\let\maketitle\relax - %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} -} - -\newcommand{\sphinxtableofcontents}{% - \begingroup - \parskip \z@skip - \sphinxtableofcontentshook - \tableofcontents - \endgroup - \noindent\rule{\textwidth}{1pt}\par - \vspace{12pt}% -} -\newcommand\sphinxtableofcontentshook{} -\pagenumbering{arabic} - -% Fix the bibliography environment to add an entry to the Table of -% Contents. -% For an article document class this environment is a section, -% so no page break before it. -% -\newenvironment{sphinxthebibliography}[1]{% - % \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{#1}% - \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}} - - -% Same for the indices. -% The memoir class already does this, so we don't duplicate it in that case. -% -\@ifclassloaded{memoir} - {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} - {\newenvironment{sphinxtheindex}{% - \phantomsection % needed because no chapter, section, ... is created by theindex - \begin{theindex}% - \addcontentsline{toc}{section}{\indexname}}{\end{theindex}}} diff --git a/sphinxlatexadmonitions.sty b/sphinxlatexadmonitions.sty deleted file mode 100644 index 1e418c8..0000000 --- a/sphinxlatexadmonitions.sty +++ /dev/null @@ -1,148 +0,0 @@ -%% NOTICES AND ADMONITIONS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexadmonitions.sty}[2021/01/27 admonitions] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - sphinxadmonition (environment) -% This is a dispatch supporting -% -% - note, hint, important, tip (via sphinxlightbox) -% - warning, caution, attention, danger, error (via sphinxheavybox) -% -% Each sphinx environment can be redefined by user. -% The defaults are customizable via various colour and dimension -% settings, cf sphinx docs (latex customization). -% -% Requires: -\RequirePackage{framed}% used by sphinxheavybox -% -% Dependencies (they do not need to be defined at time of loading): -% - of course the various colour and dimension options handled via sphinx.sty -% - \sphinxstrong (for sphinxlightbox and sphinxheavybox) -% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty -% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox) - -% Provides: (also in sphinxlatexliterals.sty) -\providecommand*\sphinxvspacefixafterfrenchlists{% - \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi -} - -% Some are quite plain -% the spx@notice@bordercolor etc are set in the sphinxadmonition environment -\newenvironment{sphinxlightbox}{% - \par - \noindent{\color{spx@notice@bordercolor}% - \rule{\linewidth}{\spx@notice@border}}\par\nobreak - {\parskip\z@skip\noindent}% - } - {% - % counteract previous possible negative skip (French lists!): - % (we can't cancel that any earlier \vskip introduced a potential pagebreak) - \sphinxvspacefixafterfrenchlists - \nobreak\vbox{\noindent\kern\@totalleftmargin - {\color{spx@notice@bordercolor}% - \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax] - {\linewidth}{\spx@notice@border}}\hss}\allowbreak - }% end of sphinxlightbox environment definition -% may be renewenvironment'd by user for complete customization -\newenvironment{sphinxnote}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinxhint}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinximportant}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinxtip}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -% or just use the package options -% these are needed for common handling by notice environment of lightbox -% and heavybox but they are currently not used by lightbox environment -% and there is consequently no corresponding package option -\definecolor{sphinxnoteBgColor}{rgb}{1,1,1} -\definecolor{sphinxhintBgColor}{rgb}{1,1,1} -\definecolor{sphinximportantBgColor}{rgb}{1,1,1} -\definecolor{sphinxtipBgColor}{rgb}{1,1,1} - -% Others get more distinction -% Code adapted from framed.sty's "snugshade" environment. -% Nesting works (inner frames do not allow page breaks). -\newenvironment{sphinxheavybox}{\par - \setlength{\FrameRule}{\spx@notice@border}% - \setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax} - \advance\spx@image@maxheight - -\dimexpr2\FrameRule - +2\FrameSep - +\baselineskip\relax % will happen again if nested, needed indeed! - % configure framed.sty's parameters to obtain same vertical spacing - % as for "light" boxes. We need for this to manually insert parskip glue and - % revert a skip done by framed before the frame. - \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% - \vspace{\FrameHeightAdjust} - % copied/adapted from framed.sty's snugshade - \def\FrameCommand##1{\hskip\@totalleftmargin - \fboxsep\FrameSep \fboxrule\FrameRule - \fcolorbox{spx@notice@bordercolor}{spx@notice@bgcolor}{##1}% - \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% - \savenotes - % use a minipage if we are already inside a framed environment - \ifspx@inframed - \noindent\begin{minipage}{\linewidth} - \else - % handle case where notice is first thing in a list item (or is quoted) - \if@inlabel - \noindent\par\vspace{-\baselineskip} - \else - \vspace{\parskip} - \fi - \fi - \MakeFramed {\spx@inframedtrue - \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize - % minipage initialization copied from LaTeX source code. - \@pboxswfalse - \let\@listdepth\@mplistdepth \@mplistdepth\z@ - \@minipagerestore - \@setminipage }% - } - {% - \par\unskip - \@minipagefalse - \endMakeFramed - \ifspx@inframed\end{minipage}\fi - % set footnotes at bottom of page - \spewnotes - % arrange for similar spacing below frame as for "light" boxes. - \vskip .4\baselineskip - }% end of sphinxheavybox environment definition -% may be renewenvironment'd by user for complete customization -\newenvironment{sphinxwarning}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxcaution}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxattention}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxdanger}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxerror}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -% or just use package options - -% the \colorlet of xcolor (if at all loaded) is overkill for our use case -\newcommand{\sphinxcolorlet}[2] - {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname - \csname\@backslashchar color@#2\endcsname } - -% the main dispatch for all types of notices -\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading - % can't use #1 directly in definition of end part - \def\spx@noticetype {#1}% - % set parameters of heavybox/lightbox - \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}% - \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}% - \spx@notice@border \dimexpr\csname spx@opt@#1border\endcsname\relax - % start specific environment, passing the heading as argument - \begin{sphinx#1}{#2}} - % workaround some LaTeX "feature" of \end command - {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} - -\endinput diff --git a/sphinxlatexcontainers.sty b/sphinxlatexcontainers.sty deleted file mode 100644 index 93b2c8c..0000000 --- a/sphinxlatexcontainers.sty +++ /dev/null @@ -1,22 +0,0 @@ -%% CONTAINER DIRECTIVES -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexcontainers.sty}[2021/05/03 containers] - -% The purpose of this file is to provide a dummy environment sphinxclass which -% will be inserted for each class in each container directive. The class name -% will be passed as the argument to the environment. -% -% For a class foo, the user can define customised handling of that class by -% defining the sphinxclassfoo LaTeX environment. - -\newenvironment{sphinxuseclass}[1]{% - \def\sphinxClassFunctionName{sphinxclass#1}% - \ltx@ifundefined{\sphinxClassFunctionName}% - {}% undefined so do nothing - {\expandafter\begin\expandafter{\sphinxClassFunctionName}}% -}{% - \ltx@ifundefined{\sphinxClassFunctionName}% - {}% we did nothing so we keep doing nothing - {\expandafter\end\expandafter{\sphinxClassFunctionName}}% -}% diff --git a/sphinxlatexgraphics.sty b/sphinxlatexgraphics.sty deleted file mode 100644 index fd0aae6..0000000 --- a/sphinxlatexgraphics.sty +++ /dev/null @@ -1,122 +0,0 @@ -%% GRAPHICS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexgraphics.sty}[2021/01/27 graphics] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - macros: -% -% - \sphinxfigcaption -% - \sphinxincludegraphics -% -% - environments: -% -% - sphinxfigure-in-table -% -% May change: -% -% - \sphinxcaption (at begin document) -% -% Also provides: -% -% - \sphinxsafeincludegraphics (default of \sphinxincludegraphics since 2.0) -% - \spx@image@maxheight dimension (used by sphinxlatexadmonitions.sty) -% - \spx@image@box scratch box register (also used by sphinxlatexliterals.sty) -% -% Requires: -% \RequirePackage{graphicx}% done in sphinx.sty -\RequirePackage{amstext}% needed for \firstchoice@true(false) - -% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which -% is adjusted in indented environments), or taller than a certain maximal -% height (usually \textheight and this is reduced in the environments which use -% framed.sty to avoid infinite loop if image too tall). -% -% In case height or width options are present the rescaling is done -% (since 2.0), in a way keeping the width:height ratio either native from -% image or from the width and height options if both were present. -% -\newdimen\spx@image@maxheight -\AtBeginDocument{\spx@image@maxheight\textheight} - -% box scratch register -\newbox\spx@image@box -\newcommand*{\sphinxsafeincludegraphics}[2][]{% - % #1 contains possibly width=, height=, but no scale= since 1.8.4 - \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}% - \in@false % use some handy boolean flag - \ifdim \wd\spx@image@box>\linewidth - \in@true % flag to remember to adjust options and set box dimensions - % compute height which results from rescaling width to \linewidth - % and keep current aspect ratio. multiply-divide in \numexpr uses - % temporarily doubled precision, hence no overflow. (of course we - % assume \ht is not a few sp's below \maxdimen...(about 16384pt). - \edef\spx@image@rescaledheight % with sp units - {\the\numexpr\ht\spx@image@box - *\linewidth/\wd\spx@image@box sp}% - \ifdim\spx@image@rescaledheight>\spx@image@maxheight - % the rescaled height will be too big, so it is height which decides - % the rescaling factor - \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register - \edef\spx@image@requiredwidth % with sp units - {\the\numexpr\wd\spx@image@box - *\spx@image@maxheight/\ht\spx@image@box sp}% - % TODO: decide if this commented-out block could be needed due to - % rounding in numexpr operations going up - % \ifdim\spx@image@requiredwidth>\linewidth - % \def\spx@image@requiredwidth{\linewidth}% dimen register - % \fi - \else - \def\spx@image@requiredwidth{\linewidth}% dimen register - \let\spx@image@requiredheight\spx@image@rescaledheight% sp units - \fi - \else - % width is ok, let's check height - \ifdim\ht\spx@image@box>\spx@image@maxheight - \in@true - \edef\spx@image@requiredwidth % with sp units - {\the\numexpr\wd\spx@image@box - *\spx@image@maxheight/\ht\spx@image@box sp}% - \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register - \fi - \fi % end of check of width and height - \ifin@ - \setbox\spx@image@box - \hbox{\includegraphics - [%#1,% contained only width and/or height and overruled anyhow - width=\spx@image@requiredwidth,height=\spx@image@requiredheight]% - {#2}}% - % \includegraphics does not set box dimensions to the exactly - % requested ones, see https://github.com/latex3/latex2e/issues/112 - \wd\spx@image@box\spx@image@requiredwidth - \ht\spx@image@box\spx@image@requiredheight - \leavevmode\box\spx@image@box - \else - % here we do not modify the options, no need to adjust width and height - % on output, they will be computed exactly as with "draft" option - \setbox\spx@image@box\box\voidb@x % clear memory - \includegraphics[#1]{#2}% - \fi -}% -% Use the "safe" one by default (2.0) -\def\sphinxincludegraphics{\sphinxsafeincludegraphics} - - -%% FIGURE IN TABLE -% -\newenvironment{sphinxfigure-in-table}[1][\linewidth]{% - \def\@captype{figure}% - \sphinxsetvskipsforfigintablecaption - \begin{minipage}{#1}% -}{\end{minipage}} -% tabulary expands twice contents, we need to prevent double counter stepping -\newcommand*\sphinxfigcaption - {\ifx\equation$%$% this is trick to identify tabulary first pass - \firstchoice@false\else\firstchoice@true\fi - \spx@originalcaption } -\newcommand*\sphinxsetvskipsforfigintablecaption - {\abovecaptionskip\smallskipamount - \belowcaptionskip\smallskipamount} - -\endinput diff --git a/sphinxlatexindbibtoc.sty b/sphinxlatexindbibtoc.sty deleted file mode 100644 index 79e30a1..0000000 --- a/sphinxlatexindbibtoc.sty +++ /dev/null @@ -1,69 +0,0 @@ -%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexindbibtoc.sty}[2021/01/27 index, bib., toc] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - environments: (backup defaults or get redefined) -% -% - sphinxtheindex (direct mark-up or via python.ist or sphinx.xdy) -% - sphinxthebibliography -% -% - macros: (defines defaults) -% -% - \sphinxmaketitle -% - \sphinxtableofcontents -% - \sphinxnonalphabeticalgroupname -% - \sphinxsymbolsname -% - \sphinxnumbersname -% - \sphinxcite -% -% Requires: -\RequirePackage{makeidx} - -% fix the double index and bibliography on the table of contents -% in jsclasses (Japanese standard document classes) -\ifx\@jsc@uplatextrue\@undefined\else - \renewenvironment{sphinxtheindex} - {\cleardoublepage\phantomsection - \begin{theindex}} - {\end{theindex}} - - \renewenvironment{sphinxthebibliography}[1] - {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{#1}} - {\end{thebibliography}} -\fi - -% disable \@chappos in Appendix in pTeX -\ifx\kanjiskip\@undefined\else - \let\py@OldAppendix=\appendix - \renewcommand{\appendix}{ - \py@OldAppendix - \gdef\@chappos{} - } -\fi - -% make commands known to non-Sphinx document classes -\providecommand*{\sphinxmaketitle}{\maketitle} -\providecommand*{\sphinxtableofcontents}{\tableofcontents} -\ltx@ifundefined{sphinxthebibliography} - {\newenvironment - {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}% - } - {}% else clause of \ltx@ifundefined -\ltx@ifundefined{sphinxtheindex} - {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% - {}% else clause of \ltx@ifundefined - -% for usage with xindy: this string gets internationalized in preamble -\newcommand*{\sphinxnonalphabeticalgroupname}{} -% redefined in preamble, headings for makeindex produced index -\newcommand*{\sphinxsymbolsname}{} -\newcommand*{\sphinxnumbersname}{} - -\protected\def\sphinxcite{\cite} - - -\endinput diff --git a/sphinxlatexlists.sty b/sphinxlatexlists.sty deleted file mode 100644 index ed7521c..0000000 --- a/sphinxlatexlists.sty +++ /dev/null @@ -1,97 +0,0 @@ -%% ALPHANUMERIC LIST ITEMS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexlists.sty}[2021/01/27 lists] - -% Provides support for this output mark-up from Sphinx latex writer: -% - \sphinxsetlistlabels - -% Dependencies: the \spx@opt@maxlistdepth from sphinx.sty - -\newcommand\sphinxsetlistlabels[5] -{% #1 = style, #2 = enum, #3 = enumnext, #4 = prefix, #5 = suffix - % #2 and #3 are counters used by enumerate environment e.g. enumi, enumii. - % #1 is a macro such as \arabic or \alph - % prefix and suffix are strings (by default empty and a dot). - \@namedef{the#2}{#1{#2}}% - \@namedef{label#2}{#4\@nameuse{the#2}#5}% - \@namedef{p@#3}{\@nameuse{p@#2}#4\@nameuse{the#2}#5}% -}% - - -%% MAXLISTDEPTH -% -% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used. -% This is a hack, which works with the standard classes: it assumes \@toodeep -% is always used in "true" branches: "\if ... \@toodeep \else .. \fi." - -% will force use the "false" branch (if there is one) -\def\spx@toodeep@hack{\fi\iffalse} - -% do nothing if 'maxlistdepth' key not used or if package enumitem loaded. -\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi -\AtBeginDocument{% -\@ifpackageloaded{enumitem}{\remove@to@nnil}{}% - \let\spx@toodeepORI\@toodeep - \def\@toodeep{% - \ifnum\@listdepth<\spx@opt@maxlistdepth\relax - \expandafter\spx@toodeep@hack - \else - \expandafter\spx@toodeepORI - \fi}% -% define all missing \@list... macros - \count@\@ne - \loop - \ltx@ifundefined{@list\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \expandafter\let - \csname @list\romannumeral\the\count@\expandafter\endcsname - \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname - % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed) - \ltx@ifundefined{leftmargin\romannumeral\the\count@} - {\expandafter\let - \csname leftmargin\romannumeral\the\count@\expandafter\endcsname - \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}% - \advance\count@\@ne - \repeat -% define all missing enum... counters and \labelenum... macros and \p@enum.. - \count@\@ne - \loop - \ltx@ifundefined{c@enum\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \newcounter{enum\romannumeral\the\count@}% - \expandafter\def - \csname labelenum\romannumeral\the\count@\expandafter\endcsname - \expandafter - {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}% - \expandafter\def - \csname p@enum\romannumeral\the\count@\expandafter\endcsname - \expandafter - {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter - \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}% - \advance\count@\@ne - \repeat -% define all missing labelitem... macros - \count@\@ne - \loop - \ltx@ifundefined{labelitem\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \expandafter\let - \csname labelitem\romannumeral\the\count@\expandafter\endcsname - \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname - \advance\count@\@ne - \repeat - \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}% -\@gobble\@nnil -} - -\endinput diff --git a/sphinxlatexliterals.sty b/sphinxlatexliterals.sty deleted file mode 100644 index cc768c2..0000000 --- a/sphinxlatexliterals.sty +++ /dev/null @@ -1,804 +0,0 @@ -%% LITERAL BLOCKS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexliterals.sty}[2021/12/06 code-blocks and parsed literals] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - macros: -% - \sphinxLiteralBlockLabel -% - \sphinxSetupCaptionForVerbatim -% - \sphinxSetupCodeBlockInFootnote -% - \sphinxhref -% - \sphinxnolinkurl -% - \sphinxresetverbatimhllines -% - \sphinxunactivateextrasandspace -% - \sphinxupquote -% - \sphinxurl -% -% - environments: -% - sphinxVerbatim -% - sphinxVerbatimintable -% - sphinxalltt -% -% Dependency: -% -% - hyperref (for \phantomsection and \capstart) (loaded later) -% -% Executes \RequirePackage for: -% -% - framed -% - fancyvrb -% - alltt -% - upquote -% - needspace - -% also in sphinxlatexadmonitions.sty: -% This is a workaround to a "feature" of French lists, when literal block -% follows immediately; usable generally (does only \par then), a priori... -\providecommand*\sphinxvspacefixafterfrenchlists{% - \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi -} - -% For framing allowing pagebreaks -\RequirePackage{framed} -% For source code -% MEMO: fancyvrb is used mainly to -% 1- control horizontal and vertical spacing -% 2- optional line numbering -% 3- optional line emphasizing -% 4- while still allowing expansion of Pygments latex mark-up -% Other aspects such as framing, caption handling, codeline wrapping are -% added on top of it. We should stop using fancyvrb and implement -% 1, 2, 3, 4 by own Sphinx fully native Verbatim. This would allow to solve -% limitations with wrapped long code line not allowing page break. -\RequirePackage{fancyvrb} -% For parsed-literal blocks. -\RequirePackage{alltt} -% Display "real" single quotes in literal blocks. -\RequirePackage{upquote} -% Skip to next page if not enough space at bottom -\RequirePackage{needspace} - -% Based on use of "fancyvrb.sty"'s Verbatim. -% - with framing allowing page breaks ("framed.sty") -% - with breaking of long lines (exploits Pygments mark-up), -% - with possibly of a top caption, non-separable by pagebreak. -% - and usable inside tables or footnotes ("sphinxpackagefootnote.sty"). - -% for emphasizing lines -\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}} -% sphinxVerbatim must be usable by third party without requiring hllines set-up -\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}} -\sphinxresetverbatimhllines - -% Prior to Sphinx 1.5, \Verbatim and \endVerbatim were modified by Sphinx. -% The aliases defined here are used in sphinxVerbatim environment and can -% serve as hook-points with no need to modify \Verbatim itself. -\let\OriginalVerbatim \Verbatim -\let\endOriginalVerbatim\endVerbatim - -% for captions of literal blocks -% at start of caption title -\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock} -% this will be overwritten in document preamble by Babel translation -\newcommand*{\literalblockname}{Listing } -% file extension needed for \caption's good functioning, the file is created -% only if a \listof{literalblock}{foo} command is encountered, which is -% analogous to \listoffigures, but for the code listings (foo = chosen title.) -\newcommand*{\ext@literalblock}{lol} - -% if forced use of minipage encapsulation is needed (e.g. table cells) -\newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse - -% Framing macro for use with framed.sty's \FrameCommand -% - it obeys current indentation, -% - frame is \fboxsep separated from the contents, -% - the contents use the full available text width, -% - #1 = color of frame, #2 = color of background, -% - #3 = above frame, #4 = below frame, #5 = within frame, -% - #3 and #4 must be already typeset boxes; they must issue \normalcolor -% or similar, else, they are under scope of color #1 -\long\def\spx@fcolorbox #1#2#3#4#5{% - \hskip\@totalleftmargin - \hskip-\fboxsep\hskip-\fboxrule - % use of \color@b@x here is compatible with both xcolor.sty and color.sty - \color@b@x {\color{#1}\spx@CustomFBox{#3}{#4}}{\color{#2}}{#5}% - \hskip-\fboxsep\hskip-\fboxrule - \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth -}% -% #1 = for material above frame, such as a caption or a "continued" hint -% #2 = for material below frame, such as a caption or "continues on next page" -% #3 = actual contents, which will be typeset with a background color -\long\def\spx@CustomFBox#1#2#3{% - \begingroup - \setbox\@tempboxa\hbox{{#3}}% inner braces to avoid color leaks - \vbox{#1% above frame - % draw frame border _latest_ to avoid pdf viewer issue - \kern\fboxrule - \hbox{\kern\fboxrule - \copy\@tempboxa - \kern-\wd\@tempboxa\kern-\fboxrule - \vrule\@width\fboxrule - \kern\wd\@tempboxa - \vrule\@width\fboxrule}% - \kern-\dimexpr\ht\@tempboxa+\dp\@tempboxa+\fboxrule\relax - \hrule\@height\fboxrule - \kern\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax - \hrule\@height\fboxrule - #2% below frame - }% - \endgroup -}% -\def\spx@fcolorbox@put@c#1{% hide width from framed.sty measuring - \moveright\dimexpr\fboxrule+.5\wd\@tempboxa\hb@xt@\z@{\hss#1\hss}% -}% -\def\spx@fcolorbox@put@r#1{% right align with contents, width hidden - \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep\hb@xt@\z@{\hss#1}% -}% -\def\spx@fcolorbox@put@l#1{% left align with contents, width hidden - \moveright\dimexpr\fboxrule+\fboxsep\hb@xt@\z@{#1\hss}% -}% -% -\def\sphinxVerbatim@Continued - {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname - {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% -\def\sphinxVerbatim@Continues - {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname - {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% -\def\sphinxVerbatim@Title - {\spx@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}}% -\let\sphinxVerbatim@Before\@empty -\let\sphinxVerbatim@After\@empty -% Defaults are redefined in document preamble according to language -\newcommand*\literalblockcontinuedname{continued from previous page}% -\newcommand*\literalblockcontinuesname{continues on next page}% -% -\def\spx@verbatimfcolorbox{\spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}}% -\def\sphinxVerbatim@FrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@After}% -\def\sphinxVerbatim@FirstFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@Continues}% -\def\sphinxVerbatim@MidFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@Continues}% -\def\sphinxVerbatim@LastFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@After}% - -% For linebreaks inside Verbatim environment from package fancyvrb. -\newbox\sphinxcontinuationbox -\newbox\sphinxvisiblespacebox -\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox} - -% Take advantage of the already applied Pygments mark-up to insert -% potential linebreaks for TeX processing. -% {, <, #, %, $, ' and ": go to next line. -% _, }, ^, &, >, -, ~, and \: stay at end of broken line. -% Use of \textquotesingle for straight quote. -% FIXME: convert this to package options ? -\newcommand*\sphinxbreaksbeforelist {% - \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %, - \do\PYGZdl\$\do\PYGZdq\"% $, " - \def\PYGZsq - {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% ' -} -\newcommand*\sphinxbreaksafterlist {% - \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &, - \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~ - \do\PYGZbs\\% \ -} -\newcommand*\sphinxbreaksatspecials {% - \def\do##1##2% - {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% - \sphinxbreaksbeforelist - \def\do##1##2% - {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% - \sphinxbreaksafterlist -} - -\def\sphinx@verbatim@nolig@list {\do \`}% -% Some characters . , ; ? ! / are neither pygmentized nor "tex-escaped". -% This macro makes them "active" and they will insert potential linebreaks. -% Not compatible with math mode (cf \sphinxunactivateextras). -\newcommand*\sphinxbreaksbeforeactivelist {}% none -\newcommand*\sphinxbreaksafteractivelist {\do\.\do\,\do\;\do\?\do\!\do\/} -\newcommand*\sphinxbreaksviaactive {% - \def\do##1{\lccode`\~`##1% - \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}% - \catcode`##1\active}% - \sphinxbreaksbeforeactivelist - \def\do##1{\lccode`\~`##1% - \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}% - \catcode`##1\active}% - \sphinxbreaksafteractivelist - \lccode`\~`\~ -} - -% If the linebreak is at a space, the latter will be displayed as visible -% space at end of first line, and a continuation symbol starts next line. -\def\spx@verbatim@space {% - \nobreak\hskip\z@skip - \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak} - {\kern\fontdimen2\font}% -}% - -% if the available space on page is less than \literalblockneedspace, insert pagebreak -\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} -\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} -% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. -% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. -\newcommand*\sphinxVerbatimTitle {} -% This box to typeset the caption before framed.sty multiple passes for framing. -\newbox\sphinxVerbatim@TitleBox -% This box to measure contents if nested as inner \MakeFramed requires then -% minipage encapsulation but too long contents then break outer \MakeFramed -\newbox\sphinxVerbatim@ContentsBox -% Holder macro for labels of literal blocks. Set-up by LaTeX writer. -\newcommand*\sphinxLiteralBlockLabel {} -\newcommand*\sphinxSetupCaptionForVerbatim [1] -{% - \sphinxvspacefixafterfrenchlists - \needspace{\sphinxliteralblockneedspace}% -% insert a \label via \sphinxLiteralBlockLabel -% reset to normal the color for the literal block caption - \def\sphinxVerbatimTitle - {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}% -} -\newcommand*\sphinxSetupCodeBlockInFootnote {% - \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption - \sphinxverbatimwithminipagetrue % reduces vertical spaces - % we counteract (this is in a group) the \@normalsize from \caption - \let\normalsize\footnotesize\let\@parboxrestore\relax - \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% -} -\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount} -% serves to implement line highlighting and line wrapping -\newcommand\sphinxFancyVerbFormatLine[1]{% - \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}% - \ifin@ - \sphinxVerbatimHighlightLine{#1}% - \else - \sphinxVerbatimFormatLine{#1}% - \fi -}% -\newcommand\sphinxVerbatimHighlightLine[1]{% - \edef\sphinxrestorefboxsep{\fboxsep\the\fboxsep\relax}% - \fboxsep0pt\relax % cf LaTeX bug graphics/4524 - \colorbox{sphinxVerbatimHighlightColor}% - {\sphinxrestorefboxsep\sphinxVerbatimFormatLine{#1}}% - % no need to restore \fboxsep here, as this ends up in a \hbox from fancyvrb -}% -% \sphinxVerbatimFormatLine will be set locally to one of those two: -\newcommand\sphinxVerbatimFormatLineWrap{% - \hsize\linewidth - \ifspx@opt@verbatimforcewraps - \expandafter\spx@verb@FormatLineForceWrap - \else\expandafter\spx@verb@FormatLineWrap - \fi -}% -\newcommand\sphinxVerbatimFormatLineNoWrap[1]{\hb@xt@\linewidth{\strut #1\hss}}% -\long\def\spx@verb@FormatLineWrap#1{% - \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ - \doublehyphendemerits\z@\finalhyphendemerits\z@ - \strut #1\strut}% -}% -% -% The normal line wrapping allows breaks at spaces and ascii non -% letters, non digits. The \raggedright above means there will be -% an overfilled line only if some non-breakable "word" was -% encountered, which is longer than a line (it is moved always to -% be on its own on a new line). -% -% The "forced" line wrapping will parse the tokens to add potential -% breakpoints at each character. As some strings are highlighted, -% we have to apply the highlighting character per character, which -% requires to manipulate the output of the Pygments LaTeXFormatter. -% -% Doing this at latex level is complicated. The contents should -% be as expected: i.e. some active characters from -% \sphinxbreaksviaactive, some Pygments character escapes such as -% \PYGZdl{}, and the highlighting \PYG macro with always 2 -% arguments. No other macros should be there, except perhaps -% zero-parameter macros. In particular: -% - the texcomments Pygments option must be set to False -% -% With pdflatex, Unicode input gives multi-bytes characters -% where the first byte is active. We support the "utf8" macros -% only. "utf8x" is not supported. -% -% The highlighting macro \PYG will be applied character per -% character. Highlighting via a colored background gives thus a -% chain of small colored boxes which may cause some artefact in -% some pdf viewers. Can't do anything here if we do want the line -% break to be possible. -% -% First a measurement step is done of what would the standard line -% wrapping give (i.e line breaks only at spaces and non-letter, -% non-digit ascii characters), cf TeX by Topic for the basic -% dissecting technique: TeX unfortunately when building a vertical -% box does not store in an accessible way what was the maximal -% line-width during paragraph building. -% -% Avoid LaTeX 2021 alteration of \@@par which potentially could break our -% measurement step (typically if the para/after hook is configured to use -% \vspace). Of course, breakage could happen only from user or package -% adding things to basic Sphinx latex. And perhaps spring LaTeX 2021 will -% provide a non-hooked \@@par, but this should work anyway and can't be -% beaten for speed. -\ltx@ifundefined{tex_par:D} -% We could use \@ifl@t@r\fmtversion{2020/02/02}{use \tex_par:D}{use \@@par}. - {\let\spx@par\@@par}% \@@par is then expected to be TeX's original \par - {\expandafter\let\expandafter\spx@par\csname tex_par:D\endcsname} -% More hesitation for avoiding the at-start-of-par hooks for our -% measurement : 1. with old LaTeX, we can not avoid hooks from everyhook -% or similar packages, 2. and perhaps the hooks add stuff which we should -% actually measure. Ideally, hooks are for inserting things in margin -% which do not change spacing. Most everything else in fact should not be -% executed in our scratch box for measurement, such as counter stepping. -\ltx@ifundefined{tex_everypar:D} - {\let\spx@everypar\everypar} - {\expandafter\let\expandafter\spx@everypar\csname tex_everypar:D\endcsname} -% -% If the max width exceeds the linewidth by more than verbatimmaxoverfull -% character widths, or if the min width plus verbatimmaxunderfull character -% widths is inferior to linewidth, then we apply the "force wrapping" with -% potential line break at each character, else we don't. -\long\def\spx@verb@FormatLineForceWrap#1{% - % \spx@image@box is a scratch box register that we can use here - \global\let\spx@verb@maxwidth\z@ - \global\let\spx@verb@minwidth\linewidth - \setbox\spx@image@box - \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ - \doublehyphendemerits\z@\finalhyphendemerits\z@ - \spx@everypar{}\noindent\strut #1\strut\spx@par - \spx@verb@getwidths}% - \ifdim\spx@verb@maxwidth> - \dimexpr\linewidth+\spx@opt@verbatimmaxoverfull\fontcharwd\font`X \relax - \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}% - \else - \ifdim\spx@verb@minwidth< - \dimexpr\linewidth-\spx@opt@verbatimmaxunderfull\fontcharwd\font`X \relax - \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}% - \else - \spx@verb@FormatLineWrap{#1}% - \fi\fi -}% -% auxiliary paragraph dissector to get max and min widths -% but minwidth must not take into account the last line -\newbox\spx@scratchbox -\def\spx@verb@getwidths {% - \unskip\unpenalty - \setbox\spx@scratchbox\lastbox - \ifvoid\spx@scratchbox - \else - \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}% - \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox - \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}% - \fi - \expandafter\spx@verb@getwidths@loop - \fi -}% -\def\spx@verb@getwidths@loop {% - \unskip\unpenalty - \setbox\spx@scratchbox\lastbox - \ifvoid\spx@scratchbox - \else - \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}% - \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox - \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}% - \fi - \ifdim\spx@verb@minwidth>\wd\spx@scratchbox - \xdef\spx@verb@minwidth{\number\wd\spx@scratchbox sp}% - \fi - \expandafter\spx@verb@getwidths@loop - \fi -}% -% auxiliary macros to implement "cut long line even in middle of word" -\catcode`Z=3 % safe delimiter -\def\spx@verb@wrapPYG{% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@i -}% -\def\spx@verb@wrapPYG@i{% - \ifx\spx@nexttoken\spx@verb@wrapPYG\let\next=\@gobble\else - \ifx\spx@nexttoken\PYG\let\next=\spx@verb@wrapPYG@PYG@onebyone\else - \discretionary{}{\sphinxafterbreak}{}% - \let\next\spx@verb@wrapPYG@ii - \fi\fi - \next -}% -% Let's recognize active characters. We don't support utf8x only utf8. -% And here #1 should not have picked up (non empty) braced contents -\long\def\spx@verb@wrapPYG@ii#1{% - \ifcat\noexpand~\noexpand#1\relax% active character - \expandafter\spx@verb@wrapPYG@active - \else % non-active character, control sequence such as \PYGZdl, or empty - \expandafter\spx@verb@wrapPYG@one - \fi {#1}% -}% -\long\def\spx@verb@wrapPYG@active#1{% -% Let's hope expansion of active character does not really require arguments, -% as we certainly don't want to go into expanding upfront token stream anyway. - \expandafter\spx@verb@wrapPYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% -}% -\long\def\spx@verb@wrapPYG@iii#1#2Z{% - \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@four\else - \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@three\else - \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@two\else - \let\next=\spx@verb@wrapPYG@one - \fi\fi\fi - \next -}% -\long\def\spx@verb@wrapPYG@one #1{#1\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% -\long\def\spx@verb@wrapPYG@two #1#2{#1#2\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% -\long\def\spx@verb@wrapPYG@three #1#2#3{#1#2#3\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% -\long\def\spx@verb@wrapPYG@four #1#2#3#4{#1#2#3#4\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% -% Replace \PYG by itself applied one character at a time! This way breakpoints -% can be inserted. -\def\spx@verb@wrapPYG@PYG@onebyone#1#2#3{% #1 = \PYG, #2 = highlight spec, #3 = tokens - \def\spx@verb@wrapPYG@PYG@spec{{#2}}% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i#3Z% -}% -\def\spx@verb@wrapPYG@PYG@i{% - \ifx\spx@nexttokenZ\let\next=\spx@verb@wrapPYG@PYG@done\else - \discretionary{}{\sphinxafterbreak}{}% - \let\next\spx@verb@wrapPYG@PYG@ii - \fi - \next -}% -\def\spx@verb@wrapPYG@PYG@doneZ{\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% -\long\def\spx@verb@wrapPYG@PYG@ii#1{% - \ifcat\noexpand~\noexpand#1\relax% active character - \expandafter\spx@verb@wrapPYG@PYG@active - \else % non-active character, control sequence such as \PYGZdl, or empty - \expandafter\spx@verb@wrapPYG@PYG@one - \fi {#1}% -}% -\long\def\spx@verb@wrapPYG@PYG@active#1{% -% Let's hope expansion of active character does not really require arguments, -% as we certainly don't want to go into expanding upfront token stream anyway. - \expandafter\spx@verb@wrapPYG@PYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% -}% -\long\def\spx@verb@wrapPYG@PYG@iii#1#2Z{% - \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@PYG@four\else - \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@PYG@three\else - \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@PYG@two\else - \let\next=\spx@verb@wrapPYG@PYG@one - \fi\fi\fi - \next -}% -\long\def\spx@verb@wrapPYG@PYG@one#1{% - \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1}% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i -}% -\long\def\spx@verb@wrapPYG@PYG@two#1#2{% - \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2}% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i -}% -\long\def\spx@verb@wrapPYG@PYG@three#1#2#3{% - \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3}% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i -}% -\long\def\spx@verb@wrapPYG@PYG@four#1#2#3#4{% - \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3#4}% - \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i -}% -\catcode`Z 11 % -% -\g@addto@macro\FV@SetupFont{% - \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% - \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% -}% -\newenvironment{sphinxVerbatim}{% - % first, let's check if there is a caption - \ifx\sphinxVerbatimTitle\empty - \sphinxvspacefixafterfrenchlists - \parskip\z@skip - \vskip\sphinxverbatimsmallskipamount - % there was no caption. Check if nevertheless a label was set. - \ifx\sphinxLiteralBlockLabel\empty\else - % we require some space to be sure hyperlink target from \phantomsection - % will not be separated from upcoming verbatim by a page break - \needspace{\sphinxliteralblockwithoutcaptionneedspace}% - \phantomsection\sphinxLiteralBlockLabel - \fi - \else - \parskip\z@skip - \if t\spx@opt@literalblockcappos - \vskip\spx@abovecaptionskip - \def\sphinxVerbatim@Before - {\sphinxVerbatim@Title\nointerlineskip - \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace - % if no frame (code-blocks inside table cells), remove - % the "verbatimsep" whitespace from the top (better visually) - \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi - % caption package adds \abovecaptionskip vspace, remove it - \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}% - \else - \vskip\sphinxverbatimsmallskipamount - \def\sphinxVerbatim@After - {\nointerlineskip\kern\dimexpr\dp\strutbox - \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi - \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax - \sphinxVerbatim@Title}% - \fi - \def\@captype{literalblock}% - \capstart - % \sphinxVerbatimTitle must reset color - \setbox\sphinxVerbatim@TitleBox - \hbox{\begin{minipage}{\linewidth}% - % caption package may detect wrongly if top or bottom, so we help it - \spx@ifcaptionpackage - {\caption@setposition{\spx@opt@literalblockcappos}}{}% - \sphinxVerbatimTitle - \end{minipage}}% - \fi - \global\let\sphinxLiteralBlockLabel\empty - \global\let\sphinxVerbatimTitle\empty - \fboxsep\sphinxverbatimsep \fboxrule\sphinxverbatimborder - \ifspx@opt@verbatimwithframe\else\fboxrule\z@\fi - \let\FrameCommand \sphinxVerbatim@FrameCommand - \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand - \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand - \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand - \ifspx@opt@verbatimhintsturnover\else - \let\sphinxVerbatim@Continued\@empty - \let\sphinxVerbatim@Continues\@empty - \fi - \ifspx@opt@verbatimwrapslines - % fancyvrb's Verbatim puts each input line in (unbreakable) horizontal boxes. - % This customization wraps each line from the input in a \vtop, thus - % allowing it to wrap and display on two or more lines in the latex output. - % - The codeline counter will be increased only once. - % - The wrapped material will not break across pages, it is impossible - % to achieve this without extensive rewrite of fancyvrb. - % - The (not used in sphinx) obeytabs option to Verbatim is - % broken by this change (showtabs and tabspace work). - \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineWrap - \let\FV@Space\spx@verbatim@space - % Allow breaks at special characters using \PYG... macros. - \sphinxbreaksatspecials - % Breaks at punctuation characters . , ; ? ! and / (needs catcode activation) - \fvset{codes*=\sphinxbreaksviaactive}% - \else % end of conditional code for wrapping long code lines - \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineNoWrap - \fi - \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine - \VerbatimEnvironment - % workaround to fancyvrb's check of current list depth - \def\@toodeep {\advance\@listdepth\@ne}% - % The list environment is needed to control perfectly the vertical space. - % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt. - % - if caption: distance from last text baseline to caption baseline is - % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B = - % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt. - % Formula valid for F < 10pt. - % - distance of baseline of caption to top of frame is like for tables: - % \sphinxbelowcaptionspace (=0.5\baselineskip) - % - if no caption: distance of last text baseline to code frame is S+(B-F), - % with S = \sphinxverbatimtopskip (=\smallskip) - % - and distance from bottom of frame to next text baseline is - % \baselineskip+\parskip. - % The \trivlist is used to avoid possible "too deeply nested" error. - \itemsep \z@skip - \topsep \z@skip - \partopsep \z@skip - % trivlist will set \parsep to \parskip (which itself is set to zero above) - % \leftmargin will be set to zero by trivlist - \rightmargin\z@ - \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten. - \trivlist\item\relax - \ifspx@inframed\setbox\sphinxVerbatim@ContentsBox\vbox\bgroup - \@setminipage\hsize\linewidth - % use bulk of minipage paragraph shape restores (this is needed - % in indented contexts, at least for some) - \textwidth\hsize \columnwidth\hsize \@totalleftmargin\z@ - \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip - \else - \ifsphinxverbatimwithminipage\noindent\begin{minipage}{\linewidth}\fi - \MakeFramed {% adapted over from framed.sty's snugshade environment - \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage - }% - \fi - % For grid placement from \strut's in \FancyVerbFormatLine - \lineskip\z@skip - % active comma should not be overwritten by \@noligs - \ifspx@opt@verbatimwrapslines - \let\verbatim@nolig@list \sphinx@verbatim@nolig@list - \fi - % will fetch its optional arguments if any - \OriginalVerbatim -} -{% - \endOriginalVerbatim - \ifspx@inframed - \egroup % finish \sphinxVerbatim@ContentsBox vbox - \nobreak % update page totals - \ifdim\dimexpr\ht\sphinxVerbatim@ContentsBox+ - \dp\sphinxVerbatim@ContentsBox+ - \ht\sphinxVerbatim@TitleBox+ - \dp\sphinxVerbatim@TitleBox+ - 2\fboxsep+2\fboxrule+ - % try to account for external frame parameters - \FrameSep+\FrameRule+ - % Usage here of 2 baseline distances is empirical. - % In border case where code-block fits barely in remaining space, - % it gets framed and looks good but the outer frame may continue - % on top of next page and give (if no contents after code-block) - % an empty framed line, as testing showed. - 2\baselineskip+ - % now add all to accumulated page totals and compare to \pagegoal - \pagetotal+\pagedepth>\pagegoal - % long contents: do not \MakeFramed. Do make a caption (either before or - % after) if title exists. Continuation hints across pagebreaks dropped. - % FIXME? a bottom caption may end up isolated at top of next page - % (no problem with a top caption, which is default) - \spx@opt@verbatimwithframefalse - \def\sphinxVerbatim@Title{\noindent\box\sphinxVerbatim@TitleBox\par}% - \sphinxVerbatim@Before - \noindent\unvbox\sphinxVerbatim@ContentsBox\par - \sphinxVerbatim@After - \else - % short enough contents: use \MakeFramed. As it is nested, this requires - % minipage encapsulation. - \noindent\begin{minipage}{\linewidth}% - \MakeFramed {% Use it now with the fetched contents - \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage - }% - \unvbox\sphinxVerbatim@ContentsBox - % some of this may be superfluous: - \par\unskip\@minipagefalse\endMakeFramed - \end{minipage}% - \fi - \else % non-nested \MakeFramed - \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade - \ifsphinxverbatimwithminipage\end{minipage}\fi - \fi - \endtrivlist -} -\newenvironment {sphinxVerbatimNoFrame} - {\spx@opt@verbatimwithframefalse - \VerbatimEnvironment - \begin{sphinxVerbatim}} - {\end{sphinxVerbatim}} -\newenvironment {sphinxVerbatimintable} - {% don't use a frame if in a table cell - \spx@opt@verbatimwithframefalse - \sphinxverbatimwithminipagetrue - % the literal block caption uses \sphinxcaption which is wrapper of \caption, - % but \caption must be modified because longtable redefines it to work only - % for the own table caption, and tabulary has multiple passes - \let\caption\sphinxfigcaption - % reduce above caption skip - \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% - \VerbatimEnvironment - \begin{sphinxVerbatim}} - {\end{sphinxVerbatim}} - - -%% PARSED LITERALS -% allow long lines to wrap like they do in code-blocks - -% this should be kept in sync with definitions in sphinx.util.texescape -\newcommand*\sphinxbreaksattexescapedchars{% - \def\do##1##2% put potential break point before character - {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% - \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $ - \def\do##1##2% put potential break point after character - {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% - \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &, - \do\textgreater\>\do\textasciitilde\~% >, ~ - \do\textbackslash\\% \ -} -\newcommand*\sphinxbreaksviaactiveinparsedliteral{% - \sphinxbreaksviaactive % by default handles . , ; ? ! / - \lccode`\~`\~ % - % update \dospecials as it is used by \url - % but deactivation will already have been done hence this is unneeded: - % \expandafter\def\expandafter\dospecials\expandafter{\dospecials - % \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}% -} -\newcommand*\sphinxbreaksatspaceinparsedliteral{% - \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~ -} -\newcommand*{\sphinxunactivateextras}{\let\do\@makeother - \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist}% -% the \catcode13=5\relax (deactivate end of input lines) is left to callers -\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax - \sphinxunactivateextras}% -% alltt uses a monospace font and linebreaks at dashes (which are escaped -% to \sphinxhyphen{} which expands to -\kern\z@) are inhibited with pdflatex. -% Not with xelatex (cf \defaultfontfeatures in latex writer), so: -\newcommand*{\sphinxhypheninparsedliteral}{\sphinxhyphennobreak} -% now for the modified alltt environment -\newenvironment{sphinxalltt} -{% at start of next line to workaround Emacs/AUCTeX issue with this file -\begin{alltt}% - \ifspx@opt@parsedliteralwraps - \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% - \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% - \let\sphinxhyphen\sphinxhypheninparsedliteral - \sphinxbreaksattexescapedchars - \sphinxbreaksviaactiveinparsedliteral - \sphinxbreaksatspaceinparsedliteral -% alltt takes care of the ' as derivative ("prime") in math mode - \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace - \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% -% not sure if displayed math (align,...) can end up in parsed-literal, anyway - \everydisplay\expandafter{\the\everydisplay - \catcode13=5 \sphinxunactivateextrasandspace - \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% - \fi } -{\end{alltt}} - - -%% INLINE MARK-UP -% - -% Protect \href's first argument in contexts such as sphinxalltt (or -% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref. -\protected\def\sphinxhref#1#2{{% - \sphinxunactivateextrasandspace % never do \scantokens with active space! -% for the \endlinechar business, https://github.com/latex3/latex2e/issues/286 - \endlinechar\m@ne\everyeof{{\endlinechar13 #2}}% keep catcode regime for #2 - \scantokens{\href{#1}}% normalise it for #1 during \href expansion -}} -% Same for \url. And also \nolinkurl for coherence. -\protected\def\sphinxurl#1{{% - \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens) - \endlinechar\m@ne\scantokens{\url{#1}}% -}} -\protected\def\sphinxnolinkurl#1{{% - \sphinxunactivateextrasandspace\everyeof{}% - \endlinechar\m@ne\scantokens{\nolinkurl{#1}}% -}} - -% \sphinxupquote -% to obtain straight quotes we execute \@noligs as patched by upquote, and -% \scantokens is needed in cases where it would be too late for the macro to -% first set catcodes and then fetch its argument. We also make the contents -% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive, -% and also at \ character (which is escaped to \textbackslash{}). -\protected\def\sphinxtextbackslashbreakbefore - {\discretionary{}{\sphinxafterbreak\sphinx@textbackslash}{\sphinx@textbackslash}} -\protected\def\sphinxtextbackslashbreakafter - {\discretionary{\sphinx@textbackslash}{\sphinxafterbreak}{\sphinx@textbackslash}} -\let\sphinxtextbackslash\sphinxtextbackslashbreakafter -% - is escaped to \sphinxhyphen{} and this default ensures no linebreak -% behaviour (also with a non monospace font, or with xelatex) -\newcommand*{\sphinxhyphenininlineliteral}{\sphinxhyphennobreak} -% the macro must be protected if it ends up used in moving arguments, -% in 'alltt' \@noligs is done already, and the \scantokens must be avoided. -\protected\def\sphinxupquote#1{{\def\@tempa{alltt}% - \ifx\@tempa\@currenvir\else - \let\sphinxhyphen\sphinxhyphenininlineliteral - \ifspx@opt@inlineliteralwraps - % break at . , ; ? ! / - \sphinxbreaksviaactive - % break also at \ - \setbox8=\hbox{\textbackslash}% - \def\sphinx@textbackslash{\copy8}% - \let\textbackslash\sphinxtextbackslash - % by default, no continuation symbol on next line but may be added - \let\sphinxafterbreak\sphinxafterbreakofinlineliteral - % do not overwrite the comma set-up - \let\verbatim@nolig@list\sphinx@literal@nolig@list - \fi - % fix a space-gobbling issue due to LaTeX's original \do@noligs -% TODO: using \@noligs as patched by upquote.sty is now unneeded because -% either ` and ' are escaped (non-unicode engines) or they don't build -% ligatures (unicode engines). Thus remove this and unify handling of `, <, >, -% ' and - with the characters . , ; ? ! / as handled via -% \sphinxbreaksviaactive. -% Hence \sphinx@do@noligs will be removed, or rather replaced with code -% inserting discretionaries, as they allow a continuation symbol on start of -% next line to achieve common design with code-blocks. - \let\do@noligs\sphinx@do@noligs - \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref) - \expandafter\scantokens - \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue... -\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax - \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}} -\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}% -\let\sphinxafterbreakofinlineliteral\empty - - -\endinput diff --git a/sphinxlatexnumfig.sty b/sphinxlatexnumfig.sty deleted file mode 100644 index 6d72961..0000000 --- a/sphinxlatexnumfig.sty +++ /dev/null @@ -1,122 +0,0 @@ -%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexnumfig.sty}[2021/01/27 numbering] - -% Requires: remreset (old LaTeX only) -% relates to numfig and numfig_secnum_depth configuration variables - -% LaTeX 2018-04-01 and later provides \@removefromreset -\ltx@ifundefined{@removefromreset} - {\RequirePackage{remreset}} - {}% avoid warning -% Everything is delayed to \begin{document} to allow hyperref patches into -% \newcounter to solve duplicate label problems for internal hyperlinks to -% code listings (literalblock counter). User or extension re-definitions of -% \theliteralblock, et al., thus have also to be delayed. (changed at 3.5.0) -\AtBeginDocument{% -\ltx@ifundefined{c@chapter} - {\newcounter{literalblock}}% - {\newcounter{literalblock}[chapter]% - \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi - \arabic{literalblock}}% - }% -\ifspx@opt@nonumfigreset - \ltx@ifundefined{c@chapter}{}{% - \@removefromreset{figure}{chapter}% - \@removefromreset{table}{chapter}% - \@removefromreset{literalblock}{chapter}% - \ifspx@opt@mathnumfig - \@removefromreset{equation}{chapter}% - \fi - }% - \def\thefigure{\arabic{figure}}% - \def\thetable {\arabic{table}}% - \def\theliteralblock{\arabic{literalblock}}% - \ifspx@opt@mathnumfig - \def\theequation{\arabic{equation}}% - \fi -\else -\let\spx@preAthefigure\@empty -\let\spx@preBthefigure\@empty -% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean -% % as sphinx.sty package option -% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning) -% LaTeX core per default does not reset chapter or section -% counters at each part. -% But if we modify this, we need to redefine \thechapter, \thesection to -% include the part number and this will cause problems in table of contents -% because of too wide numbering. Simplest is to do nothing. -% \fi -\ifnum\spx@opt@numfigreset>0 - \ltx@ifundefined{c@chapter} - {} - {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}% - \g@addto@macro\spx@preBthefigure{\fi}}% -\fi -\ifnum\spx@opt@numfigreset>1 - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{literalblock}{section}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{section}% - \fi% - \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>2 - \@addtoreset{figure}{subsection}% - \@addtoreset{table}{subsection}% - \@addtoreset{literalblock}{subsection}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subsection}% - \fi% - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>3 - \@addtoreset{figure}{subsubsection}% - \@addtoreset{table}{subsubsection}% - \@addtoreset{literalblock}{subsubsection}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subsubsection}% - \fi% - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>4 - \@addtoreset{figure}{paragraph}% - \@addtoreset{table}{paragraph}% - \@addtoreset{literalblock}{paragraph}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{paragraph}% - \fi% - \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>5 - \@addtoreset{figure}{subparagraph}% - \@addtoreset{table}{subparagraph}% - \@addtoreset{literalblock}{subparagraph}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subparagraph}% - \fi% - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\expandafter\g@addto@macro -\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}% -\let\thefigure\spx@preAthefigure -\let\thetable\spx@preAthefigure -\let\theliteralblock\spx@preAthefigure -\g@addto@macro\thefigure{\arabic{figure}}% -\g@addto@macro\thetable{\arabic{table}}% -\g@addto@macro\theliteralblock{\arabic{literalblock}}% - \ifspx@opt@mathnumfig - \let\theequation\spx@preAthefigure - \g@addto@macro\theequation{\arabic{equation}}% - \fi -\fi -}% end of big \AtBeginDocument - -\endinput diff --git a/sphinxlatexobjects.sty b/sphinxlatexobjects.sty deleted file mode 100644 index 3deda5c..0000000 --- a/sphinxlatexobjects.sty +++ /dev/null @@ -1,215 +0,0 @@ -%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexobjects.sty}[2021/12/05 documentation environments] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - environments -% -% - fulllineitems -% - productionlist -% - optionlist -% - DUlineblock (also "lineblock") -% -% - macros -% -% - \DUrole -% - various legacy support macros related to author and release -% data of documented objects and modules. - -% \moduleauthor{name}{email} -\newcommand{\moduleauthor}[2]{} - -% \sectionauthor{name}{email} -\newcommand{\sectionauthor}[2]{} - -% Allow the release number to be specified independently of the -% \date{}. This allows the date to reflect the document's date and -% release to specify the release that is documented. -% -\newcommand{\py@release}{\releasename\space\version} -\newcommand{\version}{}% part of \py@release, used by title page and headers -% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls) -\newcommand{\releaseinfo}{} -\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}} -% this is inserted via template and #1=release config variable -\newcommand{\release}[1]{\renewcommand{\version}{#1}} -% this is defined by template to 'releasename' latex_elements key -\newcommand{\releasename}{} -% Fix issue in case release and releasename deliberately left blank -\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition -\newcommand{\sphinxifemptyorblank}[1]{% -% test after one expansion of macro #1 if contents is empty or spaces - \if&\expandafter\@firstofone\detokenize\expandafter{#1}&% - \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% -\AtBeginDocument {% - \sphinxifemptyorblank{\releasename} - {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}} - {}% -}% - -% Allow specification of the author's address separately from the -% author's name. This can be used to format them differently, which -% is a good thing. -% -\newcommand{\py@authoraddress}{} -\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} - -% {fulllineitems} is the main environment for object descriptions. -% -% With 4.0.0 \pysigline (and \pysiglinewithargsret), used in a fulllineitems -% environment the #1 will already be of the width which is computed here, i.e. -% the available width on line, so the \makebox becomes a bit superfluous -\newcommand{\py@itemnewline}[1]{% macro used as \makelabel in fulllineitems -% Memo: this presupposes \itemindent is 0pt - \kern\labelsep % because \@labels core latex box does \hskip-\labelsep - \makebox[\dimexpr\linewidth+\labelwidth\relax][l]{#1}% - \kern-\labelsep % because at end of \@labels box there is \hskip\labelsep -} - -\newenvironment{fulllineitems}{% - \begin{list}{}{\labelwidth \leftmargin - \rightmargin \z@ \topsep -\parskip \partopsep \parskip - \itemsep -\parsep - \let\makelabel=\py@itemnewline}% -}{\end{list}} - -% Signatures, possibly multi-line -% -\newlength{\py@argswidth} -\newcommand{\py@sigparams}[2]{% - % The \py@argswidth has been computed in \pysiglinewithargsret to make this - % occupy full available width on line. - \parbox[t]{\py@argswidth}{\raggedright #1\sphinxcode{)}#2\strut}% - % final strut is to help get correct vertical separation in case of multi-line - % box with the item contents. -} -\newcommand{\pysigline}[1]{% -% the \py@argswidth is available we use it despite its name (no "args" here) -% the \relax\relax is because \py@argswidth is a "skip" variable and the first -% \relax only ends its "dimen" part - \py@argswidth=\dimexpr\linewidth+\labelwidth\relax\relax - \item[{\parbox[t]{\py@argswidth}{\raggedright #1\strut}}] - \futurelet\sphinx@token\pysigline@preparevspace@i -} -\newcommand{\pysiglinewithargsret}[3]{% - \settowidth{\py@argswidth}{#1\sphinxcode{(}}% - \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax - \item[{#1\sphinxcode{(}\py@sigparams{#2}{#3}\strut}] - \futurelet\sphinx@token\pysigline@preparevspace@i -} -\def\pysigline@preparevspace@i{% - \ifx\sphinx@token\@sptoken - \expandafter\pysigline@preparevspace@again - \else\expandafter\pysigline@preparevspace@ii - \fi -} -\@firstofone{\def\pysigline@preparevspace@again} {\futurelet\sphinx@token\pysigline@preparevspace@i} -\long\def\pysigline@preparevspace@ii#1{% - \ifx\sphinx@token\bgroup\expandafter\@firstoftwo - \else - \ifx\sphinx@token\phantomsection - \else -% this strange incantation is because at its root LaTeX in fact did not -% imagine a multi-line label, it is always wrapped in a horizontal box at core -% LaTeX level and we have to find tricks to get correct interline distances. -% It interacts badly with a follow-up \phantomsection hence the test above - \leavevmode\par\nobreak\vskip-\parskip\prevdepth\dp\strutbox - \fi - \expandafter\@secondoftwo - \fi - {{#1}}{#1}% -} -\newcommand{\pysigstartmultiline}{% - \def\pysigstartmultiline{\vskip\smallskipamount\parskip\z@skip\itemsep\z@skip}% - \edef\pysigstopmultiline - {\noexpand\leavevmode\parskip\the\parskip\relax\itemsep\the\itemsep\relax}% - \parskip\z@skip\itemsep\z@skip -} - -% Production lists -% -\newenvironment{productionlist}{% -% \def\sphinxoptional##1{{\Large[}##1{\Large]}} - \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}% - \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}% - \parindent=2em - \indent - \setlength{\LTpre}{0pt}% - \setlength{\LTpost}{0pt}% - \begin{longtable}[l]{lcl} -}{% - \end{longtable} -} - -% Definition lists; requested by AMK for HOWTO documents. Probably useful -% elsewhere as well, so keep in in the general style support. -% -\newenvironment{definitions}{% - \begin{description}% - \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}% -}{% - \end{description}% -} - -%% FROM DOCTUTILS LATEX WRITER -% -% The following is stuff copied from docutils' latex writer. -% -\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated -\newenvironment{optionlist}[1] -{\begin{list}{} - {\setlength{\labelwidth}{#1} - \setlength{\rightmargin}{1cm} - \setlength{\leftmargin}{\rightmargin} - \addtolength{\leftmargin}{\labelwidth} - \addtolength{\leftmargin}{\labelsep} - \renewcommand{\makelabel}{\optionlistlabel}} -}{\end{list}} - -\newlength{\lineblockindentation} -\setlength{\lineblockindentation}{2.5em} -\newenvironment{lineblock}[1] -{\begin{list}{} - {\setlength{\partopsep}{\parskip} - \addtolength{\partopsep}{\baselineskip} - \topsep0pt\itemsep0.15\baselineskip\parsep0pt - \leftmargin#1\relax} - \raggedright} -{\end{list}} - -% From docutils.writers.latex2e -% inline markup (custom roles) -% \DUrole{#1}{#2} tries \DUrole#1{#2} -\providecommand*{\DUrole}[2]{% - \ifcsname DUrole\detokenize{#1}\endcsname - \csname DUrole\detokenize{#1}\endcsname{#2}% - \else% backwards compatibility: try \docutilsrole#1{#2} - \ifcsname docutilsrole\detokenize{#1}\endcsname - \csname docutilsrole\detokenize{#1}\endcsname{#2}% - \else - #2% - \fi - \fi -} - -\providecommand*{\DUprovidelength}[2]{% - \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi -} - -\DUprovidelength{\DUlineblockindent}{2.5em} -\ifdefined\DUlineblock\else - \newenvironment{DUlineblock}[1]{% - \list{}{\setlength{\partopsep}{\parskip} - \addtolength{\partopsep}{\baselineskip} - \setlength{\topsep}{0pt} - \setlength{\itemsep}{0.15\baselineskip} - \setlength{\parsep}{0pt} - \setlength{\leftmargin}{#1}} - \raggedright - } - {\endlist} -\fi - -\endinput diff --git a/sphinxlatexshadowbox.sty b/sphinxlatexshadowbox.sty deleted file mode 100644 index 8d6c786..0000000 --- a/sphinxlatexshadowbox.sty +++ /dev/null @@ -1,100 +0,0 @@ -%% TOPIC AND CONTENTS BOXES -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexshadowbox.sty}[2021/01/27 sphinxShadowBox] - -% Provides support for this output mark-up from Sphinx latex writer: -% -% - sphinxShadowBox (environment) -% -% Dependencies (they do not need to be defined at time of loading): -% -% - of course the various colour and dimension options handled via sphinx.sty -% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty -% - \savenotes/\spewnotes from sphinxpackagefootnote -% - \ifspx@inframed defined in sphinx.sty -% -% Requires: -\RequirePackage{framed} - -% Again based on use of "framed.sty", this allows breakable framed boxes. -\long\def\spx@ShadowFBox#1{% - \leavevmode\begingroup - % first we frame the box #1 - \setbox\@tempboxa - \hbox{\vrule\@width\sphinxshadowrule - \vbox{\hrule\@height\sphinxshadowrule - \kern\sphinxshadowsep - \hbox{\kern\sphinxshadowsep #1\kern\sphinxshadowsep}% - \kern\sphinxshadowsep - \hrule\@height\sphinxshadowrule}% - \vrule\@width\sphinxshadowrule}% - % Now we add the shadow, like \shadowbox from fancybox.sty would do - \dimen@\dimexpr.5\sphinxshadowrule+\sphinxshadowsize\relax - \hbox{\vbox{\offinterlineskip - \hbox{\copy\@tempboxa\kern-.5\sphinxshadowrule - % add shadow on right side - \lower\sphinxshadowsize - \hbox{\vrule\@height\ht\@tempboxa \@width\dimen@}% - }% - \kern-\dimen@ % shift back vertically to bottom of frame - % and add shadow at bottom - \moveright\sphinxshadowsize - \vbox{\hrule\@width\wd\@tempboxa \@height\dimen@}% - }% - % move left by the size of right shadow so shadow adds no width - \kern-\sphinxshadowsize - }% - \endgroup -} - -% use framed.sty to allow page breaks in frame+shadow -% works well inside Lists and Quote-like environments -% produced by ``topic'' directive (or local contents) -% could nest if LaTeX writer authorized it -\newenvironment{sphinxShadowBox} - {\def\FrameCommand {\spx@ShadowFBox }% - \advance\spx@image@maxheight - -\dimexpr2\sphinxshadowrule - +2\sphinxshadowsep - +\sphinxshadowsize - +\baselineskip\relax - % configure framed.sty not to add extra vertical spacing - \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% - % the \trivlist will add the vertical spacing on top and bottom which is - % typical of center environment as used in Sphinx <= 1.4.1 - % the \noindent has the effet of an extra blank line on top, to - % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust - % will put top part of frame on this baseline. - \def\FrameHeightAdjust {\baselineskip}% - % use package footnote to handle footnotes - \savenotes - \trivlist\item\noindent - % use a minipage if we are already inside a framed environment - \ifspx@inframed\begin{minipage}{\linewidth}\fi - \MakeFramed {\spx@inframedtrue - % framed.sty puts into "\width" the added width (=2shadowsep+2shadowrule) - % adjust \hsize to what the contents must use - \advance\hsize-\width - % adjust LaTeX parameters to behave properly in indented/quoted contexts - \FrameRestore - % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and - % itemize/enumerate are therein typeset more tightly, we want to keep - % that). We copy-paste from LaTeX source code but don't do a real minipage. - \@pboxswfalse - \let\@listdepth\@mplistdepth \@mplistdepth\z@ - \@minipagerestore - \@setminipage - }% - }% - {% insert the "endminipage" code - \par\unskip - \@minipagefalse - \endMakeFramed - \ifspx@inframed\end{minipage}\fi - \endtrivlist - % output the stored footnotes - \spewnotes - } - -\endinput diff --git a/sphinxlatexstyleheadings.sty b/sphinxlatexstyleheadings.sty deleted file mode 100644 index fa9be82..0000000 --- a/sphinxlatexstyleheadings.sty +++ /dev/null @@ -1,83 +0,0 @@ -%% TITLES -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexstyleheadings.sty}[2021/01/27 headings] - -\RequirePackage[nobottomtitles*]{titlesec} -\@ifpackagelater{titlesec}{2016/03/15}% - {\@ifpackagelater{titlesec}{2016/03/21}% - {}% - {\newif\ifsphinx@ttlpatch@ok - \IfFileExists{etoolbox.sty}{% - \RequirePackage{etoolbox}% - \patchcmd{\ttlh@hang}{\parindent\z@}{\parindent\z@\leavevmode}% - {\sphinx@ttlpatch@oktrue}{}% - \ifsphinx@ttlpatch@ok - \patchcmd{\ttlh@hang}{\noindent}{}{}{\sphinx@ttlpatch@okfalse}% - \fi - }{}% - \ifsphinx@ttlpatch@ok - \typeout{^^J Package Sphinx Info: ^^J - **** titlesec 2.10.1 successfully patched for bugfix ****^^J}% - \else - \AtEndDocument{\PackageWarningNoLine{sphinx}{^^J% -******** titlesec 2.10.1 has a bug, (section numbers disappear) ......|^^J% -******** and Sphinx could not patch it, perhaps because your local ...|^^J% -******** copy is already fixed without a changed release date. .......|^^J% -******** If not, you must update titlesec! ...........................|}}% - \fi - }% - }{} - -% Augment the sectioning commands used to get our own font family in place, -% and reset some internal data items (\titleformat from titlesec package) -\titleformat{\section}{\Large\py@HeaderFamily}% - {\py@TitleColor\thesection}{0.5em}{\py@TitleColor} -\titleformat{\subsection}{\large\py@HeaderFamily}% - {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor} -\titleformat{\subsubsection}{\py@HeaderFamily}% - {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor} -% By default paragraphs (and subsubsections) will not be numbered because -% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2 -\titleformat{\paragraph}{\py@HeaderFamily}% - {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor} -\titleformat{\subparagraph}{\py@HeaderFamily}% - {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor} - - -% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather -% than defining their own \py@HeaderFamily command (which is still possible). -% Memo: \py@HeaderFamily is also used by \maketitle as defined in -% sphinxmanual.cls/sphinxhowto.cls -\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily} - -% This sets up the fancy chapter headings that make the documents look -% at least a little better than the usual LaTeX output. -\@ifpackagewith{fncychap}{Bjarne}{ - \ChNameVar {\raggedleft\normalsize \py@HeaderFamily} - \ChNumVar {\raggedleft\Large \py@HeaderFamily} - \ChTitleVar{\raggedleft\Large \py@HeaderFamily} - % This creates (numbered) chapter heads without the leading \vspace*{}: - \def\@makechapterhead#1{% - {\parindent \z@ \raggedright \normalfont - \ifnum \c@secnumdepth >\m@ne - \if@mainmatter - \DOCH - \fi - \fi - \interlinepenalty\@M - \if@mainmatter - \DOTI{#1}% - \else% - \DOTIS{#1}% - \fi - }} -}{}% <-- "false" clause of \@ifpackagewith - -% fix fncychap's bug which uses prematurely the \textwidth value -\@ifpackagewith{fncychap}{Bjornstrup} - {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}% - {}% <-- "false" clause of \@ifpackagewith - - -\endinput diff --git a/sphinxlatexstylepage.sty b/sphinxlatexstylepage.sty deleted file mode 100644 index 4066129..0000000 --- a/sphinxlatexstylepage.sty +++ /dev/null @@ -1,79 +0,0 @@ -%% PAGE STYLING -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexstylepage.sty}[2021/01/27 page styling] - -% Separate paragraphs by space by default. -\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update -% new parskip.sty, but let it rollback to old one. -% hopefully TeX installation not broken and LaTeX kernel not too old - {\RequirePackage{parskip}[=v1]} -% standard one from 1989. Admittedly \section of article/book gives possibly -% anomalous spacing, but we can't require September 2018 release for some time. - {\RequirePackage{parskip}} - -% Style parameters and macros used by most documents here -\raggedbottom -\sloppy -\hbadness = 5000 % don't print trivial gripes - -% Require package fancyhdr except under memoir class -\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}} -% Use \pagestyle{normal} as the primary pagestyle for text. -% Redefine the 'normal' header/footer style when using "fancyhdr" package: -\@ifpackageloaded{fancyhdr}{% - \ltx@ifundefined{c@chapter} - {% no \chapter, "howto" (non-Japanese) docclass - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[C]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0pt} - } - % Same as 'plain', this way we can use it in template - % FIXME: shouldn't this have a running header with Name and Release like 'manual'? - \fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[C]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0pt} - } - }% - {% classes with \chapter command - \fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[RO]{{\py@HeaderFamily\thepage}} - \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} - \fancyhead[RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} - \if@twoside - \fancyfoot[LE]{{\py@HeaderFamily\thepage}} - \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} - \fancyhead[LE]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} - \fi - \renewcommand{\headrulewidth}{0.4pt} - \renewcommand{\footrulewidth}{0.4pt} - % define chaptermark with \@chappos when \@chappos is available for Japanese - \ltx@ifundefined{@chappos}{} - {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}} - } - % Update the plain style so we get the page number & footer line, - % but not a chapter or section title. This is to keep the first - % page of a chapter `clean.' - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[RO]{{\py@HeaderFamily\thepage}} - \if@twoside\fancyfoot[LE]{{\py@HeaderFamily\thepage}}\fi - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0.4pt} - } - } - } - {% no fancyhdr: memoir class - % Provide default for 'normal' style simply as an alias of 'plain' style - % This way we can use \pagestyle{normal} in LaTeX template - \def\ps@normal{\ps@plain} - % Users of memoir class are invited to redefine 'normal' style in preamble - } - - -\endinput diff --git a/sphinxlatexstyletext.sty b/sphinxlatexstyletext.sty deleted file mode 100644 index 539ee0d..0000000 --- a/sphinxlatexstyletext.sty +++ /dev/null @@ -1,134 +0,0 @@ -%% TEXT STYLING -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatexstyletext.sty}[2021/12/06 text styling] - -% Basically everything here consists of macros which are part of the latex -% markup produced by the Sphinx latex writer - -% Some custom font markup commands. -\protected\def\sphinxstrong#1{\textbf{#1}} -\protected\def\sphinxcode#1{\texttt{#1}} -\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}} -\protected\def\sphinxemail#1{\textsf{#1}} -\protected\def\sphinxtablecontinued#1{\textsf{#1}} -\protected\def\sphinxtitleref#1{\emph{#1}} -\protected\def\sphinxmenuselection#1{\emph{#1}} -\protected\def\sphinxguilabel#1{\emph{#1}} -\protected\def\sphinxkeyboard#1{\sphinxcode{#1}} -\protected\def\sphinxaccelerator#1{\underline{#1}} -\protected\def\sphinxcrossref#1{\emph{#1}} -\protected\def\sphinxtermref#1{\emph{#1}} -% \optional is used for ``[, arg]``, i.e. desc_optional nodes. -\long\protected\def\sphinxoptional#1{% - {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} - -% additional customizable styling -\def\sphinxstyleindexentry #1{\texttt{#1}} -\def\sphinxstyleindexextra #1{ (\emph{#1})} -\def\sphinxstyleindexpageref #1{, \pageref{#1}} -\def\sphinxstyleindexpagemain#1{\textbf{#1}} -\def\spxentry{\@backslashchar spxentry}% let to \sphinxstyleindexentry in index -\def\spxextra{\@backslashchar spxextra}% let to \sphinxstyleindexextra in index -\def\sphinxstyleindexlettergroup #1% - {{\Large\sffamily#1}\nopagebreak\vspace{1mm}} -\def\sphinxstyleindexlettergroupDefault #1% - {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}} -\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} -\let\sphinxstylesidebartitle\sphinxstyletopictitle -\protected\def\sphinxstyleothertitle #1{\textbf{#1}} -\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip} -% \text.. commands do not allow multiple paragraphs -\protected\def\sphinxstyletheadfamily {\sffamily} -\protected\def\sphinxstyleemphasis #1{\emph{#1}} -\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}} -\protected\def\sphinxstylestrong #1{\textbf{#1}} -\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}} -\protected\def\sphinxstyleabbreviation #1{\textsc{#1}} -\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}} -\newcommand*\sphinxstylecodecontinued[1]{\footnotesize(#1)}% -\newcommand*\sphinxstylecodecontinues[1]{\footnotesize(#1)}% -% figure legend comes after caption and may contain arbitrary body elements -\newenvironment{sphinxlegend}{\par\small}{\par} -% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds -\AtBeginDocument{\pdfstringdefDisableCommands{% -% all "protected" macros possibly ending up in section titles should be here -% TODO: examine if \sphinxhref, \sphinxurl, \sphinnolinkurl should be handled - \let\sphinxstyleemphasis \@firstofone - \let\sphinxstyleliteralemphasis \@firstofone - \let\sphinxstylestrong \@firstofone - \let\sphinxstyleliteralstrong \@firstofone - \let\sphinxstyleabbreviation \@firstofone - \let\sphinxstyleliteralintitle \@firstofone - \let\sphinxupquote \@firstofone - \let\sphinxstrong \@firstofone - \let\sphinxcode \@firstofone - \let\sphinxbfcode \@firstofone - \let\sphinxemail \@firstofone - \let\sphinxcrossref \@firstofone - \let\sphinxtermref \@firstofone - \let\sphinxhyphen\sphinxhyphenforbookmarks -}} - -% Special characters -% -% The \kern\z@ is to prevent en-dash and em-dash TeX ligatures. -% A linebreak can occur after the dash in regular text (this is -% normal behaviour of "-" in TeX, it is not related to \kern\z@). -% -% Parsed-literals and inline literals also use the \sphinxhyphen -% but linebreaks there are prevented due to monospace font family. -% (xelatex needs a special addition, cf. sphinxlatexliterals.sty) -% -% Inside code-blocks, dashes are escaped via another macro, from -% Pygments latex output (search for \PYGZhy in sphinxlatexliterals.sty), -% and are configured to allow linebreaks despite the monospace font. -% (the #1 swallows the {} from \sphinxhyphen{} mark-up) -\protected\def\sphinxhyphen#1{-\kern\z@} -\protected\def\sphinxhyphennobreak#1{\mbox{-}} -% The {} from texescape mark-up is kept, else -- gives en-dash in PDF bookmark -\def\sphinxhyphenforbookmarks{-} - -% For curly braces inside \index macro -\def\sphinxleftcurlybrace{\{} -\def\sphinxrightcurlybrace{\}} - -% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x -\def\spx@bd#1#2{% - \leavevmode - \begingroup - \ifx\spx@bd@height \@undefined\def\spx@bd@height{\baselineskip}\fi - \ifx\spx@bd@width \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi - \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi - \ifx\spx@bd@lower \@undefined\def\spx@bd@lower{\dp\strutbox}\fi - \lower\spx@bd@lower#1{#2}% - \endgroup -}% -\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL - {\spx@bd{\vbox to\spx@bd@height} - {\vss\hrule\@height\spx@bd@thickness - \@width\spx@bd@width\vss}}% -\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss\vrule\@height\spx@bd@height - \@width \spx@bd@thickness\hss}}% -\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss\raise.5\spx@bd@height - \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height - \@width \spx@bd@thickness\hss}% - \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness - \@width.5\spx@bd@width\vss}}}% -\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss - \hb@xt@\z@{\hss\vrule\@height\spx@bd@height - \@width \spx@bd@thickness\hss}% - \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness - \@width.5\spx@bd@width\vss}}}% -\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}% - -% Tell TeX about pathological hyphenation cases: -\hyphenation{Base-HTTP-Re-quest-Hand-ler} - -\endinput diff --git a/sphinxlatextables.sty b/sphinxlatextables.sty deleted file mode 100644 index c3c1d6a..0000000 --- a/sphinxlatextables.sty +++ /dev/null @@ -1,481 +0,0 @@ -%% TABLES (WITH SUPPORT FOR MERGED CELLS OF GENERAL CONTENTS) -% -% change this info string if making any custom modification -\ProvidesFile{sphinxlatextables.sty}[2021/01/27 tables]% - -% Provides support for this output mark-up from Sphinx latex writer -% and table templates: -% -% - the tabulary and longtable environments from the eponymous packages -% - the varwidth environment -% - the >{} etc mark-up possible in tabularcolumns is from array package -% which is loaded by longtable and tabulary -% - \X, \Y, T column types; others (L, C, R, J) are from tabulary package -% - \sphinxaftertopcaption -% - \sphinxatlongtableend -% - \sphinxatlongtablestart -% - \sphinxattableend -% - \sphinxattablestart -% - \sphinxcapstartof -% - \sphinxcolwidth -% - \sphinxlongtablecapskipadjust -% - \sphinxmultirow -% - \sphinxstartmulticolumn -% - \sphinxstopmulticolumn -% - \sphinxtablestrut -% - \sphinxthecaptionisattop -% - \sphinxthelongtablecaptionisattop -% -% Executes \RequirePackage for: -% -% - tabulary -% - longtable -% - varwidth -% -% Extends tabulary and longtable via patches and custom macros to support -% merged cells possibly containing code-blocks in complex tables - -\RequirePackage{tabulary} -% tabulary has a bug with its re-definition of \multicolumn in its first pass -% which is not \long. But now Sphinx does not use LaTeX's \multicolumn but its -% own macro. Hence we don't even need to patch tabulary. See -% sphinxpackagemulticell.sty -% X or S (Sphinx) may have meanings if some table package is loaded hence -% \X was chosen to avoid possibility of conflict -\newcolumntype{\X}[2]{p{\dimexpr - (\linewidth-\arrayrulewidth)*#1/#2-\tw@\tabcolsep-\arrayrulewidth\relax}} -\newcolumntype{\Y}[1]{p{\dimexpr - #1\dimexpr\linewidth-\arrayrulewidth\relax-\tw@\tabcolsep-\arrayrulewidth\relax}} -% using here T (for Tabulary) feels less of a problem than the X could be -\newcolumntype{T}{J}% -% For tables allowing pagebreaks -\RequirePackage{longtable} -% User interface to set-up whitespace before and after tables: -\newcommand*\sphinxtablepre {0pt}% -\newcommand*\sphinxtablepost{\medskipamount}% -% Space from caption baseline to top of table or frame of literal-block -\newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}% -% as one can not use \baselineskip from inside longtable (it is zero there) -% we need \sphinxbaselineskip, which defaults to \baselineskip -\def\sphinxbaselineskip{\baselineskip}% -% The following is to ensure that, whether tabular(y) or longtable: -% - if a caption is on top of table: -% a) the space between its last baseline and the top rule of table is -% exactly \sphinxbelowcaptionspace -% b) the space from last baseline of previous text to first baseline of -% caption is exactly \parskip+\baselineskip+ height of a strut. -% c) the caption text will wrap at width \LTcapwidth (4in) -% - make sure this works also if "caption" package is loaded by user -% (with its width or margin option taking place of \LTcapwidth role) -% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE -% -% To modify space below such top caption, adjust \sphinxbelowcaptionspace -% To add or remove space above such top caption, adjust \sphinxtablepre: -% notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored** -% A. Table with longtable -\def\sphinxatlongtablestart - {\par - \vskip\parskip - \vskip\dimexpr\sphinxtablepre\relax % adjust vertical position - \vbox{}% get correct baseline from above - \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips - \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}% - }% -% Compatibility with caption package -\def\sphinxthelongtablecaptionisattop{% - \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}% -}% -% Achieves exactly \sphinxbelowcaptionspace below longtable caption -\def\sphinxlongtablecapskipadjust - {\dimexpr-\dp\strutbox - -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}% - +\sphinxbelowcaptionspace\relax}% -\def\sphinxatlongtableend{\@nobreakfalse % latex3/latex2e#173 - \prevdepth\z@\vskip\sphinxtablepost\relax}% -% B. Table with tabular or tabulary -\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax}% -\let\sphinxattableend\sphinxatlongtableend -% This is used by tabular and tabulary templates -\newcommand*\sphinxcapstartof[1]{% - \vskip\parskip - \vbox{}% force baselineskip for good positioning by capstart of hyperanchor - % hyperref puts the anchor 6pt above this baseline; in case of caption - % this baseline will be \ht\strutbox above first baseline of caption - \def\@captype{#1}% - \capstart -% move back vertically, as tabular (or its caption) will compensate - \vskip-\baselineskip\vskip-\parskip -}% -\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof - \spx@ifcaptionpackage - {\caption@setposition{t}% - \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof - \vskip-\belowcaptionskip % anticipate caption package skip - % caption package uses a \vbox, not a \vtop, so "single line" case - % gives different result from "multi-line" without this: - \nointerlineskip - }% - {}% -}% -\def\sphinxthecaptionisatbottom{% (not finalized; for template usage) - \spx@ifcaptionpackage{\caption@setposition{b}}{}% -}% -% The aim of \sphinxcaption is to apply to tabular(y) the maximal width -% of caption as done by longtable -\def\sphinxtablecapwidth{\LTcapwidth}% -\newcommand\sphinxcaption{\@dblarg\spx@caption}% -\long\def\spx@caption[#1]#2{% - \noindent\hb@xt@\linewidth{\hss - \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax -% don't exceed linewidth for the caption width - \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi -% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here - \abovecaptionskip\sphinxabovecaptionskip % \z@skip - \belowcaptionskip\sphinxbelowcaptionskip % \z@skip - \caption[{#1}]% - {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}% - }\hss}% - \par\prevdepth\dp\strutbox -}% -\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal -\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal -% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top -% caption, and with another value in sphinxVerbatimintable -% TODO: To unify space above caption of a code-block with the one above -% caption of a table/longtable, \abovecaptionskip must not be used -% This auxiliary will get renamed and receive a different meaning -% in future. -\def\spx@abovecaptionskip{\abovecaptionskip}% -% Achieve \sphinxbelowcaptionspace below a caption located above a tabular -% or a tabulary -\newcommand\sphinxaftertopcaption -{% - \spx@ifcaptionpackage - {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}% - \vskip\dimexpr\sphinxbelowcaptionspace\relax - \vskip-\baselineskip\vskip-\parskip -}% -% varwidth is crucial for our handling of general contents in merged cells -\RequirePackage{varwidth} -% but addition of a compatibility patch with hyperref is needed -% (tested with varwidth v 0.92 Mar 2009) -\AtBeginDocument {% - \let\@@vwid@Hy@raisedlink\Hy@raisedlink - \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}% - \edef\@vwid@setup{% - \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF ! - \unexpanded\expandafter{\@vwid@setup}}% -}% - -%%%%%%%%%%%%%%%%%%%%% -% --- MULTICOLUMN --- -% standard LaTeX's \multicolumn -% 1. does not allow verbatim contents, -% 2. interacts very poorly with tabulary. -% -% It is needed to write own macros for Sphinx: to allow code-blocks in merged -% cells rendered by tabular/longtable, and to allow multi-column cells with -% paragraphs to be taken into account sanely by tabulary algorithm for column -% widths. -% -% This requires quite a bit of hacking. First, in Sphinx, the multi-column -% contents will *always* be wrapped in a varwidth environment. The issue -% becomes to pass it the correct target width. We must trick tabulary into -% believing the multicolumn is simply separate columns, else tabulary does not -% incorporate the contents in its algorithm. But then we must clear the -% vertical rules... -% -% configuration of tabulary -\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns -\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete" -% we need access to tabulary's final computed width. \@tempdima is too volatile -% to hope it has kept tabulary's value when \sphinxcolwidth needs it. -\newdimen\sphinx@TY@tablewidth -\def\tabulary{% - \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}% - \let\endTY@final\endtabular - \TY@tabular}% -% next hack is needed only if user has set latex_use_latex_multicolumn to True: -% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if -% upstream tabulary adds a \long, our extra one causes no harm) -\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa - {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}% -\expandafter\sphinx@tempa\TY@tab\sphinx@tempa -% -% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry -% like standard multicolumn about |l| vs l|. On the other hand it assumes -% columns are separated by a | ... (if not it will add extraneous -% \arrayrulewidth space for each column separation in its estimate of available -% width). -% -% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not -% (easily) get rid of extra macros from >{...} or <{...} between columns. At -% least, it has been made compatible with colortbl's \columncolor. -% -% TN. 2: tabulary's second pass is handled like tabular/longtable's single -% pass, with the difference that we hacked \TY@final to set in -% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is -% needed only to handle columns with a "horizontal" specifier: "p" type columns -% (inclusive of tabulary's LJRC) holds the target column width in the -% \linewidth dimension. -% -% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up -% would need some hacking around the fact that groups can not span across table -% cells (the code does inserts & tokens, see TN1b). It was decided to keep it -% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn. -% -% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular -% inside a tabulary it will think to be at top level in the tabulary. But -% Sphinx generates no nested tables, and if some LaTeX macro uses internally a -% tabular this will not have a \sphinxstartmulticolumn within it! -% -\def\sphinxstartmulticolumn{% - \ifx\equation$% $ tabulary's first pass - \expandafter\sphinx@TYI@start@multicolumn - \else % either not tabulary or tabulary's second pass - \expandafter\sphinx@start@multicolumn - \fi -}% -\def\sphinxstopmulticolumn{% - \ifx\equation$% $ tabulary's first pass - \expandafter\sphinx@TYI@stop@multicolumn - \else % either not tabulary or tabulary's second pass - \ignorespaces - \fi -}% -\def\sphinx@TYI@start@multicolumn#1{% - % use \gdef always to avoid stack space build up - \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup -}% -\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax - \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width - \endgroup - \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}% -}% -\def\sphinx@TYI@multispan #1{% - \kern\sphinx@tempb\ignorespaces % the per column occupied width - \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ... - \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}% - \fi -}% -\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}% -% -% Now the branch handling either the second pass of tabulary or the single pass -% of tabular/longtable. This is the delicate part where we gather the -% dimensions from the p columns either set-up by tabulary or by user p column -% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the -% template must be inserted (other hacks would be horribly complicated except -% if we rewrote crucial parts of LaTeX's \@array !) and we can not do -% \omit\span like standard \multicolumn's easy approach. Thus we must cancel -% the \vrule separators. Also, perhaps the column specifier is of the l, c, r -% type, then we attempt an ad hoc rescue to give varwidth a reasonable target -% width. -\def\sphinx@start@multicolumn#1{% - \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}% -}% -\def\sphinx@multispan #1{% - \ifnum#1=\@ne\expandafter\sphinx@multispan@end - \else\expandafter\sphinx@multispan@next - \fi {#1}% -}% -\def\sphinx@multispan@next #1{% - % trick to recognize L, C, R, J or p, m, b type columns - \ifdim\baselineskip>\z@ - \gdef\sphinx@tempb{\linewidth}% - \else - % if in an l, r, c type column, try and hope for the best - \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else - \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa - -\tw@\tabcolsep-\arrayrulewidth\relax}% - \fi - \noindent\kern\sphinx@tempb\relax - \xdef\sphinx@multiwidth - {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\arrayrulewidth}% - % hack the \vline and the colortbl macros - \sphinx@hack@vline\sphinx@hack@CT&\relax - % repeat - \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}% -}% -% packages like colortbl add group levels, we need to "climb back up" to be -% able to hack the \vline and also the colortbl inserted tokens. This creates -% empty space whether or not the columns were | separated: -\def\sphinx@hack@vline{\ifnum\currentgrouptype=6\relax - \kern\arrayrulewidth\arrayrulewidth\z@\else\aftergroup\sphinx@hack@vline\fi}% -\def\sphinx@hack@CT{\ifnum\currentgrouptype=6\relax - \let\CT@setup\sphinx@CT@setup\else\aftergroup\sphinx@hack@CT\fi}% -% It turns out \CT@row@color is not expanded contrarily to \CT@column@color -% during LaTeX+colortbl preamble preparation, hence it would be possible for -% \sphinx@CT@setup to discard only the column color and choose to obey or not -% row color and cell color. It would even be possible to propagate cell color -% to row color for the duration of the Sphinx multicolumn... the (provisional?) -% choice has been made to cancel the colortbl colours for the multicolumn -% duration. -\def\sphinx@CT@setup #1\endgroup{\endgroup}% hack to remove colour commands -\def\sphinx@multispan@end#1{% - % first, trace back our steps horizontally - \noindent\kern-\dimexpr\sphinx@multiwidth\relax - % and now we set the final computed width for the varwidth environment - \ifdim\baselineskip>\z@ - \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}% - \else - \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+ - (\ifx\TY@final\@undefined\linewidth\else - \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa - -\tw@\tabcolsep-\arrayrulewidth\relax}% - \fi - % we need to remove colour set-up also for last cell of the multi-column - \aftergroup\sphinx@hack@CT -}% -\newcommand*\sphinxcolwidth[2]{% - % this dimension will always be used for varwidth, and serves as maximum - % width when cells are merged either via multirow or multicolumn or both, - % as always their contents is wrapped in varwidth environment. - \ifnum#1>\@ne % multi-column (and possibly also multi-row) - % we wrote our own multicolumn code especially to handle that (and allow - % verbatim contents) - \ifx\equation$%$ - \tymax % first pass of tabulary (cf MEMO above regarding nesting) - \else % the \@gobble thing is for compatibility with standard \multicolumn - \sphinx@multiwidth\@gobble{#1/#2}% - \fi - \else % single column multirow - \ifx\TY@final\@undefined % not a tabulary. - \ifdim\baselineskip>\z@ - % in a p{..} type column, \linewidth is the target box width - \linewidth - \else - % l, c, r columns. Do our best. - \dimexpr(\linewidth-\arrayrulewidth)/#2- - \tw@\tabcolsep-\arrayrulewidth\relax - \fi - \else % in tabulary - \ifx\equation$%$% first pass - \tymax % it is set to a big value so that paragraphs can express themselves - \else - % second pass. - \ifdim\baselineskip>\z@ - \linewidth % in a L, R, C, J column or a p, \X, \Y ... - \else - % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width - \dimexpr(\sphinx@TY@tablewidth-\arrayrulewidth)/#2- - \tw@\tabcolsep-\arrayrulewidth\relax - \fi - \fi - \fi - \fi -}% -% fallback default in case user has set latex_use_latex_multicolumn to True: -% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn -\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!) - (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi - -\arrayrulewidth)*#2-\tw@\tabcolsep-\arrayrulewidth\relax}% - -%%%%%%%%%%%%%%%%%% -% --- MULTIROW --- -% standard \multirow -% 1. does not allow verbatim contents, -% 2. does not allow blank lines in its argument, -% 3. its * specifier means to typeset "horizontally" which is very -% bad for paragraph content. 2016 version has = specifier but it -% must be used with p type columns only, else results are bad, -% 4. it requires manual intervention if the contents is too long to fit -% in the asked-for number of rows. -% 5. colour panels (either from \rowcolor or \columncolor) will hide -% the bottom part of multirow text, hence manual tuning is needed -% to put the multirow insertion at the _bottom_. -% -% The Sphinx solution consists in always having contents wrapped -% in a varwidth environment so that it makes sense to estimate how many -% lines it will occupy, and then ensure by insertion of suitable struts -% that the table rows have the needed height. The needed mark-up is done -% by LaTeX writer, which has its own id for the merged cells. -% -% The colour issue is solved by clearing colour panels in all cells, -% whether or not the multirow is single-column or multi-column. -% -% In passing we obtain baseline alignements across rows (only if -% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p" -% multi-line contents, only first and last line...) -% -% TODO: examine the situation with \arraystretch > 1. The \extrarowheight -% is hopeless for multirow anyhow, it makes baseline alignment strictly -% impossible. -\newcommand\sphinxmultirow[2]{\begingroup - % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents - % but let's fetch #3 in a way allowing verbatim contents ! - \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}% - \afterassignment\sphinx@multirow\let\next= -}% -\def\sphinx@multirow {% - \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut -}% -\def\sphinx@@multirow {% - % The contents, which is a varwidth environment, has been captured in - % \box0 (a \hbox). - % We have with \sphinx@cellid an assigned unique id. The goal is to give - % about the same height to all the involved rows. - % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up - % in LaTeX file and the expansion of the latter will do the suitable thing. - \dimen@\dp\z@ - \dimen\tw@\ht\@arstrutbox - \advance\dimen@\dimen\tw@ - \advance\dimen\tw@\dp\@arstrutbox - \count@=\dimen@ % type conversion dim -> int - \count\tw@=\dimen\tw@ - \divide\count@\count\tw@ % TeX division truncates - \advance\dimen@-\count@\dimen\tw@ - % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt. - % (note that if \count@ holds 0, surely \dimen@>1300sp) - \ifdim\dimen@>1300sp \advance\count@\@ne \fi - % now \count@ holds the count L of needed "lines" - % and \sphinx@nbofrows holds the number N of rows - % we have L >= 1 and N >= 1 - % if L is a multiple of N, ... clear what to do ! - % else write L = qN + r, 1 <= r < N and we will - % arrange for each row to have enough space for: - % q+1 "lines" in each of the first r rows - % q "lines" in each of the (N-r) bottom rows - % for a total of (q+1) * r + q * (N-r) = q * N + r = L - % It is possible that q == 0. - \count\tw@\count@ - % the TeX division truncates - \divide\count\tw@\sphinx@nbofrows\relax - \count4\count\tw@ % q - \multiply\count\tw@\sphinx@nbofrows\relax - \advance\count@-\count\tw@ % r - \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname - {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}% - \dp\z@\z@ - % this will use the real height if it is >\ht\@arstrutbox - \sphinxtablestrut{\sphinx@cellid}\box\z@ - \endgroup % group was opened in \sphinxmultirow -}% -\newcommand*\sphinxtablestrut[1]{% - % #1 is a "cell_id", i.e. the id of a merged group of table cells - \csname sphinx@tablestrut_#1\endcsname -}% -% LaTeX typesets the table row by row, hence each execution can do -% an update for the next row. -\newcommand*\sphinx@tablestrut[3]{\begingroup - % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows - % if #2 = 0, create space for max(q,1) table lines - % if #2 > 0, create space for q+1 lines and decrement #2 - \leavevmode - \count@#1\relax - \ifnum#2=\z@ - \ifnum\count@=\z@\count@\@ne\fi - \else - % next row will be with a #2 decremented by one - \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname - {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}% - \advance\count@\@ne - \fi - \vrule\@height\ht\@arstrutbox - \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax - \@width\z@ - \endgroup - % we need this to avoid colour panels hiding bottom parts of multirow text - \sphinx@hack@CT -}% - -\endinput diff --git a/sphinxmanual.cls b/sphinxmanual.cls deleted file mode 100644 index 2e4b30d..0000000 --- a/sphinxmanual.cls +++ /dev/null @@ -1,128 +0,0 @@ -% -% sphinxmanual.cls for Sphinx (https://www.sphinx-doc.org/) -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)] - -% chapters starting at odd pages (overridden by 'openany' document option) -\PassOptionsToClass{openright}{\sphinxdocclass} - -% 'oneside' option overriding the 'twoside' default -\newif\if@oneside -\DeclareOption{oneside}{\@onesidetrue} -% Pass remaining document options to the parent class. -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} -\ProcessOptions\relax - -% Defaults two-side document -\if@oneside -% nothing to do (oneside is the default) -\else -\PassOptionsToClass{twoside}{\sphinxdocclass} -\fi - -\LoadClass{\sphinxdocclass} - -% Set some sane defaults for section numbering depth and TOC depth. You can -% reset these counters in your preamble. -% -\setcounter{secnumdepth}{2} -\setcounter{tocdepth}{1} - -% Adapt \and command to the flushright context of \sphinxmaketitle, to -% avoid ragged line endings if author names do not fit all on one single line -\DeclareRobustCommand{\and}{% - \end{tabular}\kern-\tabcolsep - \allowbreak - \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% -}% -% If it is desired that each author name be on its own line, use in preamble: -%\DeclareRobustCommand{\and}{% -% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% -%}% -% Change the title page to look a bit better, and fit in with the fncychap -% ``Bjarne'' style a bit better. -% -\newcommand{\sphinxmaketitle}{% - \let\sphinxrestorepageanchorsetting\relax - \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi - \hypersetup{pageanchor=false}% avoid duplicate destination warnings - \begin{titlepage}% - \let\footnotesize\small - \let\footnoterule\relax - \noindent\rule{\textwidth}{1pt}\par - \begingroup % for PDF information dictionary - \def\endgraf{ }\def\and{\& }% - \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup - \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% - \endgroup - \begin{flushright}% - \sphinxlogo - \py@HeaderFamily - {\Huge \@title \par} - {\itshape\LARGE \py@release\releaseinfo \par} - \vfill - {\LARGE - \begin{tabular}[t]{c} - \@author - \end{tabular}\kern-\tabcolsep - \par} - \vfill\vfill - {\large - \@date \par - \vfill - \py@authoraddress \par - }% - \end{flushright}%\par - \@thanks - \end{titlepage}% - \setcounter{footnote}{0}% - \let\thanks\relax\let\maketitle\relax - %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} - \clearpage - \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi - \if@openright\cleardoublepage\else\clearpage\fi - \sphinxrestorepageanchorsetting -} - -\newcommand{\sphinxtableofcontents}{% - \pagenumbering{roman}% - \begingroup - \parskip \z@skip - \sphinxtableofcontentshook - \tableofcontents - \endgroup - % before resetting page counter, let's do the right thing. - \if@openright\cleardoublepage\else\clearpage\fi - \pagenumbering{arabic}% -} - -% This is needed to get the width of the section # area wide enough in the -% library reference. Doing it here keeps it the same for all the manuals. -% -\newcommand{\sphinxtableofcontentshook}{% - \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}% - \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}% -} - -% Fix the bibliography environment to add an entry to the Table of -% Contents. -% For a report document class this environment is a chapter. -% -\newenvironment{sphinxthebibliography}[1]{% - \if@openright\cleardoublepage\else\clearpage\fi - % \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{#1}% - \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}} - -% Same for the indices. -% The memoir class already does this, so we don't duplicate it in that case. -% -\@ifclassloaded{memoir} - {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} - {\newenvironment{sphinxtheindex}{% - \if@openright\cleardoublepage\else\clearpage\fi - \phantomsection % needed as no chapter, section, ... created - \begin{theindex}% - \addcontentsline{toc}{chapter}{\indexname}}{\end{theindex}}} diff --git a/sphinxmessages.sty b/sphinxmessages.sty deleted file mode 100644 index 68ebffa..0000000 --- a/sphinxmessages.sty +++ /dev/null @@ -1,21 +0,0 @@ -% -% sphinxmessages.sty -% -% message resources for Sphinx -% -\ProvidesPackage{sphinxmessages}[2019/01/04 v2.0 Localized LaTeX macros (Sphinx team)] - -\renewcommand{\literalblockcontinuedname}{continued from previous page} -\renewcommand{\literalblockcontinuesname}{continues on next page} -\renewcommand{\sphinxnonalphabeticalgroupname}{Non\sphinxhyphen{}alphabetical} -\renewcommand{\sphinxsymbolsname}{Symbols} -\renewcommand{\sphinxnumbersname}{Numbers} -\def\pageautorefname{page} - -\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }} -\def\fnum@figure{\figurename\thefigure{}} - -\addto\captionsenglish{\renewcommand{\tablename}{Table }} -\def\fnum@table{\tablename\thetable{}} - -\addto\captionsenglish{\renewcommand{\literalblockname}{Listing}} \ No newline at end of file diff --git a/sphinxoptionsgeometry.sty b/sphinxoptionsgeometry.sty deleted file mode 100644 index af5a804..0000000 --- a/sphinxoptionsgeometry.sty +++ /dev/null @@ -1,54 +0,0 @@ -%% OPTIONS FOR GEOMETRY -% -% change this info string if making any custom modification -\ProvidesFile{sphinxoptionsgeometry.sty}[2021/01/27 geometry] - -% geometry -\ifx\kanjiskip\@undefined - \PassOptionsToPackage{% - hmargin={\unexpanded{\spx@opt@hmargin}},% - vmargin={\unexpanded{\spx@opt@vmargin}},% - marginpar=\unexpanded{\spx@opt@marginpar}} - {geometry} -\else - % set text width for Japanese documents to be integer multiple of 1zw - % and text height to be integer multiple of \baselineskip - % the execution is delayed to \sphinxsetup then geometry.sty - \normalsize\normalfont - \newcommand*\sphinxtextwidthja[1]{% - \if@twocolumn\tw@\fi - \dimexpr - \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/ - \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax - zw\relax}% - \newcommand*\sphinxmarginparwidthja[1]{% - \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}% - \newcommand*\sphinxtextlinesja[1]{% - \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/ - \baselineskip\relax}% - \ifx\@jsc@uplatextrue\@undefined\else - % the way we found in order for the papersize special written by - % geometry in the dvi file to be correct in case of jsbook class - \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt - \PassOptionsToPackage{truedimen}{geometry}% - \fi - \fi - \PassOptionsToPackage{% - hmarginratio={1:1},% - textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},% - vmarginratio={1:1},% - lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},% - marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},% - footskip=2\baselineskip,% - }{geometry}% - \AtBeginDocument - {% update a dimension used by the jsclasses - \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi - % for some reason, jreport normalizes all dimensions with \@settopoint - \@ifclassloaded{jreport} - {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth} - {}% <-- "false" clause of \@ifclassloaded - }% -\fi - -\endinput diff --git a/sphinxoptionshyperref.sty b/sphinxoptionshyperref.sty deleted file mode 100644 index b88f108..0000000 --- a/sphinxoptionshyperref.sty +++ /dev/null @@ -1,35 +0,0 @@ -%% Bookmarks and hyperlinks -% -% change this info string if making any custom modification -\ProvidesFile{sphinxoptionshyperref.sty}[2021/01/27 hyperref] - -% to make pdf with correct encoded bookmarks in Japanese -% this should precede the hyperref package -\ifx\kanjiskip\@undefined -% for non-Japanese: make sure bookmarks are ok also with lualatex - \PassOptionsToPackage{pdfencoding=unicode}{hyperref} -\else - \RequirePackage{atbegshi} - \ifx\ucs\@undefined - \ifnum 42146=\euc"A4A2 - \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} - \else - \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} - \fi - \else - \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}} - \fi -\fi - -\ifx\@jsc@uplatextrue\@undefined\else - \PassOptionsToPackage{setpagesize=false}{hyperref} -\fi - -% These options can be overridden inside 'hyperref' key -% or by later use of \hypersetup. -\PassOptionsToPackage{colorlinks,breaklinks,% - linkcolor=InnerLinkColor,filecolor=OuterLinkColor,% - menucolor=OuterLinkColor,urlcolor=OuterLinkColor,% - citecolor=InnerLinkColor}{hyperref} - -\endinput diff --git a/sphinxpackagecyrillic.sty b/sphinxpackagecyrillic.sty deleted file mode 100644 index 9aa62fc..0000000 --- a/sphinxpackagecyrillic.sty +++ /dev/null @@ -1,55 +0,0 @@ -%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only) -% -% refs: https://tex.stackexchange.com/q/460271/ -\ProvidesPackage{sphinxpackagecyrillic}% - [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents] -\RequirePackage{kvoptions} -\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix -\DeclareBoolOption[false]{Xtwo} -\DeclareBoolOption[false]{TtwoA} -\DeclareDefaultOption{\@unknownoptionerror} -\ProcessLocalKeyvalOptions* % ignore class options - -\ifspx@cyropt@Xtwo -% original code by tex.sx user egreg (updated 2019/10/28): -% https://tex.stackexchange.com/a/460325/ -% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding -% This assumes inputenc loaded with utf8 option, or LaTeX release -% as recent as 2018/04/01 which does it automatically. - \@tfor\next:=% - {Ё}{Ђ}{Є}{Ѕ}{І}{Ј}{Љ}{Њ}{Ћ}{Ў}{Џ}{А}{Б}{В}{Г}{Д}{Е}{Ж}{З}{И}{Й}% - {К}{Л}{М}{Н}{О}{П}{Р}{С}{Т}{У}{Ф}{Х}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}% - {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{р}{с}{т}{у}% - {ф}{х}{ц}{ч}{ш}{щ}{ъ}{ы}{ь}{э}{ю}{я}{ё}{ђ}{є}{ѕ}{і}{ј}{љ}{њ}{ћ}% - {ў}{џ}{Ѣ}{ѣ}{Ѫ}{ѫ}{Ѵ}{ѵ}{Ґ}{ґ}{Ғ}{ғ}{Ҕ}{ҕ}{Җ}{җ}{Ҙ}{ҙ}{Қ}{қ}{Ҝ}{ҝ}% - {Ҟ}{ҟ}{Ҡ}{ҡ}{Ң}{ң}{Ҥ}{ҥ}{Ҧ}{ҧ}{Ҩ}{ҩ}{Ҫ}{ҫ}{Ҭ}{ҭ}{Ү}{ү}{Ұ}{ұ}{Ҳ}{ҳ}% - {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}% - {Ӎ}{ӎ}{Ӕ}{ӕ}{Ә}{ә}{Ӡ}{ӡ}{Ө}{ө}\do - {% - \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}% - \protected@edef\@temp{\endgroup - \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}% - \@temp{X2}% - }% -\else -\ifspx@cyropt@TtwoA -% original code by tex.sx user jfbu: -% https://tex.stackexchange.com/a/460305/ -% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding - \@tfor\@tempa:=% - {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}% - {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}% - {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}% - {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}% - {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do - {% - \expandafter\DeclareTextSymbolDefault\expandafter - {\csname cyr\@tempa\endcsname}{T2A}% - \expandafter\uppercase\expandafter{\expandafter - \def\expandafter\@tempa\expandafter{\@tempa}}% - \expandafter\DeclareTextSymbolDefault\expandafter - {\csname CYR\@tempa\endcsname}{T2A}% - }% - \DeclareTextSymbolDefault{\CYRpalochka}{T2A}% -\fi\fi -\endinput diff --git a/sphinxpackagefootnote.sty b/sphinxpackagefootnote.sty deleted file mode 100644 index a6071cf..0000000 --- a/sphinxpackagefootnote.sty +++ /dev/null @@ -1,396 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{sphinxpackagefootnote}% - [2021/02/04 v1.1d footnotehyper adapted to sphinx (Sphinx team)] -% Provides support for this output mark-up from Sphinx latex writer: -% - footnote environment -% - savenotes environment (table templates) -% - \sphinxfootnotemark -% -%% -%% Package: sphinxpackagefootnote -%% Version: based on footnotehyper.sty 2021/02/04 v1.1d -%% as available at https://www.ctan.org/pkg/footnotehyper -%% License: the one applying to Sphinx -%% -%% Refer to the PDF documentation at https://www.ctan.org/pkg/footnotehyper for -%% the code comments. -%% -%% Differences: -%% 1. a partial tabulary compatibility layer added (enough for Sphinx mark-up), -%% 2. use of \spx@opt@BeforeFootnote from sphinx.sty, -%% 3. use of \sphinxunactivateextrasandspace from sphinx.sty, -%% 4. macro definition \sphinxfootnotemark, -%% 5. macro definition \sphinxlongtablepatch -%% 6. replaced some \undefined by \@undefined -\newif\iffootnotehyperparse\footnotehyperparsetrue -\DeclareOption*{\PackageWarning{sphinxpackagefootnote}{Option `\CurrentOption' is unknown}}% -\ProcessOptions\relax -\newbox\FNH@notes -\newtoks\FNH@toks % 1.1c -\newdimen\FNH@width -\let\FNH@colwidth\columnwidth -\newif\ifFNH@savingnotes -\AtBeginDocument {% - \let\FNH@latex@footnote \footnote - \let\FNH@latex@footnotetext\footnotetext - \let\FNH@H@@footnotetext \@footnotetext - \let\FNH@H@@mpfootnotetext \@mpfootnotetext - \newenvironment{savenotes} - {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}% - \let\spewnotes \FNH@spewnotes - \let\footnote \FNH@footnote - \let\footnotetext \FNH@footnotetext - \let\endfootnote \FNH@endfntext - \let\endfootnotetext\FNH@endfntext - \@ifpackageloaded{hyperref} - {\ifHy@hyperfootnotes - \let\FNH@H@@footnotetext\H@@footnotetext - \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext - \else - \let\FNH@hyper@fntext\FNH@nohyp@fntext - \fi}% - {\let\FNH@hyper@fntext\FNH@nohyp@fntext}% -}% -\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}% -\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}% -\def\FNH@fntext #1{% - \ifx\ifmeasuring@\@undefined - \expandafter\@secondoftwo\else\expandafter\@firstofone\fi -% these two lines modified for Sphinx (tabulary compatibility): - {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}% - {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$ -}% -\long\def\FNH@hyper@fntext@i#1{% - \global\setbox\FNH@notes\vbox - {\unvbox\FNH@notes - \FNH@startnote - \@makefntext - {\rule\z@\footnotesep\ignorespaces - \ifHy@nesting\expandafter\ltx@firstoftwo - \else\expandafter\ltx@secondoftwo - \fi - {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}% - {\Hy@raisedlink - {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}% - {\relax}}% - \let\@currentHref\Hy@footnote@currentHref - \let\@currentlabelname\@empty - #1}% - \@finalstrut\strutbox - }% - \FNH@endnote - }% -}% -\long\def\FNH@nohyp@fntext@i#1{% - \global\setbox\FNH@notes\vbox - {\unvbox\FNH@notes - \FNH@startnote - \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \FNH@endnote - }% -}% -\def\FNH@startnote{% - \hsize\FNH@colwidth - \interlinepenalty\interfootnotelinepenalty - \reset@font\footnotesize - \floatingpenalty\@MM - \@parboxrestore - \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% - \color@begingroup -}% -\def\FNH@endnote{\color@endgroup}% -\def\FNH@savenotes{% - \begingroup - \ifFNH@savingnotes\else - \FNH@savingnotestrue - \let\@footnotetext \FNH@hyper@fntext - \let\@mpfootnotetext \FNH@hyper@fntext - \let\H@@mpfootnotetext\FNH@nohyp@fntext - \FNH@width\columnwidth - \let\FNH@colwidth\FNH@width - \global\setbox\FNH@notes\box\voidb@x - \let\FNH@thempfn\thempfn - \let\FNH@mpfn\@mpfn - \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi - \expandafter\def\expandafter\@minipagerestore\expandafter{% - \@minipagerestore - \let\thempfn\FNH@thempfn - \let\@mpfn\FNH@mpfn - }% - \fi -}% -\def\FNH@spewnotes {% - \if@endpe\ifx\par\@@par\FNH@toks{}\else - \FNH@toks\expandafter{\expandafter - \def\expandafter\par\expandafter{\par}\@endpetrue}% - \expandafter\expandafter\expandafter - \FNH@toks - \expandafter\expandafter\expandafter - {\expandafter\the\expandafter\FNH@toks - \expandafter\def\expandafter\@par\expandafter{\@par}}% - \expandafter\expandafter\expandafter - \FNH@toks - \expandafter\expandafter\expandafter - {\expandafter\the\expandafter\FNH@toks - \expandafter\everypar\expandafter{\the\everypar}}\fi - \else\FNH@toks{}\fi - \expandafter - \endgroup\the\FNH@toks - \ifFNH@savingnotes\else - \ifvoid\FNH@notes\else - \begingroup - \let\@makefntext\@empty - \let\@finalstrut\@gobble - \let\rule\@gobbletwo - \ifx\@footnotetext\@mpfootnotetext - \expandafter\FNH@H@@mpfootnotetext - \else - \expandafter\FNH@H@@footnotetext - \fi{\unvbox\FNH@notes}% - \endgroup - \fi - \fi -}% -\def\FNH@footnote@envname {footnote}% -\def\FNH@footnotetext@envname{footnotetext}% -\def\FNH@footnote{% -% this line added for Sphinx: - \spx@opt@BeforeFootnote - \ifx\@currenvir\FNH@footnote@envname - \expandafter\FNH@footnoteenv - \else - \expandafter\FNH@latex@footnote - \fi -}% -\def\FNH@footnoteenv{% -% this line added for Sphinx (footnotes in parsed literal blocks): - \catcode13=5 \sphinxunactivateextrasandspace - \@ifnextchar[% - \FNH@footnoteenv@i %] - {\stepcounter\@mpfn - \protected@xdef\@thefnmark{\thempfn}% - \@footnotemark - \def\FNH@endfntext@fntext{\@footnotetext}% - \FNH@startfntext}% -}% -\def\FNH@footnoteenv@i[#1]{% - \begingroup - \csname c@\@mpfn\endcsname #1\relax - \unrestored@protected@xdef\@thefnmark{\thempfn}% - \endgroup - \@footnotemark - \def\FNH@endfntext@fntext{\@footnotetext}% - \FNH@startfntext -}% -\def\FNH@footnotetext{% - \ifx\@currenvir\FNH@footnotetext@envname - \expandafter\FNH@footnotetextenv - \else - \expandafter\FNH@latex@footnotetext - \fi -}% -\def\FNH@footnotetextenv{% - \@ifnextchar[% - \FNH@footnotetextenv@i %] - {\protected@xdef\@thefnmark{\thempfn}% - \def\FNH@endfntext@fntext{\@footnotetext}% - \FNH@startfntext}% -}% -\def\FNH@footnotetextenv@i[#1]{% - \begingroup - \csname c@\@mpfn\endcsname #1\relax - \unrestored@protected@xdef\@thefnmark{\thempfn}% - \endgroup - \ifFNH@savingnotes - \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}% - \else - \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}% - \fi - \FNH@startfntext -}% -\def\FNH@startfntext{% - \setbox\z@\vbox\bgroup - \FNH@startnote - \FNH@prefntext - \rule\z@\footnotesep\ignorespaces -}% -\def\FNH@endfntext {% - \@finalstrut\strutbox - \FNH@postfntext - \FNH@endnote - \egroup - \begingroup - \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo - \FNH@endfntext@fntext {\unvbox\z@}% - \endgroup -}% -\let\FNH@prefntext\@empty -\let\FNH@postfntext\@empty -\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}% -\def\FNH@safeif#1{% - \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo - \else\csname fi\endcsname\expandafter\@secondoftwo - \fi -}% -\def\FNH@check{% - \ifx\@makefntextFB\@undefined\expandafter\FNH@check@ - \else\expandafter\FNH@frenchb@ - \fi -}% -\def\FNH@frenchb@{% - \def\FNH@prefntext{% - \localleftbox{}% - \let\FBeverypar@save\FBeverypar@quote - \let\FBeverypar@quote\relax - \FNH@safeif{FB@koma}% - {\FNH@safeif{FBFrenchFootnotes}% - {\ifx\footnote\thanks - \let\@@makefnmark\@@makefnmarkTH - \@makefntextTH{} % space as in french.ldf - \else - \let\@@makefnmark\@@makefnmarkFB - \@makefntextFB{} % space as in french.ldf - \fi - }{\let\@@makefnmark\@@makefnmarkORI - \@makefntextORI{}% no space as in french.ldf - }% - }% - {\FNH@safeif{FBFrenchFootnotes}% - {\@makefntextFB{}}% - {\@makefntextORI{}}% - }% - }% - \def\FNH@postfntext{% - \let\FBeverypar@quote\FBeverypar@save - \localleftbox{\FBeveryline@quote}% - }% -}% -\def\FNH@check@{% - \expandafter\FNH@check@a\@makefntext{1.2!3?4,}% - \FNH@@@1.2!3?4,\FNH@@@\relax -}% -\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{% - \ifx\relax#3\expandafter\FNH@checkagain@ - \else - \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}% - \expandafter\FNH@check@b - \fi -}% -\def\FNH@checkagain@{% - \expandafter\FNH@checkagain@a - \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@ -}% -\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}% -\expandafter\def\FNH@temp#2#3\FNH@@@{% - \ifx\relax#2% - \def\FNH@prefntext{\@makefntext{}}% - \else\FNH@bad@makefntext@alert - \fi -}% -\def\FNH@check@b #1\relax{% - \expandafter\expandafter\expandafter\FNH@check@c - \expandafter\meaning\expandafter\FNH@prefntext - \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax -}% -\def\FNH@check@c #11.2!3?4,#2#3\relax{% - \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi -}% -% slight reformulation for Sphinx -\def\FNH@bad@makefntext@alert{% - \PackageWarningNoLine{sphinxpackagefootnote}% - {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J - some package modifying macro \string\@makefntext.^^J - You can try to report this incompatibility at^^J - https://github.com/sphinx-doc/sphinx with this info:}% - \typeout{\meaning\@makefntext}% - \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty -}% -% this macro from original footnote.sty is not used anymore by Sphinx -% but for simplicity sake let's just keep it as is -\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%] -\def\FNH@msne@i #1{% - \expandafter\let\csname FNH$#1\expandafter\endcsname %$ - \csname #1\endcsname - \expandafter\let\csname endFNH$#1\expandafter\endcsname %$ - \csname end#1\endcsname - \FNH@msne@ii[#1]{FNH$#1}%$ -}% -\def\FNH@msne@ii[#1]#2{% - \expandafter\edef\csname#1\endcsname{% - \noexpand\savenotes - \expandafter\noexpand\csname#2\endcsname - }% - \expandafter\edef\csname end#1\endcsname{% - \expandafter\noexpand\csname end#2\endcsname - \noexpand\expandafter - \noexpand\spewnotes - \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi - }% -}% -% -% some extras for Sphinx : -% \sphinxfootnotemark: usable in section titles and silently removed from TOCs. -\def\sphinxfootnotemark [#1]% - {\ifx\thepage\relax\else\sphinxfootref{#1}\fi}% -% \sphinxfootref: -% - \spx@opt@BeforeFootnote is from BeforeFootnote sphinxsetup option -% - \ref: -% the latex.py writer inserts a \phantomsection\label{.} -% whenever -% - the footnote was explicitly numbered in sources, -% - or it was in restrained context and is rendered using footnotetext -% -% These are the two types of footnotes that \sphinxfootnotemark must -% handle. But for explicitly numbered footnotes the same number -% can be found in document. So a secondary part in is updated -% at each novel such footnote to know what is the target from then on -% for \sphinxfootnotemark and already encountered [1], or [2],... -% -% LaTeX package varioref is not supported by hyperref (from its doc: "There -% are too many problems with varioref. Nobody has time to sort them out. -% Therefore this package is now unsupported.") So we will simply use our own -% macros to access the page number of footnote text and decide whether to print -% it. \pagename is internationalized by latex-babel. -\def\spx@thefnmark#1#2{% - % #1=label for reference, #2=page where footnote was printed - \ifx\spx@tempa\spx@tempb - % same page - #1% - \else - \sphinxthefootnotemark{#1}{#2}% - \fi -}% -\def\sphinxfootref@get #1#2#3#4#5\relax{% - \def\sphinxfootref@label{#1}% - \def\sphinxfootref@page {#2}% - \def\sphinxfootref@Href {#4}% -}% -\protected\def\sphinxfootref#1{% #1 always explicit number in Sphinx usage - \spx@opt@BeforeFootnote - \ltx@ifundefined{r@\thesphinxscope.#1}% - {\gdef\@thefnmark{?}\H@@footnotemark}% - {\expandafter\expandafter\expandafter\sphinxfootref@get - \csname r@\thesphinxscope.#1\endcsname\relax - \edef\spx@tempa{\thepage}\edef\spx@tempb{\sphinxfootref@page}% - \protected@xdef\@thefnmark{\spx@thefnmark{\sphinxfootref@label}{\sphinxfootref@page}}% - \let\spx@@makefnmark\@makefnmark - \def\@makefnmark{% - \hyper@linkstart{link}{\sphinxfootref@Href}% - \spx@@makefnmark - \hyper@linkend - }% - \H@@footnotemark - \let\@makefnmark\spx@@makefnmark - }% -}% -\AtBeginDocument{% - % let hyperref less complain - \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}% - % to obtain hyperlinked footnotes in longtable environment we must replace - % hyperref's patch of longtable's patch of \@footnotetext by our own - \let\LT@p@ftntext\FNH@hyper@fntext - % this *requires* longtable to be used always wrapped in savenotes environment -}% -\endinput -%% -%% End of file `sphinxpackagefootnote.sty'. diff --git a/synchronisationsprobleme.png b/synchronisationsprobleme.png deleted file mode 100644 index da2334c..0000000 Binary files a/synchronisationsprobleme.png and /dev/null differ