diff options
Diffstat (limited to 'konsole/tests')
-rw-r--r-- | konsole/tests/9x15.repertoire-utf8 | 219 | ||||
-rw-r--r-- | konsole/tests/Makefile | 15 | ||||
-rw-r--r-- | konsole/tests/README.vttest | 57 | ||||
-rw-r--r-- | konsole/tests/audit.c | 53 | ||||
-rwxr-xr-x | konsole/tests/bulktest.sh | 2 | ||||
-rw-r--r-- | konsole/tests/color-spaces.pl | 67 | ||||
-rwxr-xr-x | konsole/tests/colortest.sh | 31 | ||||
-rwxr-xr-x | konsole/tests/ct2 | 20 | ||||
-rw-r--r-- | konsole/tests/esc.c | 398 | ||||
-rw-r--r-- | konsole/tests/header.h | 54 | ||||
-rw-r--r-- | konsole/tests/main.c | 2083 | ||||
-rw-r--r-- | konsole/tests/quote.c | 50 | ||||
-rw-r--r-- | konsole/tests/ripple.c | 29 | ||||
-rwxr-xr-x | konsole/tests/sesstest | 2 | ||||
-rwxr-xr-x | konsole/tests/titletest.sh | 5 | ||||
-rwxr-xr-x | konsole/tests/utf8.sh | 11 | ||||
-rw-r--r-- | konsole/tests/vttest.1 | 13 |
17 files changed, 3109 insertions, 0 deletions
diff --git a/konsole/tests/9x15.repertoire-utf8 b/konsole/tests/9x15.repertoire-utf8 new file mode 100644 index 000000000..f3c76b9d0 --- /dev/null +++ b/konsole/tests/9x15.repertoire-utf8 @@ -0,0 +1,219 @@ +Characters available in 9x15, encoded in UTF-8 (RFC 2279): + +Basic Latin (U+0000-U+007F): + + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ + +Latin-1 Supplement (U+0080-U+00FF): + + ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß +àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + +Latin Extended-A (U+0100-U+017F): + +ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿ +ŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ + +Latin Extended-B (U+0180-U+024F): + +ƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿ +ǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿ +ȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳ + +IPA Extensions (U+0250-U+02AF): + +ɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏ +ʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭ + +Spacing Modifier Letters (U+02B0-U+02FF): + +ʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ + +Combining Diacritical Marks (U+0300-U+036F): + +̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̕̚ +͇͈͉͍͎̀́͂̓̈́͆͊͋͌͢͠͡ͅ + +Greek (U+0370-U+03FF): + +ʹ͵ͺ;΄΅Ά·ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρς +στυφχψωϊϋόύώϐϑϒϓϔϕϖϗϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳ + +Cyrillic (U+0400-U+04FF): + +ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп +рстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ +Ҁҁ҂҃҄҅҆҈҉ҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂ +ӃӄӇӈӋӌӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӸӹ + +Armenian (U+0530-U+058F): + +ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ՚՛՜՝՞՟աբգդեզէըթժիլխծկհձղճ +մյնշոչպջռսվտրցւփքօֆև։֊ + +Hebrew (U+0590-U+05FF): + +ְֱֲֳִֵֶַָֹֻּֽ־ֿ׀ׁׂ׃ׄאבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ׳״ + +Thai (U+0E00-U+0E7F): + +กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไ +ๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛ + +Lao (U+0E80-U+0EFF): + +ກຂຄງຈຊຍດຕຖທນບປຜຝພຟມຢຣລວສຫອຮຯະັາຳິີຶືົຼຽເແໂໃໄໆ່້໊໋ໍ໐໑໒໓໔໕໖໗໘໙ໜໝ + +Georgian (U+10A0-U+10FF): + +ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅაბგდევზთიკლმნოპჟრსტუფქღყშჩ +ცძწჭხჯჰჱჲჳჴჵჶ჻ + +Ethiopic (U+1200-U+137F): + +ሀሁሂሃሄህሆለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀ +ቁቂቃቄቅቆቈቊቋቌቍቐቑቒቓቔቕቖቘቚቛቜቝበቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኈኊ +ኋኌኍነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኰኲኳኴኵኸኹኺኻኼኽኾዀዂዃዄዅወዉዊዋዌውዎዐዑዒዓዔዕ +ዖዘዙዚዛዜዝዞዟዠዡዢዣዤዥዦዧየዩዪያዬይዮደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿጀጁጂጃጄጅጆጇገጉጊጋጌግጎጐጒጓጔጕጘጙጚጛ +ጜጝጞጠጡጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿፀፁፂፃፄፅፆፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፡።፣ +፤፥፦፧፨፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼ + +Runic (U+16A0-U+16FF): + +ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟ +ᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰ + +Latin Extended Additional (U+1E00-U+1EFF): + +ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿ +ṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿ +ẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂể +ỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ + +Greek Extended (U+1F00-U+1FFF): + +ἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃ +ὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗὙὛὝὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍ +ᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄῆῇῈΈῊΉῌ῍῎῏ +ῐῑῒΐῖῗῘῙῚΊ῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`ῲῳῴῶῷῸΌῺΏῼ´῾ + +General Punctuation (U+2000-U+206F): + + ‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁈⁉⁊⁋⁌ +⁍ + +Superscripts and Subscripts (U+2070-U+209F): + +⁰⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ + +Currency Symbols (U+20A0-U+20CF): + +₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯ + +Combining Marks for Symbols (U+20D0-U+20FF): + +⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟⃠⃡⃢⃣ + +Letterlike Symbols (U+2100-U+214F): + +℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟℠℡™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺ + +Number Forms (U+2150-U+218F): + +⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃ + +Arrows (U+2190-U+21FF): + +←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏ +⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳ + +Mathematical Operators (U+2200-U+22FF): + +∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿ +≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿ +⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿ +⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱ + +Miscellaneous Technical (U+2300-U+23FF): + +⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿ +⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍽⍾⍿⎀ +⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚ + +Control Pictures (U+2400-U+243F): + +␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␢␣␥␦ + +Optical Character Recognition (U+2440-U+245F): + +⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊ + +Enclosed Alphanumerics (U+2460-U+24FF): + +①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟ +⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟ +ⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪ + +Box Drawing (U+2500-U+257F): + +─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿ +╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿ + +Block Elements (U+2580-U+259F): + +▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕ + +Geometric Shapes (U+25A0-U+25FF): + +■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟ +◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷ + +Miscellaneous Symbols (U+2600-U+26FF): + +☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄ +♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱ + +Dingbats (U+2700-U+27BF): + +✁✂✃✄✆✇✈✉✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❃❄❅❆❇❈❉❊❋❍ +❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥ +➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾ + +Braille Patterns (U+2800-U+28FF): + +⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿ +⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿ +⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿ +⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿ + +CJK Symbols and Punctuation (U+3000-U+303F): + +、。《》〓〚〛〜〿 + +Hiragana (U+3040-U+309F): + +ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただ +ちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむ +めもゃやゅゆょよらりるれろゎわゐゑをんゔ゙゚゛゜ゝゞ + +Private Use (U+E000-U+F8FF): + + + + +Alphabetic Presentation Forms (U+FB00-U+FB4F): + +fffiflffifflſtstﬓﬔﬕﬖﬗיִﬞײַﬠﬡﬢﬣﬤﬥﬦﬧﬨ﬩שׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּוֹבֿכֿפֿﭏ + +Combining Half Marks (U+FE20-U+FE2F): + +︠︡︢︣ + +Halfwidth and Fullwidth Forms (U+FF00-U+FFEF): + +。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ + +Specials (U+FFF0-U+FFFD): + +� diff --git a/konsole/tests/Makefile b/konsole/tests/Makefile new file mode 100644 index 000000000..e6ff84064 --- /dev/null +++ b/konsole/tests/Makefile @@ -0,0 +1,15 @@ +CFLAGS = -O +OBJS = main.o esc.o + +all: vttest quote + +vttest: $(OBJS) + cc $(CFLAGS) -o vttest $(OBJS) + +install: vttest + cp vttest.1 /usr/man/man1/vttest.1 + cp vttest /usr/local/bin/vttest + strip /usr/local/bin/vttest + +clean: + rm -f $(OBJS) vttest foo core lint tags a.out diff --git a/konsole/tests/README.vttest b/konsole/tests/README.vttest new file mode 100644 index 000000000..f233a7ee5 --- /dev/null +++ b/konsole/tests/README.vttest @@ -0,0 +1,57 @@ +NOTES FROM THE MOD.SOURCES MODERATOR: +I split the source up into the three separate pieces it now is. +In doing this, I put lines like "int reading;" in a header file +that both C modules include. If your Unix requires one of these +to be "extern int reading;" then you will have some editing to do. +Also note that this program uses FIONREAD, which must be implemented +differently in SystemV, etc., and check out the setjmp() call... + /Rich $alz +Oh, yeah: I also wrote the Makefile and manpage, such as they are. +------------------------------------------------------------------- + +This is a program to test the compatibility (or to demonstrate the +non-compatibility) of so-called "VT100-compatible" terminals. In +conformance of the good old hacker traditions, the only documentation +of this program is the source code itself. To understand it, you also +need a copy of the original VT100 manual from DEC. + +Comments and bug reports: Since this is a release (via USENET) to the +whole world, a lot of people are going to have opinions and fresh +ideas about it. (What -- bugs in MY program? Aww...) I can't deal +with everyone sending me a hacked version, but if you have found a +serious bug, or ported it to VMS, do tell me. I can't promise any new +version release, though. From this version on (1.7b) VTTEST will have +to live its own life without its father holding its hand. + +My address is: + +Network-mail address: (mcvax,seismo)!enea!suadb!lindberg + +Real-world-mail address: Per Lindberg + QZ, Stockholm University Computing Center + Box 27322 + S - 102 54 Stockholm + SWEDEN + +The original version of this program is written for the Sargasso C +compiler for the DECsystem-10. Many thanks to all sales persons with +quote VT100-compatible unquote terminals, who prompted me to write +this program, and also to: + +-- Bo Kleve, LIDAC, Linkoping University, Sweden + for the portation to DECSYSTEM-20 with the Sargasso C compiler + +-- Johan Widen, TTDS, Royal Institute of Technology, Stockholm, Sweden + for the portation to various UNIX systems (incl. System III and Xenix) + +-- Russ Herman, AES Data Inc., Missisauga, Ont. Canada + for fixes and code for the VT102 test + +Thanx also to JMR "Gremlin" at KTH, and Goran Wallberg at QZ +for suggestions, bug fixes, etc. + +This program does not have support for all the different variations +of VT100, like VT125, VT131 nor the new VT200 series. Feel free to +add that yourself. Happy Hacking! + + /TMP diff --git a/konsole/tests/audit.c b/konsole/tests/audit.c new file mode 100644 index 000000000..7a98e9b30 --- /dev/null +++ b/konsole/tests/audit.c @@ -0,0 +1,53 @@ +/* + + This is a tiny test program that can be used to track down + strange effects of the emulation. + + Make: + + - gcc -o audit audit.c + + Usage: + + - In TEShell.C let syslog be stdout. + - konsole > ttt + - produce the effect in question. + - run this program. + pressing any key advances the audit + ^C terminates. + + You need to make sure that the size of the screen matches + the one being debugged. + +*/ + + +#include <stdio.h> +#include <termios.h> +#include <unistd.h> + +struct termios save; +struct termios curr; + +#define HERE fprintf(stderr,"%s(%d): here.\n",__FILE__,__LINE__) + +main() +{ int cc; + FILE* sysin = fopen("ttt","r"); + tcgetattr(0, &save); + tcgetattr(0, &curr); + cfmakeraw(&curr); + tcsetattr(0, TCSANOW, &curr); + cc = fgetc(sysin); + while( cc > 0 ) + { int tmp; + while (cc > 0) + { + fputc(cc,stdout); cc = fgetc(sysin); + if (cc == 0x1b) break; + } + tmp = fgetc(stdin); + if (tmp == 3) break; + } + tcsetattr(0, TCSANOW, &save); +} diff --git a/konsole/tests/bulktest.sh b/konsole/tests/bulktest.sh new file mode 100755 index 000000000..a56348b12 --- /dev/null +++ b/konsole/tests/bulktest.sh @@ -0,0 +1,2 @@ +#!/bin/sh +while true; do echo -n x; done diff --git a/konsole/tests/color-spaces.pl b/konsole/tests/color-spaces.pl new file mode 100644 index 000000000..8774c0446 --- /dev/null +++ b/konsole/tests/color-spaces.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl +# Author: Todd Larason <jtl@molehill.org> +# $XFree86: xc/programs/xterm/vttests/256colors2.pl,v 1.1 1999/07/11 08:49:54 dawes Exp $ + +print "256 color mode\n\n"; + +# display back ground colors + +for ($fgbg = 38; $fgbg <= 48; $fgbg +=10) { + +# first the system ones: +print "System colors:\n"; +for ($color = 0; $color < 8; $color++) { + print "\x1b[${fgbg};5;${color}m::"; +} +print "\x1b[0m\n"; +for ($color = 8; $color < 16; $color++) { + print "\x1b[${fgbg};5;${color}m::"; +} +print "\x1b[0m\n\n"; + +# now the color cube +print "Color cube, 6x6x6:\n"; +for ($green = 0; $green < 6; $green++) { + for ($red = 0; $red < 6; $red++) { + for ($blue = 0; $blue < 6; $blue++) { + $color = 16 + ($red * 36) + ($green * 6) + $blue; + print "\x1b[${fgbg};5;${color}m::"; + } + print "\x1b[0m "; + } + print "\n"; +} + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ($color = 232; $color < 256; $color++) { + print "\x1b[${fgbg};5;${color}m::"; +} +print "\x1b[0m\n\n"; + +} + +print "Examples for the 3-byte color mode\n\n"; + +for ($fgbg = 38; $fgbg <= 48; $fgbg +=10) { + +# now the color cube +print "Color cube\n"; +for ($green = 0; $green < 256; $green+=51) { + for ($red = 0; $red < 256; $red+=51) { + for ($blue = 0; $blue < 256; $blue+=51) { + print "\x1b[${fgbg};2;${red};${green};${blue}m::"; + } + print "\x1b[0m "; + } + print "\n"; +} + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ($gray = 8; $gray < 256; $gray+=10) { + print "\x1b[${fgbg};2;${gray};${gray};${gray}m::"; +} +print "\x1b[0m\n\n"; + +} diff --git a/konsole/tests/colortest.sh b/konsole/tests/colortest.sh new file mode 100755 index 000000000..36a1336dc --- /dev/null +++ b/konsole/tests/colortest.sh @@ -0,0 +1,31 @@ +#!/bin/bash -- +# +# display ANSI colours and test bold/blink attributes +# orginates from Eterm distribution +#------------------------------------------------------------------------- + +ESC=$'\x1b' +CSI="${ESC}[" +RST="${CSI}m" + +echo ""; echo "${RST}" +echo " 40 41 42 43 44 45 46 47 49" +echo " 40 41 42 43 44 45 46 47 49" +for fg in 30 31 32 33 34 35 36 37 39 90 91 92 93 94 95 96 97 +do + l1="$fg "; + l2=" "; + l3=" "; + l4=" "; + for bg in 40 41 42 43 44 45 46 47 49 + do + l1="${l1}${CSI}${fg};${bg}m Normal ${RST}" + l2="${l2}${CSI}${fg};${bg};1m Bold ${RST}" + l3="${l3}${CSI}${fg};${bg};5m Blink ${RST}" + l4="${l4}${CSI}${fg};${bg};1;5m Bold! ${RST}" + done + echo "$l1" + echo "$l2" + echo "$l3" + echo "$l4" +done diff --git a/konsole/tests/ct2 b/konsole/tests/ct2 new file mode 100755 index 000000000..8a654eda6 --- /dev/null +++ b/konsole/tests/ct2 @@ -0,0 +1,20 @@ +#!/bin/sh -- +# +# display ANSI colours and test bold/blink attributes +# orginates from Eterm distribution +#------------------------------------------------------------------------- + +echo ""; echo "[m" +echo " 40 41 42 43 44 45 46 47 49" +for fg in 30 31 32 33 34 35 36 37 39 +do + l1=" $fg "; + l2="[1m $fg [m"; + for bg in 40 41 42 43 44 45 46 47 49 + do + l1="${l1}[${fg};${bg}m xx [m" + l2="${l2}[${fg};${bg};1m XX [m" + done + echo "$l1" + echo "$l2" +done diff --git a/konsole/tests/esc.c b/konsole/tests/esc.c new file mode 100644 index 000000000..520946b50 --- /dev/null +++ b/konsole/tests/esc.c @@ -0,0 +1,398 @@ +#include "header.h" + +println(s) char *s; { + printf("%s\n", s); +} + +esc(s) char *s; { + printf("%c%s", 27, s); +} + +esc2(s1, s2) char s1, s2; { + printf("%c%s%s", 27, s1, s2); +} + +brcstr(ps, c) char *ps, c; { + printf("%c[%s%c", 27, ps, c); +} + +brc(pn,c) int pn; char c; { + printf("%c[%d%c", 27, pn, c); +} + +brc2(pn1, pn2 ,c) int pn1, pn2; char c; { + printf("%c[%d;%d%c", 27, pn1, pn2, c); +} + +cub(pn) int pn; { /* Cursor Backward */ + brc(pn,'D'); +} +cud(pn) int pn; { /* Cursor Down */ + brc(pn,'B'); +} +cuf(pn) int pn; { /* Cursor Forward */ + brc(pn,'C'); +} +cup(pn1, pn2) int pn1, pn2; { /* Cursor Position */ + brc2(pn1, pn2, 'H'); +} +cuu(pn) int pn; { /* Cursor Up */ + brc(pn,'A'); +} +da() { /* Device Attributes */ + brc(0,'c'); +} +decaln() { /* Screen Alignment Display */ + esc("#8"); +} +decdhl(lower) int lower; { /* Double Height Line (also double width) */ + if (lower) esc("#4"); + else esc("#3"); +} +decdwl() { /* Double Wide Line */ + esc("#6"); +} +deckpam() { /* Keypad Application Mode */ + esc("="); +} +deckpnm() { /* Keypad Numeric Mode */ + esc(">"); +} +decll(ps) char *ps; { /* Load LEDs */ + brcstr(ps, 'q'); +} +decrc() { /* Restore Cursor */ + esc("8"); +} +decreqtparm(pn) int pn; { /* Request Terminal Parameters */ + brc(pn,'x'); +} +decsc() { /* Save Cursor */ + esc("7"); +} +decstbm(pn1, pn2) int pn1, pn2; { /* Set Top and Bottom Margins */ + if (pn1 || pn2) brc2(pn1, pn2, 'r'); + else esc("[r"); + /* Good for >24-line terminals */ +} +decswl() { /* Single With Line */ + esc("#5"); +} +dectst(pn) int pn; { /* Invoke Confidence Test */ + brc2(2, pn, 'y'); +} +dsr(pn) int pn; { /* Device Status Report */ + brc(pn, 'n'); +} +ed(pn) int pn; { /* Erase in Display */ + brc(pn, 'J'); +} +el(pn) int pn; { /* Erase in Line */ + brc(pn,'K'); +} +hts() { /* Horizontal Tabulation Set */ + esc("H"); +} +hvp(pn1, pn2) int pn1, pn2; { /* Horizontal and Vertical Position */ + brc2(pn1, pn2, 'f'); +} +ind() { /* Index */ + esc("D"); +} +nel() { /* Next Line */ + esc("E"); +} +ri() { /* Reverse Index */ + esc("M"); +} +ris() { /* Reset to Initial State */ + esc("c"); +} +rm(ps) char *ps; { /* Reset Mode */ + brcstr(ps, 'l'); +} +scs(g,c) int g; char c; { /* Select character Set */ + printf("%c%c%c%c%c%c%c", 27, g ? ')' : '(', c, + 27, g ? '(' : ')', 'B', + g ? 14 : 15); +} +sgr(ps) char *ps; { /* Select Graphic Rendition */ + brcstr(ps, 'm'); +} +sm(ps) char *ps; { /* Set Mode */ + brcstr(ps, 'h'); +} +tbc(pn) int pn; { /* Tabulation Clear */ + brc(pn, 'g'); +} + +vt52cup(l,c) int l,c; { + printf("%cY%c%c", 27, l + 31, c + 31); +} + +char inchar() { + + /* + * Wait until a character is typed on the terminal + * then read it, without waiting for CR. + */ + +#ifdef UNIX + int lval, waittime, getpid(); static int val; char ch; + + fflush(stdout); + lval = val; + brkrd = 0; + reading = 1; + read(0,&ch,1); + reading = 0; + if (brkrd) + val = 0177; + else + val = ch; + if ((val==0177) && (val==lval)) + kill(getpid(), (int) SIGTERM); +#endif +#ifdef SARG10 + int val, waittime; + + waittime = 0; + while(!uuo(051,2,&val)) { /* TTCALL 2, (INCHRS) */ + zleep(100); /* Wait 0.1 seconds */ + if ((waittime += ttymode) > 600) /* Time-out, in case */ + return('\177'); /* of hung in ttybin(1) */ + } +#endif +#ifdef SARG20 /* try to fix a time-out function */ + int val, waittime; + + waittime = 0; + while(jsys(SIBE,2,_PRIIN) == 0) { /* Is input empty? */ + zleep(100); + if ((waittime += ttymode) > 600) + return('\177'); + } + ejsys(BIN,_PRIIN); + val = jsac[2]; +#endif + return(val); +} + +char *instr() { + + /* + * Get an unfinished string from the terminal: + * wait until a character is typed on the terminal, + * then read it, and all other available characters. + * Return a pointer to that string. + */ + + + int i, val, crflag; long l1; char ch; + static char result[80]; + + i = 0; + result[i++] = inchar(); +/* Wait 0.1 seconds (1 second in vanilla UNIX) */ +#ifdef SARG10 + if (trmop(01031,0) < 5) zleep(500); /* wait longer if low speed */ + else zleep(100); +#else + zleep(100); +#endif +#ifdef UNIX + fflush(stdout); +#ifdef XENIX + while(rdchk(0)) { + read(0,result+i,1); + if (i++ == 78) break; + } +#else +#ifdef SIII + while(read(2,result+i,1) == 1) + if (i++ == 78) break; +#else + while(ioctl(0,FIONREAD,&l1), l1 > 0L) { + while(l1-- > 0L) { + read(0,result+i,1); + if (i++ == 78) goto out1; + } + } +out1: +#endif +#endif +#endif +#ifdef SARG10 + while(uuo(051,2,&val)) { /* TTCALL 2, (INCHRS) */ + if (!(val == '\012' && crflag)) /* TOPS-10 adds LF to CR */ + result[i++] = val; + crflag = val == '\015'; + if (i == 79) break; + zleep(50); /* Wait 0.05 seconds */ + } +#endif +#ifdef SARG20 + while(jsys(SIBE,2,_PRIIN) != 0) { /* read input until buffer is empty */ + ejsys(BIN,_PRIIN); + result[i++] = jsac[2]; + if (i == 79) break; + zleep(50); /* Wait 0.05 seconds */ + } +#endif + result[i] = '\0'; + return(result); +} + +ttybin(bin) int bin; { +#ifdef SARG10 + #define OPEN 050 + #define IO_MOD 0000017 + #define _IOPIM 2 + #define _IOASC 0 + #define _TOPAG 01021 + #define _TOSET 01000 + + int v; + static int arglst[] = { + _IOPIM, + `TTY`, + 0 + }; + arglst[0] = bin ? _IOPIM : _IOASC; + v = uuo(OPEN, 1, &arglst[0]); + if (!v) { printf("OPEN failed"); exit(); } + trmop(_TOPAG + _TOSET, bin ? 0 : 1); + ttymode = bin; +#endif +#ifdef SARG20 + /* TTYBIN will set the line in BINARY/ASCII mode + * BINARY mode is needed to send control characters + * Bit 28 must be 0 (we don't flip it). + * Bit 29 is used for the mode change. + */ + + #define _TTASC 0000100 + #define _MOXOF 0000043 + + int v; + + ejsys(RFMOD,_CTTRM); + v = ejsys(SFMOD,_CTTRM, bin ? (~_TTASC & jsac[2]) : (_TTASC | jsac[2])); + if (v) { printf("SFMOD failed"); exit(); } + v = ejsys(MTOPR,_CTTRM,_MOXOF,0); + if (v) { printf("MTOPR failed"); exit(); } +#endif +} + +#ifdef SARG20 +/* + * SUPERBIN turns off/on all input character interrupts + * This affects ^C, ^O, ^T + * Beware where and how you use it !!!!!!! + */ + +superbin(bin) int bin; { + int v; + + v = ejsys(STIW,(0//-5), bin ? 0 : -1); + if (v) { printf("STIW superbinary setting failed"); exit(); } + ttymode = bin; +} + +/* + * PAGE affects the ^S/^Q handshake. + * Set bit 34 to turn it on. Clear it for off. + */ + +page(bin) int bin; { + int v; + + #define TT_PGM 0000002 + + ejsys(RFMOD,_CTTRM); /* Get the current terminal status */ + v = ejsys(STPAR,_CTTRM, bin ? (TT_PGM | jsac[2]) : (~TT_PGM & jsac[2])); + if (v) { printf("STPAR failed"); exit(); } +} +#endif + +trmop(fc,arg) int fc, arg; { +#ifdef SARG10 + int retvalp; + int arglst[3]; + + /* TRMOP is a TOPS-10 monitor call that does things to the terminal. */ + + /* Find out TTY nbr (PA1050 barfs if TRMOP get -1 instead of udx) */ + /* A TRMNO monitor call returns the udx (Universal Device Index) */ + + arglst[0] = fc; /* function code */ + arglst[1] = calli(0115, -1); /* udx, TRMNO. UUO */ + arglst[2] = arg; /* Optional argument */ + + if (calli(0116, 3 // &arglst[0], &retvalp)) /* TRMOP. UUO */ + return (retvalp); + else { + printf("?Error return in TRMOP."); + exit(); + } +#endif +} + +inputline(s) char *s; { + scanf("%s",s); +#ifdef SARG10 + readnl(); +#endif +#ifdef SARG20 + readnl(); +#endif +} + +inflush() { + + /* + * Flush input buffer, make sure no pending input character + */ + + int val; + +#ifdef UNIX +#ifdef XENIX + while(rdchk(0)) read(0,&val,1); +#else +#ifdef SIII + while(read(2,&val,1)); +#else + long l1; + ioctl (0, FIONREAD, &l1); + while(l1-- > 0L) read(0,&val,1); +#endif +#endif +#endif +#ifdef SARG10 + while(uuo(051,2,&val)) /* TTCALL 2, (INCHRS) */ + ; +#endif +#ifdef SARG20 + ejsys(CFIBF,_PRIIN); /* Clear input buffer */ +#endif +} + +zleep(t) int t; { + +/* + * Sleep and do nothing (don't waste CPU) for t milliseconds + */ + +#ifdef SARG10 + calli(072,t); /* (HIBER) t milliseconds */ +#endif +#ifdef SARG20 + ejsys(DISMS,t); /* DISMISS for t milliseconds */ +#endif +#ifdef UNIX + t = t / 1000; + if (t == 0) t = 1; + sleep(t); /* UNIX can only sleep whole seconds */ +#endif +} diff --git a/konsole/tests/header.h b/konsole/tests/header.h new file mode 100644 index 000000000..1c35a2add --- /dev/null +++ b/konsole/tests/header.h @@ -0,0 +1,54 @@ +#define VERSION "1.7b 1985-04-19" + +/* Choose one of these */ + +/* #define XENIX /* XENIX implies UNIX */ +/* #define SIII /* SIII implies UNIX, (NDELAY a la System III) */ +#define UNIX /* UNIX */ +#define TERMIO +/* #define VMS /* VMS not done yet -- send me your version!!!! */ +/* #define SARG20 /* Sargasso C for TOPS-20 */ +/* #define SARG10 /* Sargasso C for TOPS-10 */ + +/* These #ifdef:s are implementation dependent stuff for the Sargasso C */ +/* Unix C barfs on directives like "#strings", so we keep them */ +/* indented. Then unix c can't find them, but Sargasso C *can*. */ +/* Admittedly kludgey, but it works...) */ +#ifdef SARG10 + #define _UNIXCON /* Make UNIX-flavored I/O on TOPS */ + #strings low /* put strings in lowseg mem so we can modify them. */ +#endif +#ifdef SARG20 + #define _UNIXCON /* Make UNIX-flavored I/O on TOPS */ + #strings low /* put strings in lowseg mem so we can modify them. */ + #include <TOPS20.HDR> +#endif + +#include <stdio.h> + + +#ifdef UNIX +#include <ctype.h> +#ifdef TERMIO +# include <termio.h> +#else +# include <sgtty.h> +#endif +#include <signal.h> +#include <setjmp.h> +jmp_buf intrenv; + +#ifdef TERMIO +struct termio termioOrg, termioNew; +#else +struct sgttyb sgttyOrg, sgttyNew; +#endif + +char stdioBuf[BUFSIZ]; +int brkrd, reading; +extern onterm(), onbrk(); +#ifdef SIII +#include <fcntl.h> +#endif +#endif +int ttymode; diff --git a/konsole/tests/main.c b/konsole/tests/main.c new file mode 100644 index 000000000..c80b0426c --- /dev/null +++ b/konsole/tests/main.c @@ -0,0 +1,2083 @@ +/* + VTTEST.C + + Written Novemeber 1983 - July 1984 by Per Lindberg, + Stockholm University Computer Center (QZ), Sweden. + + THE MAD PROGRAMMER STRIKES AGAIN! + + This software is (c) 1984 by QZ + Non-commercial use and copying allowed. + +If you are developing a commercial product, and use this program to do +it, and that product is successful, please send a sum of money of your +choice to the address below. + +*/ + +#include "header.h" + +char inchar(), *instr(), *lookup(); + +struct table { + int key; + char *msg; +} paritytable[] = { + { 1, "NONE" }, + { 4, "ODD" }, + { 5, "EVEN" }, + { -1, "" } +},nbitstable[] = { + { 1, "8" }, + { 2, "7" }, + { -1,"" } +},speedtable[] = { + { 0, "50" }, + { 8, "75" }, + { 16, "110" }, + { 24, "132.5"}, + { 32, "150" }, + { 40, "200" }, + { 48, "300" }, + { 56, "600" }, + { 64, "1200" }, + { 72, "1800" }, + { 80, "2000" }, + { 88, "2400" }, + { 96, "3600" }, + { 104, "4800" }, + { 112, "9600" }, + { 120, "19200" }, + { -1, "" } +}; + +main() { + + int menuchoice; + + static char *mainmenu[] = { + "Exit", + "Test of cursor movements", + "Test of screen features", + "Test of character sets", + "Test of double-sized characters", + "Test of keyboard", + "Test of terminal reports", + "Test of VT52 mode", + "Test of VT102 features (Insert/Delete Char/Line)", + "Test of known bugs", + "Test of reset and self-test", + "" + }; + +#ifdef UNIX + initterminal(setjmp(intrenv)); + signal(SIGINT, onbrk); + signal(SIGTERM, onterm); + reading = 0; +#else + initterminal(0); +#endif + do { +#ifdef SARG20 + ttybin(1); /* set line to binary mode again. It's reset somehow!! */ +#endif + ed(2); + cup(5,10); printf("VT100 test program, version %s", VERSION); + cup(7,10); println("Choose test type:"); + menuchoice = menu(mainmenu); + switch (menuchoice) { + case 1: tst_movements(); break; + case 2: tst_screen(); break; + case 3: tst_characters(); break; + case 4: tst_doublesize(); break; + case 5: tst_keyboard(); break; + case 6: tst_reports(); break; + case 7: tst_vt52(); break; + case 8: tst_insdel(); break; + case 9: tst_bugs(); break; + case 10: tst_rst(); break; + } + } while (menuchoice); + bye(); +} + +tst_movements() { + + /* Test of: + CUF (Cursor Forward) + CUB (Cursor Backward) + CUD (Cursor Down) IND (Index) NEL (Next Line) + CUU (Cursor Up) RI (Reverse Index) + CUP (Cursor Position) HVP (Horizontal and Vertical Position) + ED (Erase in Display) + EL (Erase in Line) + DECALN (Screen Alignment Display) + <CR> <BS> + Cursor control characters inside CSI sequences + */ + + int i, row, col, pass, width, hlfxtra; + char c, *ctext = "This is a correct sentence"; + + for (pass = 0; pass <= 1; pass++) { + if (pass == 0) { rm("?3"); width = 80; hlfxtra = 0; } + else { sm("?3"); width = 132; hlfxtra = 26; } + + decaln(); + cup( 9,10+hlfxtra); ed(1); + cup(18,60+hlfxtra); ed(0); el(1); + cup( 9,71+hlfxtra); el(0); + for (row = 10; row <= 16; row++) { + cup(row, 10+hlfxtra); el(1); + cup(row, 71+hlfxtra); el(0); + } + cup(17,30); el(2); + for (col = 1; col <= width; col++) { + hvp(24, col); printf("*"); + hvp( 1, col); printf("*"); + } + cup(2,2); + for (row = 2; row <= 23; row++) { + printf("+"); + cub(1); + ind(); + } + cup(23,width-1); + for (row = 23; row >=2; row--) { + printf("+"); + cub(1); ri(); + } + cup(2,1); + for (row = 2; row <= 23; row++) { + printf("*"); cup(row, width); + printf("*"); + cub(10); + if (row < 10) nel(); + else printf("\n"); + } + cup(2,10); + cub(42+hlfxtra); cuf(2); + for (col = 3; col <= width-2; col++) { + printf("+"); + cuf(0); cub(2); cuf(1); + } + cup(23,70+hlfxtra); + cuf(42+hlfxtra); cub(2); + for (col = width-2; col >= 3; col--) { + printf("+"); + cub(1); cuf(1); cub(0); printf("%c", 8); + } + cup( 1, 1); cuu(10); cuu(1); cuu(0); + cup(24,width); cud(10); cud(1); cud(0); + + cup(10,12+hlfxtra); + for (row = 10; row <= 15; row++) { + for (col = 12+hlfxtra; col <= 69+hlfxtra; col++) printf(" "); + cud(1); cub(58); + } + cuu(5); cuf(1); + printf("The screen should be cleared, and have an unbroken bor-"); + cup(12,13+hlfxtra); + printf("der of *'s and +'s around the edge, and exactly in the"); + cup(13,13+hlfxtra); + printf("middle there should be a frame of E's around this text"); + cup(14,13+hlfxtra); + printf("with one (1) free position around it. "); + holdit(); + } + rm("?3"); + + ed(2); + cup(1,1); + println("Test of cursor-control characters inside ESC sequences."); + println("Below should be two identical lines:"); + println(""); + println("A B C D E F G H I J K L M N O P Q R S"); + for (i = 1; i < 20; i++) { + printf("%c", 64 + i); + brcstr("2\010", 'C'); /* Two forward, one backspace */ + } + println(""); + println(""); + holdit(); + + ed(2); + cup(1,1); + println("Test of leading zeros in ESC sequences."); + printf("Two lines below you should see the sentence \"%s\".",ctext); + for (col = 1; *ctext; col++) + printf("\033[00000000004;00000000%dH%c",col,*ctext++); + cup(20,1); + holdit(); +} + +tst_screen() { + + /* Test of: + - DECSTBM (Set Top and Bottom Margins) + - TBC (Tabulation Clear) + - HTS (Horizontal Tabulation Set) + - SM RM (Set/Reset mode): - 80/132 chars + - Origin: Realtive/absolute + - Scroll: Smooth/jump + - Wraparound + - SGR (Select Graphic Rendition) + - SM RM (Set/Reset Mode) - Inverse + - DECSC (Save Cursor) + - DECRC (Restore Cursor) + */ + + int i, j, cset, row, col, down, soft, background; + + static char *tststr = "*qx`"; + static char *attr[5] = { ";0", ";1", ";4", ";5", ";7" }; + + cup(1,1); + sm("?7"); /* Wrap Around ON */ + for (col = 1; col <= 160; col++) printf("*"); + rm("?7"); /* Wrap Around OFF */ + cup(3,1); + for (col = 1; col <= 160; col++) printf("*"); + sm("?7"); /* Wrap Around ON */ + cup(5,1); + println("This should be three identical lines of *'s completely filling"); + println("the top of the screen without any empty lines between."); + println("(Test of WRAP AROUND mode setting.)"); + holdit(); + + ed(2); + tbc(3); + cup(1,1); + for (col = 1; col <= 78; col += 3) { + cuf(3); hts(); + } + cup(1,4); + for (col = 4; col <= 78; col += 6) { + tbc(0); cuf(6); + } + cup(1,7); tbc(1); tbc(2); /* no-op */ + cup(1,1); for (col = 1; col <= 78; col += 6) printf("\t*"); + cup(2,2); for (col = 2; col <= 78; col += 6) printf(" *"); + cup(4,1); + println("Test of TAB setting/resetting. These two lines"); + printf("should look the same. "); + holdit(); + for (background = 0; background <= 1; background++) { + if (background) rm("?5"); + else sm("?5"); + sm("?3"); /* 132 cols */ + ed(2); /* VT100 clears screen on SM3/RM3, but not obviously, so... */ + cup(1,1); tbc(3); + for (col = 1; col <= 132; col += 8) { + cuf(8); hts(); + } + cup(1,1); for (col = 1; col <= 130; col += 10) printf("1234567890"); + printf("12"); + for (row = 3; row <= 20; row++) { + cup(row,row); + printf("This is 132 column mode, %s background.", + background ? "dark" : "light"); + } + holdit(); + rm("?3"); /* 80 cols */ + ed(2); /* VT100 clears screen on SM3/RM3, but not obviously, so... */ + cup(1,1); for (col = 1; col <= 80; col += 10) printf("1234567890"); + for (row = 3; row <= 20; row++) { + cup(row,row); + printf("This is 80 column mode, %s background.", + background ? "dark" : "light"); + } + holdit(); + } + ed(2); + sm("?6"); /* Origin mode (relative) */ + for (soft = -1; soft <= 0; soft++) { + if (soft) sm("?4"); + else rm("?4"); + for (row = 12; row >= 1; row -= 11) { + decstbm(row, 24-row+1); + ed(2); + for (down = 0; down >= -1; down--) { + if (down) cuu(24); + else cud(24); + for (i = 1; i <= 30; i++) { + printf("%s scroll %s region %d Line %d\n", + soft ? "Soft" : "Jump", + down ? "down" : "up", + 2*(13-row), i); + if (down) { ri(); ri(); } + } + } + holdit(); + } + } + ed(2); + decstbm(23,24); + printf( + "\nOrigin mode test. This line should be at the bottom of the screen."); + cup(1,1); + printf("%s", + "This line should be the one above the bottom of the screeen. "); + holdit(); + ed(2); + rm("?6"); /* Origin mode (absolute) */ + cup(24,1); + printf( + "Origin mode test. This line should be at the bottom of the screen."); + cup(1,1); + printf("%s", "This line should be at the top if the screen. "); + holdit(); + decstbm(1,24); + + ed(2); + cup( 1,20); printf("Graphic rendition test pattern:"); + cup( 4, 1); sgr("0"); printf("vanilla"); + cup( 4,40); sgr("0;1"); printf("bold"); + cup( 6, 6); sgr(";4"); printf("underline"); + cup( 6,45);sgr(";1");sgr("4");printf("bold underline"); + cup( 8, 1); sgr("0;5"); printf("blink"); + cup( 8,40); sgr("0;5;1"); printf("bold blink"); + cup(10, 6); sgr("0;4;5"); printf("underline blink"); + cup(10,45); sgr("0;1;4;5"); printf("bold underline blink"); + cup(12, 1); sgr("1;4;5;0;7"); printf("negative"); + cup(12,40); sgr("0;1;7"); printf("bold negative"); + cup(14, 6); sgr("0;4;7"); printf("underline negative"); + cup(14,45); sgr("0;1;4;7"); printf("bold underline negative"); + cup(16, 1); sgr("1;4;;5;7"); printf("blink negative"); + cup(16,40); sgr("0;1;5;7"); printf("bold blink negative"); + cup(18, 6); sgr("0;4;5;7"); printf("underline blink negative"); + cup(18,45); sgr("0;1;4;5;7"); printf("bold underline blink negative"); + sgr(""); + + rm("?5"); /* Inverse video off */ + cup(23,1); el(0); printf("Dark background. "); holdit(); + sm("?5"); /* Inverse video */ + cup(23,1); el(0); printf("Light background. "); holdit(); + rm("?5"); + ed(2); + cup(8,12); printf("normal"); + cup(8,24); printf("bold"); + cup(8,36); printf("underscored"); + cup(8,48); printf("blinking"); + cup(8,60); printf("reversed"); + cup(10,1); printf("stars:"); + cup(12,1); printf("line:"); + cup(14,1); printf("x'es:"); + cup(16,1); printf("diamonds:"); + for (cset = 0; cset <= 3; cset++) { + for (i = 0; i <= 4; i++) { + cup(10 + 2 * cset, 12 + 12 * i); + sgr(attr[i]); + if (cset == 0 || cset == 2) scs(0,'B'); + else scs(0,'0'); + for (j = 0; j <= 4; j++) { + printf("%c", tststr[cset]); + } + decsc(); + cup(cset + 1, i + 1); sgr(""); scs(0,'B'); printf("A"); + decrc(); + for (j = 0; j <= 4; j++) { + printf("%c", tststr[cset]); + } + } + } + sgr("0"); scs(0,'B'); cup(21,1); + println("Test of the SAVE/RESTORE CURSOR feature. There should"); + println("be ten characters of each flavour, and a rectangle"); + println("of 5 x 4 A's filling the top left of the screen."); + holdit(); +} + +tst_characters() { + /* Test of: + SCS (Select character Set) + */ + + int i, j, g, cset; + char chcode[5], *setmsg[5]; + + chcode[0] = 'A'; + chcode[1] = 'B'; + chcode[2] = '0'; + chcode[3] = '1'; + chcode[4] = '2'; + setmsg[0] = "UK / national"; + setmsg[1] = "US ASCII"; + setmsg[2] = "Special graphics and line drawing"; + setmsg[3] = "Alternate character ROM standard characters"; + setmsg[4] = "Alternate character ROM special graphics"; + + cup(1,10); printf("Selected as G0 (with SI)"); + cup(1,48); printf("Selected as G1 (with SO)"); + for (cset = 0; cset <= 4; cset++) { + scs(1,'B'); + cup(3 + 4 * cset, 1); + sgr("1"); + printf("Character set %c (%s)",chcode[cset], setmsg[cset]); + sgr("0"); + for (g = 0; g <= 1; g++) { + scs(g,chcode[cset]); + for (i = 1; i <= 3; i++) { + cup(3 + 4 * cset + i, 10 + 38 * g); + for (j = 0; j <= 31; j++) { + printf("%c", i * 32 + j); + } + } + } + } + scs(1,'B'); + cup(24,1); printf("These are the installed character sets. "); + holdit(); +} + +tst_doublesize() { + /* Test of: + DECSWL (Single Width Line) + DECDWL (Double Width Line) + DECDHL (Double Height Line) (also implicit double width) + */ + + int col, i, w, w1; + + /* Print the test pattern in both 80 and 132 character width */ + + for(w = 0; w <= 1; w++) { + w1 = 13 * w; + + ed(2); + cup(1, 1); + if (w) { sm("?3"); printf("132 column mode"); } + else { rm("?3"); printf(" 80 column mode"); } + + cup( 5, 3 + 2 * w1); + printf("v------- left margin"); + + cup( 7, 3 + 2 * w1); + printf("This is a normal-sized line"); + decdhl(0); decdhl(1); decdwl(); decswl(); + + cup( 9, 2 + w1); + printf("This is a Double-width line"); + decswl(); decdhl(0); decdhl(1); decdwl(); + + cup(11, 2 + w1); + decdwl(); decswl(); decdhl(1); decdhl(0); + printf("This is a Double-width-and-height line"); + cup(12, 2 + w1); + decdwl(); decswl(); decdhl(0); decdhl(1); + printf("This is a Double-width-and-height line"); + + cup(14, 2 + w1); + decdwl(); decswl(); decdhl(1); decdhl(0); el(2); + printf("This is another such line"); + cup(15, 2 + w1); + decdwl(); decswl(); decdhl(0); decdhl(1); + printf("This is another such line"); + + cup(17, 3 + 2 * w1); + printf("^------- left margin"); + + cup(21, 1); + printf("This is not a double-width line"); + for (i = 0; i <= 1; i++) { + cup(21,6); + if (i) { printf("**is**"); decdwl(); } + else { printf("is not"); decswl(); } + cup(23,1); holdit(); + } + } + /* Set vanilla tabs for next test */ + cup(1,1); tbc(3); for (col = 1; col <= 132; col += 8) { cuf(8); hts(); } + rm("?3"); + ed(2); + scs(0,'0'); + + cup( 8,1); decdhl(0); printf("lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk"); + cup( 9,1); decdhl(1); printf("lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk"); + cup(10,1); decdhl(0); printf("x%c%c%c%c%cx",9,9,9,9,9); + cup(11,1); decdhl(1); printf("x%c%c%c%c%cx",9,9,9,9,9); + cup(12,1); decdhl(0); printf("x%c%c%c%c%cx",9,9,9,9,9); + cup(13,1); decdhl(1); printf("x%c%c%c%c%cx",9,9,9,9,9); + cup(14,1); decdhl(0); printf("x x"); + cup(15,1); decdhl(1); printf("x x"); + cup(16,1); decdhl(0); printf("mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj"); + cup(17,1); decdhl(1); printf("mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj"); + scs(0,'B'); sgr("1;5"); + cup(12,3); + printf("* The mad programmer strikes again * "); + cup(13,3); printf("%c",9); cub(6); + printf("* The mad programmer strikes again *"); + sgr("0"); + cup(22,1); + println("Another test pattern... a frame with blinking bold text,"); + printf("all in double-height double-width size. "); + holdit(); + + decstbm(8,24); /* Absolute origin mode, so cursor is set at (1,1) */ + cup(8,1); + for (i = 1; i <= 12; i++) + ri(); + decstbm(0,0); /* No scroll region */ + cup(1,1); + printf("%s", "Exactly half of the box should remain. "); + holdit(); +} + +tst_keyboard() { + +/* Test of: + - DECLL (Load LEDs) + - Keyboard return messages + - SM RM (Set/Reset Mode) - Cursor Keys + - Auto repeat + - DECKPAM (Keypad Application Mode) + - DECKPNM (Keypad Numeric Mode) + +The standard VT100 keayboard layout: + + UP DN LE RI + +ESC 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ `~ BS + +TAB* qQ wW eE rR tT yY uU iI oO pP [{ ]} DEL + +** ** aA sS dD fF gG hH jJ kK lL ;: ," RETN \| + +** **** zZ xX cC vV bB nN mM ,< .> /? **** LF + + ****************SPACE BAR**************** + + PF1 PF2 PF3 PF4 + + *7* *8* *9* *-* + + *4* *5* *6* *,* + + *1* *2* *3* + + ***0*** *.* ENT +*/ + + char *ledmsg[6], *ledseq[6]; + + int i, j, okflag; + int kblayout; + int ckeymode; + int fkeymode; + char kbdc; + char kbds[2]; + char *curkeystr, *fnkeystr, *abmstr; + char arptstring[500]; + + static struct key { + char c; + int row; + int col; + char *symbol; + } keytab [] = { + { 27, 1, 0, "ESC" }, + { '1', 1, 6, "1" }, { '!', 1, 7, "!" }, + { '2', 1, 11, "2" }, { '@', 1, 12, "@" }, + { '3', 1, 16, "3" }, { '#', 1, 17, "#" }, + { '4', 1, 21, "4" }, { '$', 1, 22, "$" }, + { '5', 1, 26, "5" }, { '%', 1, 27, "%" }, + { '6', 1, 31, "6" }, { '^', 1, 32, "^" }, + { '7', 1, 36, "7" }, { '&', 1, 37, "&" }, + { '8', 1, 41, "8" }, { '*', 1, 42, "*" }, + { '9', 1, 46, "9" }, { '(', 1, 47, "(" }, + { '0', 1, 51, "0" }, { ')', 1, 52, ")" }, + { '-', 1, 56, "-" }, { '_', 1, 57, "_" }, + { '=', 1, 61, "=" }, { '+', 1, 62, "+" }, + { '`', 1, 66, "`" }, { '~', 1, 67, "~" }, + { 8, 1, 70, "BS" }, + { 9, 2, 0, " TAB " }, + { 'q', 2, 8, "q" }, { 'Q', 2, 9, "Q" }, + { 'w', 2, 13, "w" }, { 'W', 2, 14, "W" }, + { 'e', 2, 18, "e" }, { 'E', 2, 19, "E" }, + { 'r', 2, 23, "r" }, { 'R', 2, 24, "R" }, + { 't', 2, 28, "t" }, { 'T', 2, 29, "T" }, + { 'y', 2, 33, "y" }, { 'Y', 2, 34, "Y" }, + { 'u', 2, 38, "u" }, { 'U', 2, 39, "U" }, + { 'i', 2, 43, "i" }, { 'I', 2, 44, "I" }, + { 'o', 2, 48, "o" }, { 'O', 2, 49, "O" }, + { 'p', 2, 53, "p" }, { 'P', 2, 54, "P" }, + { '[', 2, 58, "[" }, { '{', 2, 59, "{" }, + { ']', 2, 63, "]" }, { '}', 2, 64, "}" }, + { 127, 2, 71, "DEL" }, + { 'a', 3, 10, "a" }, { 'A', 3, 11, "A" }, + { 's', 3, 15, "s" }, { 'S', 3, 16, "S" }, + { 'd', 3, 20, "d" }, { 'D', 3, 21, "D" }, + { 'f', 3, 25, "f" }, { 'F', 3, 26, "F" }, + { 'g', 3, 30, "g" }, { 'G', 3, 31, "G" }, + { 'h', 3, 35, "h" }, { 'H', 3, 36, "H" }, + { 'j', 3, 40, "j" }, { 'J', 3, 41, "J" }, + { 'k', 3, 45, "k" }, { 'K', 3, 46, "K" }, + { 'l', 3, 50, "l" }, { 'L', 3, 51, "L" }, + { ';', 3, 55, ";" }, { ':', 3, 56, ":" }, + {'\'', 3, 60, "'" }, { '"', 3, 61,"\"" }, + { 13, 3, 65, "RETN"}, + {'\\', 3, 71,"\\" }, { '|', 3, 72, "|" }, + { 'z', 4, 12, "z" }, { 'Z', 4, 13, "Z" }, + { 'x', 4, 17, "x" }, { 'X', 4, 18, "X" }, + { 'c', 4, 22, "c" }, { 'C', 4, 23, "C" }, + { 'v', 4, 27, "v" }, { 'V', 4, 28, "V" }, + { 'b', 4, 32, "b" }, { 'B', 4, 33, "B" }, + { 'n', 4, 37, "n" }, { 'N', 4, 38, "N" }, + { 'm', 4, 42, "m" }, { 'M', 4, 43, "M" }, + { ',', 4, 47, "," }, { '<', 4, 48, "<" }, + { '.', 4, 52, "." }, { '>', 4, 53, ">" }, + { '/', 4, 57, "/" }, { '?', 4, 58, "?" }, + { 10, 4, 69, "LF" }, + { ' ', 5, 13, " SPACE BAR "}, + {'\0', 0, 0, "" } + }; + + static struct natkey { + char natc; + int natrow; + int natcol; + char *natsymbol; + } natkeytab [][29] = { + { + { '"', 1, 12, "\""}, + { '&', 1, 32, "&" }, + { '/', 1, 37, "/" }, + { '(', 1, 42, "(" }, + { ')', 1, 47, ")" }, + { '=', 1, 52, "=" }, + { '+', 1, 56, "+" }, { '?', 1, 57, "?" }, + { '`', 1, 61, "`" }, { '@', 1, 62, "@" }, + { '<', 1, 66, "<" }, { '>', 1, 67, ">" }, + { '}', 2, 58, "}" }, { ']', 2, 59, "]" }, + { '^', 2, 63, "^" }, { '~', 2, 64, "~" }, + { '|', 3, 55, "|" }, {'\\', 3, 56,"\\" }, + { '{', 3, 60, "{" }, { '[', 3, 61, "[" }, + {'\'', 3, 71, "'" }, { '*', 3, 72, "*" }, + { ',', 4, 47, "," }, { ';', 4, 48, ";" }, + { '.', 4, 52, "." }, { ':', 4, 53, ":" }, + { '-', 4, 57, "-" }, { '_', 4, 58, "_" }, + {'\0', 0, 0, "" } + }, + { + { '"', 1, 12, "\""}, + { '&', 1, 32, "&" }, + { '/', 1, 37, "/" }, + { '(', 1, 42, "(" }, + { ')', 1, 47, ")" }, + { '=', 1, 52, "=" }, + { '+', 1, 56, "+" }, { '?', 1, 57, "?" }, + { '`', 1, 61, "`" }, { '@', 1, 62, "@" }, + { '<', 1, 66, "<" }, { '>', 1, 67, ">" }, + { '}', 2, 58, "}" }, { ']', 2, 59, "]" }, + { '~', 2, 63, "~" }, { '^', 2, 64, "^" }, + { '|', 3, 55, "|" }, {'\\', 3, 56,"\\" }, + { '{', 3, 60, "{" }, { '[', 3, 61, "[" }, + {'\'', 3, 71, "'" }, { '*', 3, 72, "*" }, + { ',', 4, 47, "," }, { ';', 4, 48, ";" }, + { '.', 4, 52, "." }, { ':', 4, 53, ":" }, + { '-', 4, 57, "-" }, { '_', 4, 58, "_" }, + {'\0', 0, 0, "" } + } + }; + + static struct curkey { + char *curkeymsg[3]; + int curkeyrow; + int curkeycol; + char *curkeysymbol; + char *curkeyname; + } curkeytab [] = { + + /* A Reset, A Set, VT52 */ + + {{"\033[A","\033OA","\033A"}, 0, 56, "UP", "Up arrow" }, + {{"\033[B","\033OB","\033B"}, 0, 61, "DN", "Down arrow" }, + {{"\033[D","\033OD","\033D"}, 0, 66, "LT", "Left arrow" }, + {{"\033[C","\033OC","\033C"}, 0, 71, "RT", "Right arrow"}, + {{"", "", "" }, 0, 0, "", "" } + }; + + static struct fnkey { + char *fnkeymsg[4]; + int fnkeyrow; + int fnkeycol; + char *fnkeysymbol; + char *fnkeyname; + } fnkeytab [] = { + + /* ANSI-num,ANSI-app,VT52-nu,VT52-ap, r, c, symb name */ + + {{"\033OP","\033OP","\033P","\033P" }, 6, 59, "PF1", "PF1" }, + {{"\033OQ","\033OQ","\033Q","\033Q" }, 6, 63, "PF2", "PF2" }, + {{"\033OR","\033OR","\033R","\033R" }, 6, 67, "PF3", "PF3" }, + {{"\033OS","\033OS","\033S","\033S" }, 6, 71, "PF4", "PF4" }, + {{"7", "\033Ow","7", "\033?w"}, 7, 59, " 7 ", "Numeric 7" }, + {{"8", "\033Ox","8", "\033?x"}, 7, 63, " 8 ", "Numeric 8" }, + {{"9", "\033Oy","9", "\033?y"}, 7, 67, " 9 ", "Numeric 9" }, + {{"-", "\033Om","-", "\033?m"}, 7, 71, " - ", "Minus" }, + {{"4", "\033Ot","4", "\033?t"}, 8, 59, " 4 ", "Numeric 4" }, + {{"5", "\033Ou","5", "\033?u"}, 8, 63, " 5 ", "Numeric 5" }, + {{"6", "\033Ov","6", "\033?v"}, 8, 67, " 6 ", "Numeric 6" }, + {{",", "\033Ol",",", "\033?l"}, 8, 71, " , ", "Comma" }, + {{"1", "\033Oq","1", "\033?q"}, 9, 59, " 1 ", "Numeric 1" }, + {{"2", "\033Or","2", "\033?r"}, 9, 63, " 2 ", "Numeric 2" }, + {{"3", "\033Os","3", "\033?s"}, 9, 67, " 3 ", "Numeric 3" }, + {{"0", "\033Op","0", "\033?p"},10, 59," O ","Numeric 0"}, + {{".", "\033On",".", "\033?n"},10, 67, " . ", "Point" }, + {{"\015", "\033OM","\015", "\033?M"},10, 71, "ENT", "ENTER" }, + {{"","","",""}, 0, 0, "", "" } + }; + + static struct ckey { + int ccount; + char *csymbol; + } ckeytab [] = { + { 0, "NUL (CTRL-@ or CTRL-Space)" }, + { 0, "SOH (CTRL-A)" }, + { 0, "STX (CTRL-B)" }, + { 0, "ETX (CTRL-C)" }, + { 0, "EOT (CTRL-D)" }, + { 0, "ENQ (CTRL-E)" }, + { 0, "ACK (CTRL-F)" }, + { 0, "BEL (CTRL-G)" }, + { 0, "BS (CTRL-H) (BACK SPACE)" }, + { 0, "HT (CTRL-I) (TAB)" }, + { 0, "LF (CTRL-J) (LINE FEED)" }, + { 0, "VT (CTRL-K)" }, + { 0, "FF (CTRL-L)" }, + { 0, "CR (CTRL-M) (RETURN)" }, + { 0, "SO (CTRL-N)" }, + { 0, "SI (CTRL-O)" }, + { 0, "DLE (CTRL-P)" }, + { 0, "DC1 (CTRL-Q) (X-On)" }, + { 0, "DC2 (CTRL-R)" }, + { 0, "DC3 (CTRL-S) (X-Off)" }, + { 0, "DC4 (CTRL-T)" }, + { 0, "NAK (CTRL-U)" }, + { 0, "SYN (CTRL-V)" }, + { 0, "ETB (CTRL-W)" }, + { 0, "CAN (CTRL-X)" }, + { 0, "EM (CTRL-Y)" }, + { 0, "SUB (CTRL-Z)" }, + { 0, "ESC (CTRL-[) (ESCAPE)" }, + { 0, "FS (CTRL-\\ or CTRL-? or CTRL-_)" }, + { 0, "GS (CTRL-])" }, + { 0, "RS (CTRL-^ or CTRL-~ or CTRL-`)" }, + { 0, "US (CTRL-_ or CTRL-?)" } + }; + + static char *keyboardmenu[] = { + "Standard American ASCII layout", + "Swedish national layout D47", + "Swedish national layout E47", + /* add new keyboard layouts here */ + "" + }; + + static char *curkeymodes[3] = { + "ANSI / Cursor key mode RESET", + "ANSI / Cursor key mode SET", + "VT52 Mode" + }; + + static char *fnkeymodes[4] = { + "ANSI Numeric mode", + "ANSI Application mode", + "VT52 Numeric mode", + "VT52 Application mode" + }; + + ledmsg[0] = "L1 L2 L3 L4"; ledseq[0] = "1;2;3;4"; + ledmsg[1] = " L2 L3 L4"; ledseq[1] = "1;0;4;3;2"; + ledmsg[2] = " L2 L3"; ledseq[2] = "1;4;;2;3"; + ledmsg[3] = "L1 L2"; ledseq[3] = ";;2;1"; + ledmsg[4] = "L1"; ledseq[4] = "1"; + ledmsg[5] = ""; ledseq[5] = ""; + +#ifdef UNIX + fflush(stdout); +#endif + + ed(2); + cup(10,1); + println("These LEDs (\"lamps\") on the keyboard should be on:"); + for (i = 0; i <= 5; i++) { + cup(10,52); el(0); printf("%s", ledmsg[i]); + decll("0"); + decll(ledseq[i]); + cup(12,1); holdit(); + } + + ed(2); + cup(10,1); + println("Test of the AUTO REPEAT feature"); + println(""); + println("Hold down an alphanumeric key for a while, then push RETURN."); + printf("%s", "Auto Repeat OFF: "); + rm("?8"); + inputline(arptstring); + if (strlen(arptstring) == 0) println("No characters read!??"); + else if (strlen(arptstring) == 1) println("OK."); + else println("Too many characters read."); + println(""); + println("Hold down an alphanumeric key for a while, then push RETURN."); + printf("%s", "Auto Repeat ON: "); + sm("?8"); + inputline(arptstring); + if (strlen(arptstring) == 0) println("No characters read!??"); + else if (strlen(arptstring) == 1) println("Not enough characters read."); + else println("OK."); + println(""); + holdit(); + + ed(2); + cup(5,10); + println("Choose keyboard layout:"); + kblayout = menu(keyboardmenu); + if (kblayout) { + kblayout--; + for (j = 0; natkeytab[kblayout][j].natc != '\0'; j++) { + for (i = 0; keytab[i].c != '\0'; i++) { + if (keytab[i].row == natkeytab[kblayout][j].natrow && + keytab[i].col == natkeytab[kblayout][j].natcol) { + keytab[i].c = natkeytab[kblayout][j].natc; + keytab[i].symbol = natkeytab[kblayout][j].natsymbol; + break; + } + } + } + } + + ed(2); + for (i = 0; keytab[i].c != '\0'; i++) { + cup(1 + 2 * keytab[i].row, 1 + keytab[i].col); + sgr("7"); + printf("%s", keytab[i].symbol); + sgr(""); + } + cup(22,1); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag &= (~ICRNL); + termioNew.c_oflag &= (~ONLCR); + termioNew.c_lflag &= (~ECHO & ~ECHOE & ~ECHOK & ~ECHONL); + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags &= ~CRMOD; + sgttyNew.sg_flags &= ~ECHO; + stty(0, &sgttyNew); +# endif +#endif + inflush(); + printf("Press each key, both shifted and unshifted. Finish with RETURN:"); + do { /* while (kbdc != 13) */ + cup(23,1); kbdc = inchar(); + cup(23,1); el(0); + sprintf(kbds, "%c", kbdc); + chrprint(kbds); + for (i = 0; keytab[i].c != '\0'; i++) { + if (keytab[i].c == kbdc) { + cup(1 + 2 * keytab[i].row, 1 + keytab[i].col); + printf("%s", keytab[i].symbol); + break; + } + } + } while (kbdc != 13); +#ifdef SARG10 + inchar(); /* Local hack: Read LF that TOPS-10 adds to CR */ +#endif + cup(23,1); el(0); + + for (ckeymode = 0; ckeymode <= 2; ckeymode++) { + if (ckeymode) sm("?1"); + else rm("?1"); + for (i = 0; curkeytab[i].curkeysymbol[0] != '\0'; i++) { + cup(1 + 2 * curkeytab[i].curkeyrow, 1 + curkeytab[i].curkeycol); + sgr("7"); + printf("%s", curkeytab[i].curkeysymbol); + sgr(""); + } + cup(20,1); printf("<%s>%20s", curkeymodes[ckeymode], ""); + cup(22,1); el(0); + cup(22,1); printf("%s", "Press each cursor key. Finish with TAB."); + for(;;) { + cup(23,1); + if (ckeymode == 2) rm("?2"); /* VT52 mode */ + curkeystr = instr(); + esc("<"); /* ANSI mode */ + cup(23,1); el(0); + cup(23,1); chrprint(curkeystr); + if (!strcmp(curkeystr,"\t")) break; + for (i = 0; curkeytab[i].curkeysymbol[0] != '\0'; i++) { + if (!strcmp(curkeystr,curkeytab[i].curkeymsg[ckeymode])) { + sgr("7"); + printf(" (%s key) ", curkeytab[i].curkeyname); + sgr(""); + cup(1 + 2 * curkeytab[i].curkeyrow, + 1 + curkeytab[i].curkeycol); + printf("%s", curkeytab[i].curkeysymbol); + break; + } + } + if (i == sizeof(curkeytab) / sizeof(struct curkey) - 1) { + sgr("7"); + printf("%s", " (Unknown cursor key) "); + sgr(""); + } + } + } + + for (fkeymode = 0; fkeymode <= 3; fkeymode++) { + for (i = 0; fnkeytab[i].fnkeysymbol[0] != '\0'; i++) { + cup(1 + 2 * fnkeytab[i].fnkeyrow, 1 + fnkeytab[i].fnkeycol); + sgr("7"); + printf("%s", fnkeytab[i].fnkeysymbol); + sgr(""); + } + cup(20,1); printf("<%s>%20s", fnkeymodes[fkeymode], ""); + cup(22,1); el(0); + cup(22,1); printf("%s", "Press each function key. Finish with TAB."); + for(;;) { + cup(23,1); + if (fkeymode >= 2) rm("?2"); /* VT52 mode */ + if (fkeymode % 2) deckpam(); /* Application mode */ + else deckpnm(); /* Numeric mode */ + fnkeystr = instr(); + esc("<"); /* ANSI mode */ + cup(23,1); el(0); + cup(23,1); chrprint(fnkeystr); + if (!strcmp(fnkeystr,"\t")) break; + for (i = 0; fnkeytab[i].fnkeysymbol[0] != '\0'; i++) { + if (!strcmp(fnkeystr,fnkeytab[i].fnkeymsg[fkeymode])) { + sgr("7"); + printf(" (%s key) ", fnkeytab[i].fnkeyname); + sgr(""); + cup(1 + 2 * fnkeytab[i].fnkeyrow, 1 + fnkeytab[i].fnkeycol); + printf("%s", fnkeytab[i].fnkeysymbol); + break; + } + } + if (i == sizeof(fnkeytab) / sizeof(struct fnkey) - 1) { + sgr("7"); + printf("%s", " (Unknown function key) "); + sgr(""); + } + } + } + +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag |= ICRNL; + termioNew.c_oflag |= ONLCR; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags |= CRMOD; + stty(0, &sgttyNew); +# endif +#endif + ed(2); + cup(5,1); + println("Finally, a check of the ANSWERBACK MESSAGE, which can be sent"); + println("by pressing CTRL-BREAK. The answerback message can be loaded"); + println("in SET-UP B by pressing SHIFT-A and typing e.g."); + println(""); + println(" \" H e l l o , w o r l d Return \""); + println(""); + println("(the double-quote characters included). Do that, and then try"); + println("to send an answerback message with CTRL-BREAK. If it works,"); + println("the answerback message should be displayed in reverse mode."); + println("Finish with a single RETURN."); + +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag &= ~ICRNL; + termioNew.c_oflag &= ~ONLCR; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags &= ~CRMOD; + stty(0, &sgttyNew); +# endif +#endif + do { + cup(17,1); + inflush(); + abmstr = instr(); + cup(17,1); + el(0); + chrprint(abmstr); + } while (strcmp(abmstr,"\r")); + + ed(2); + for (i = 0; i < 32; i++) { + cup(1 + (i % 16), 1 + 40 * (i / 16)); + sgr("7"); + printf("%s", ckeytab[i].csymbol); + sgr("0"); + } + cup(19,1); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag |= ICRNL; + termioNew.c_oflag |= ONLCR; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags |= CRMOD; + stty(0, &sgttyNew); +# endif +#endif + + println( + "Push each CTRL-key TWICE. Note that you should be able to send *all*"); + println( + "CTRL-codes twice, including CTRL-S (X-Off) and CTRL-Q (X-Off)!"); + println( + "Finish with DEL (also called DELETE or RUB OUT), or wait 1 minute."); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag &= ~(ICRNL|IXON); + termioNew.c_lflag &= ~(ICANON|ISIG); + termioNew.c_cc[VMIN] = 1; + termioNew.c_cc[VTIME] = 0; + (void) ioctl(0, TCSETAW, &termioNew); +# else +# ifdef SIII + sgttyNew.sg_flags &= ~CBREAK; + stty(0, &sgttyNew); +# endif + sgttyNew.sg_flags |= RAW; + stty(0, &sgttyNew); +# endif +#endif + ttybin(1); +#ifdef SARG20 + page(0); /* Turn off all character processing at input */ + superbin(1); /* Turn off ^C (among others). Keep your fingers crossed!! */ +#endif + do { + cup(23,1); kbdc = inchar(); + cup(23,1); el(0); + if (kbdc < 32) printf(" %s", ckeytab[kbdc].csymbol); + else { + sprintf(kbds, "%c", kbdc); + chrprint(kbds); + printf("%s", " -- not a CTRL key"); + } + if (kbdc < 32) ckeytab[kbdc].ccount++; + if (ckeytab[kbdc].ccount == 2) { + cup(1 + (kbdc % 16), 1 + 40 * (kbdc / 16)); + printf("%s", ckeytab[kbdc].csymbol); + } + } while (kbdc != '\177'); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag |= (IGNBRK|BRKINT|ICRNL|IXON); + termioNew.c_lflag |= (ICANON|ECHO|ISIG); + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags &= ~RAW; + sgttyNew.sg_flags |= ECHO; + stty(0, &sgttyNew); +# ifdef SIII + sgttyNew.sg_flags |= CBREAK; + stty(0, &sgttyNew); +# endif +# endif +#endif + ttybin(0); +#ifdef SARG20 + superbin(0); /* Puuuh! We made it!? */ + page(1); /* Back to normal input processing */ + ttybin(1); /* This must be the mode for DEC20 */ +#endif + cup(24,1); + okflag = 1; + for (i = 0; i < 32; i++) if (ckeytab[i].ccount < 2) okflag = 0; + if (okflag) printf("%s", "OK. "); + else printf("%s", "You have not been able to send all CTRL keys! "); + holdit(); +} + +tst_reports() { + /* Test of: + <ENQ> (AnswerBack Message) + SM RM (Set/Reset Mode) - LineFeed / Newline + DSR (Device Status Report) + DA (Device Attributes) + DECREQTPARM (Request Terminal Parameters) + */ + + int parity, nbits, xspeed, rspeed, clkmul, flags; + int i, reportpos; + char *report, *report2; + static char *attributes[][2] = { + { "\033[?1;0c", "No options (vanilla VT100)" }, + { "\033[?1;1c", "VT100 with STP" }, + { "\033[?1;2c", "VT100 with AVO (could be a VT102)" }, + { "\033[?1;3c", "VT100 with STP and AVO" }, + { "\033[?1;4c", "VT100 with GPO" }, + { "\033[?1;5c", "VT100 with STP and GPO" }, + { "\033[?1;6c", "VT100 with AVO and GPO" }, + { "\033[?1;7c", "VT100 with STP, AVO and GPO" }, + { "\033[?1;11c", "VT100 with PP and AVO" }, + { "\033[?1;15c", "VT100 with PP, GPO and AVO" }, + { "\033[?4;2c", "VT132 with AVO" }, + { "\033[?4;3c", "VT132 with AVO and STP" }, + { "\033[?4;6c", "VT132 with GPO and AVO" }, + { "\033[?4;7c", "VT132 with GPO, AVO, and STP" }, + { "\033[?4;11c", "VT132 with PP and AVO" }, + { "\033[?4;15c", "VT132 with PP, GPO and AVO" }, + { "\033[?7c", "VT131" }, + { "\033[?12;5c", "VT125" }, /* VT125 also has ROM version */ + { "\033[?12;7c", "VT125 with AVO" }, /* number, so this won't work */ + { "\033[?5;0c", "VK100 (GIGI)" }, + { "\033[?5c", "VK100 (GIGI)" }, + { "", "" } + }; + +#ifdef UNIX +# ifdef TERMIO + termioNew.c_lflag &= ~ECHO; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags &= ~ECHO; + stty(0, &sgttyNew); +# endif +#endif + cup(5,1); + println("This is a test of the ANSWERBACK MESSAGE. (To load the A.B.M."); + println("see the TEST KEYBOARD part of this program). Below here, the"); + println("current answerback message in your terminal should be"); + println("displayed. Finish this test with RETURN."); + cup(10,1); + inflush(); + printf("%c", 5); /* ENQ */ + report = instr(); + cup(10,1); + chrprint(report); + cup(12,1); + holdit(); + + ed(2); + cup(1,1); + println("Test of LineFeed/NewLine mode."); + cup(3,1); + sm("20"); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag &= ~ICRNL; + termioNew.c_oflag &= ~ONLCR; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags &= ~CRMOD; + stty(0, &sgttyNew); +# endif +#endif + printf("NewLine mode set. Push the RETURN key: "); + report = instr(); + cup(4,1); + el(0); + chrprint(report); + if (!strcmp(report, "\015\012")) printf(" -- OK"); + else printf(" -- Not expected"); + cup(6,1); + rm("20"); + printf("NewLine mode reset. Push the RETURN key: "); + report = instr(); + cup(7,1); + el(0); + chrprint(report); + if (!strcmp(report, "\015")) printf(" -- OK"); + else printf(" -- Not expected"); + cup(9,1); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_iflag |= ICRNL; + termioNew.c_oflag |= ONLCR; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags |= CRMOD; + stty(0, &sgttyNew); +# endif +#endif + holdit(); + + ed(2); + cup(1,1); + printf("Test of Device Status Report 5 (report terminal status)."); + cup(2,1); + dsr(5); + report = instr(); + cup(2,1); + el(0); + printf("Report is: "); + chrprint(report); + if (!strcmp(report,"\033[0n")) printf(" -- means \"TERMINAL OK\""); + else if (!strcmp(report,"\033[3n")) printf(" -- means \"TERMINAL OK\""); + else printf(" -- Unknown response!"); + + cup(4,1); + println("Test of Device Status Report 6 (report cursor position)."); + cup(5,1); + dsr(6); + report = instr(); + cup(5,1); + el(0); + printf("Report is: "); + chrprint(report); + if (!strcmp(report,"\033[5;1R")) printf(" -- OK"); + else printf(" -- Unknown response!"); + + cup(7,1); + println("Test of Device Attributes report (what are you)"); + cup(8,1); + da(0); + report = instr(); + cup(8,1); + el(0); + printf("Report is: "); + chrprint(report); + for (i = 0; *attributes[i][0] != '\0'; i++) { + if (!strcmp(report,attributes[i][0])) break; + } + if (*attributes[i][0] == '\0') + printf(" -- Unknown response, refer to the manual"); + else { + printf(" -- means %s", attributes[i][1]); + if (i) { + cup(9,1); + println("Legend: STP = Processor Option"); + println(" AVO = Advanced Video Option"); + println(" GPO = Graphics Processor Option"); + println(" PP = Printer Port"); + } + } + + cup(14,1); + println("Test of the \"Request Terminal Parameters\" feature, argument 0."); + cup(15,1); + decreqtparm(0); + report = instr(); + cup(15,1); + el(0); + printf("Report is: "); + chrprint(report); + if (strlen(report) < 16 + || report[0] != '\033' + || report[1] != '[' + || report[2] != '2' + || report[3] != ';') + println(" -- Bad format"); + else { + reportpos = 4; + parity = scanto(report, &reportpos, ';'); + nbits = scanto(report, &reportpos, ';'); + xspeed = scanto(report, &reportpos, ';'); + rspeed = scanto(report, &reportpos, ';'); + clkmul = scanto(report, &reportpos, ';'); + flags = scanto(report, &reportpos, 'x'); + if (parity == 0 || nbits == 0 || clkmul == 0) println(" -- Bad format"); + else println(" -- OK"); + printf( + "This means: Parity %s, %s bits, xmitspeed %s, recvspeed %s.\n", + lookup(paritytable, parity), + lookup(nbitstable, nbits), + lookup(speedtable, xspeed), + lookup(speedtable, rspeed)); + printf("(CLoCk MULtiplier = %d, STP option flags = %d)\n", clkmul, flags); + } + + cup(19,1); + println("Test of the \"Request Terminal Parameters\" feature, argument 1."); + cup(20,1); + decreqtparm(1); /* Does the same as decreqtparm(0), reports "3" */ + report2 = instr(); + cup(20,1); + el(0); + printf("Report is: "); + chrprint(report2); + if (strlen(report2) < 3 + || report2[2] != '3') + println(" -- Bad format"); + else { + report2[2] = '2'; + if (!strcmp(report,report2)) println(" -- OK"); + else println(" -- Bad format"); + } + cup(24,1); + holdit(); +#ifdef UNIX +# ifdef TERMIO + termioNew.c_lflag |= ECHO; + (void) ioctl(0, TCSETAW, &termioNew); +# else + sgttyNew.sg_flags |= ECHO; + stty(0, &sgttyNew); +# endif +#endif +} + +tst_vt52() { + + static struct rtabl { + char *rcode; + char *rmsg; + } resptable[] = { + { "\033/K", " -- OK (means Standard VT52)" }, + { "\033/Z", " -- OK (means VT100 emulating VT52)" }, + { "", " -- Unknown response"} + }; + + int i,j; + char *response; + + rm("?2"); /* Reset ANSI (VT100) mode, Set VT52 mode */ + esc("H"); /* Cursor home */ + esc("J"); /* Erase to end of screen */ + esc("H"); /* Cursor home */ + for (i = 0; i <= 23; i++) { + for (j = 0; j <= 9; j++) + printf("%s", "FooBar "); + println("Bletch"); + } + esc("H"); /* Cursor home */ + esc("J"); /* Erase to end of screen */ + + vt52cup(7,47); + printf("nothing more."); + for (i = 1; i <= 10; i++) printf("THIS SHOULD GO AWAY! "); + for (i = 1; i <= 5; i++) { + vt52cup(1,1); + printf("%s", "Back scroll (this should go away)"); + esc("I"); /* Reverse LineFeed (with backscroll!) */ + } + vt52cup(12,60); + esc("J"); /* Erase to end of screen */ + for (i = 2; i <= 6; i++) { + vt52cup(i,1); + esc("K"); /* Erase to end of line */ + } + + for (i = 2; i <= 23; i++) { + vt52cup(i,70); printf("%s", "**Foobar"); + } + vt52cup(23,10); + for (i = 23; i >= 2; i--) { + printf("%s", "*"); + printf("%c", 8); /* BS */ + esc("I"); /* Reverse LineFeed (LineStarve) */ + } + vt52cup(1,70); + for (i = 70; i >= 10; i--) { + printf("%s", "*"); + esc("D"); esc("D"); /* Cursor Left */ + } + vt52cup(24,10); + for (i = 10; i <= 70; i++) { + printf("%s", "*"); + printf("%c", 8); /* BS */ + esc("C"); /* Cursor Right */ + } + vt52cup(2,11); + for (i = 2; i <= 23; i++) { + printf("%s", "!"); + printf("%c", 8); /* BS */ + esc("B"); /* Cursor Down */ + } + vt52cup(23,69); + for (i = 23; i >= 2; i--) { + printf("%s", "!"); + printf("%c", 8); /* BS */ + esc("A"); /* Cursor Up */ + } + for (i = 2; i <= 23; i++) { + vt52cup(i,71); + esc("K"); /* Erase to end of line */ + } + + vt52cup(10,16); + printf("%s", "The screen should be cleared, and have a centered"); + vt52cup(11,16); + printf("%s", "rectangle of \"*\"s with \"!\"s on the inside to the"); + vt52cup(12,16); + printf("%s", "left and right. Only this, and"); + vt52cup(13,16); + holdit(); + + esc("H"); /* Cursor home */ + esc("J"); /* Erase to end of screen */ + printf("%s", "This is the normal character set:"); + for (j = 0; j <= 1; j++) { + vt52cup(3 + j, 16); + for (i = 0; i <= 47; i++) + printf("%c", 32 + i + 48 * j); + } + vt52cup(6,1); + printf("%s", "This is the special graphics character set:"); + esc("F"); /* Select Special Graphics character set */ + for (j = 0; j <= 1; j++) { + vt52cup(8 + j, 16); + for (i = 0; i <= 47; i++) + printf("%c", 32 + i + 48 * j); + } + esc("G"); /* Select ASCII character set */ + vt52cup(12,1); + holdit(); + + esc("H"); /* Cursor home */ + esc("J"); /* Erase to end of screen */ + println("Test of terminal response to IDENTIFY command"); + esc("Z"); /* Identify */ + response = instr(); + println(""); + printf("Response was"); + esc("<"); /* Enter ANSI mode (VT100 mode) */ + chrprint(response); + for(i = 0; resptable[i].rcode[0] != '\0'; i++) + if (!strcmp(response, resptable[i].rcode)) + break; + printf("%s", resptable[i].rmsg); + println(""); + println(""); + holdit(); +} + +tst_insdel() { + + /* Test of: + SM/RM(4) (= IRM (Insertion/replacement mode)) + ICH (Insert Character) + DCH (Delete character) + IL (Insert line) + DL (Delete line) + */ + + int i, row, col, sw, dblchr, scr132; + + for(scr132 = 0; scr132 <= 1; scr132++) { + if (scr132) { sm("?3"); sw = 132; } + else { rm("?3"); sw = 80; } + ed(2); + cup(1,1); + for (row=1; row<=24; row++) { + cup(row,1); + for (col=1; col<=sw; col++) + printf("%c", 'A'-1+row); + } + cup(4,1); + printf("Screen accordion test (Insert & Delete Line). "); holdit(); + ri(); el(2); + decstbm( 2,23); + sm("?6"); + cup(1,1); + for (row=1; row<=24; row++) { + il(row); + dl(row); + } + rm("?6"); + decstbm( 0, 0); + cup(2,1); + printf( + "Top line: A's, bottom line: X's, this line, nothing more. "); + holdit(); + cup(2,1); ed(0); + cup(1,2); + printf("B"); + cub(1); + sm("4"); + for (col=2; col<=sw-1; col++) + printf("*"); + rm("4"); + cup(4,1); + printf("Test of 'Insert Mode'. The top line should be 'A*** ... ***B'. "); + holdit(); ri(); el(2); + cup(1,2); + dch(sw-2); + cup(4,1); + printf("Test of 'Delete Character'. The top line should be 'AB'. "); + holdit(); + + for(dblchr = 1; dblchr <= 2; dblchr++) { + ed(2); + for (row=1; row<=24; row++) { + cup(row,1); + if (dblchr == 2) decdwl(); + for (col=1; col<=sw/dblchr; col++) + printf("%c", 'A'-1+row); + cup(row,sw/dblchr-row); + dch(row); + } + cup(4,1); + println("The right column should be staggered "); + printf("by one. "); + holdit(); + } + ed(2); + cup(1,1); + println("If your terminal has the ANSI 'Insert Character' function"); + println("(the VT102 does not), then you should see a line like this"); + println(" A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"); + println("below:"); + println(""); + for (i = 'Z'; i >= 'A'; i--) { + printf("%c\010",i); + ich(2); + } + cup(10,1); + holdit(); + + if (sw == 132) rm("?3"); + } +} + +dch(pn) int pn; { brc(pn, 'P'); } /* Delete character */ +ich(pn) int pn; { brc(pn, '@'); } /* Insert character -- not in VT102 */ +dl(pn) int pn; { brc(pn, 'M'); } /* Delete line */ +il(pn) int pn; { brc(pn, 'L'); } /* Insert line */ + +/* Test of some known VT100 bugs and misfeatures */ + +tst_bugs() { + + int i, menuchoice; + + static char *menutable[] = { + "Exit to main menu", + "Bug A: Smooth scroll to jump scroll", + "Bug B: Scrolling region", + "Bug C: Wide to narrow screen", + "Bug D: Narrow to wide screen", + "Bug E: Cursor move from double- to single-wide line", + "Bug F: Column mode escape sequence", + "Wrap around with cursor addressing", + "Erase right half of double width lines", + "Funny scroll regions", + /* Add more here */ + "" + }; + + static char *hmsg[] = { + "Test of known bugs in the DEC VT100 series. The numbering of some of", + "the bugs (A-F) refers to the article 'VT100 MAGIC' by Sami Tabih in", + "the 'Proceedings of the DEC Users Society' at St. Louis, Missouri, May", + "1983. To understand some of the tests, you have to look at the source", + "code or the article. Of course, a good VT100-compatible terminal", + "should not have these bugs (or have some means of disabling them)! If", + "a bug appears, you might want to RESET the terminal before continuing", + "the test. There is a test of the RESET function in the main menu.", + "" }; + + do { + ed(2); cup(1,1); + for (i = 0; *hmsg[i]; i++) println(hmsg[i]); + println(""); + println(" Choose bug test number:"); + menuchoice = menu(menutable); + switch (menuchoice) { + case 1: bug_a(); break; + case 2: bug_b(); break; + case 3: bug_c(); break; + case 4: bug_d(); break; + case 5: bug_e(); break; + case 6: bug_f(); break; + case 7: bug_w(); break; + case 8: bug_l(); break; + case 9: bug_s(); break; + } + } while (menuchoice); +} + +/* Bug A: Smooth scroll to jump scroll */ + +bug_a() { + int i; + + cup (10, 1); + println("This is a test of the VT100 'Scroll while toggle softscroll'"); + println("bug. The cursor may disappear, or move UP the screen, or"); + println("multiple copies of some lines may appear."); + holdit(); + + /* Invoke the bug */ + + esc ("[24H"); /* Simplified cursor movement */ + rm("?4"); for (i = 1; i <= 20; i++) printf("\n"); + sm("?4"); for (i = 1; i <= 10; i++) printf("\n"); + rm("?4"); for (i = 1; i <= 5; i++) printf("\n"); + + /* That should be enough to show the bug. But we'll try another way: */ + sm ("?4"); /* Set soft scroll */ + nel (); /* "NextLine", move down */ + rm ("?4"); /* Reset soft scroll */ + nel (); /* "NextLine", move down */ + for (i = 1; i <= 10; i++) { /* Show the bug */ + printf ("Softscroll bug test, line %d. ", i); + holdit(); + } + println("That should have been enough to show the bug, if present."); + holdit(); +} + +/* Bug B: Scrolling region */ + +bug_b() { + char c; + + decaln(); + cup( 1,1); el(0); + printf("Line 11 should be double-wide, line 12 should be cleared."); + cup( 2,1); el(0); + printf("Then, the letters A-P should be written at the beginning"); + cup( 3,1); el(0); + printf("of lines 12-24, and the empty line and A-E are scrolled away."); + cup( 4,1); el(0); + printf("If the bug is present, some lines are confused, look at K-P."); + cup(11,1); decdwl(); + decstbm(12,24); + cup(12,1); el(0); printf("Here we go... "); holdit(); + cup(12,1); ri(); /* Bug comes here */ + for (c = 'A'; c <= 'P'; c++) printf("%c\n",c); /* Bug shows here */ + holdit(); + decstbm(0,0); /* No scr. region */ +} + +/* Bug C: Wide to narrow screen */ + +bug_c() { + sm("?3"); /* 132 column mode */ + cup(1,81); + rm("?3"); /* 80 column mode */ + cup(12,5); + printf("Except for this line, the screen should be blank. "); + holdit(); +} + +/* Bug D: Narrow to wide screen */ + +bug_d() { + int i; + char result; + /* Make the bug appear */ + do { + cup(14,1); + + /* The original code in the article says + * PRINT ESC$; "[13;1H"; CHR$(10%); + * but I guess a cup(14,1); would do. + * (To output a pure LF might be tricky). + */ + + sm("?3"); /* Make the bug visible */ + cup(1,9); decdwl(); + println("You should see blinking text at the bottom line."); + cup(3,9); decdwl(); + println("Enter 0 to exit, 1 to try to invoke the bug again."); + cup(24,9); decdwl(); sgr("1;5;7"); + printf("If you can see this then the bug did not appear."); sgr(""); + cup(4,9); decdwl(); + result = inchar(); readnl(); + rm("?3"); + } while (result == '1'); + sm("?4"); /* Syrup scroll */ + cup(23,1); + for (i = 1; i <= 5; i++) + println("If the bug is present, this should make things much worse!"); + holdit(); + rm("?4"); /* Jump scroll */ +} + +/* Bug E: Cursor move from double- to single-wide line */ + +bug_e() { + int i; + static char *rend[2] = { "\033[m", "\033[7m" }; + sm("?3"); + cup(1,1); decdwl(); + println("This test should put an 'X' at line 3 column 100."); + for (i = 1; i <= 12; i++) printf("1234567890%s",rend[i & 1]); + cup(1,1); /* The bug appears when we jump from a dobule-wide line */ + cup(3,100); /* to a single-wide line, column > 66. */ + printf("X"); + cup(4, 66); printf("! !"); + cup(5,1); + printf("--------------------------- The 'X' should NOT be above here -"); + printf("---+------------ but above here -----+"); + cup(10,1); decdwl(); holdit(); + rm("?3"); +} + +/* Bug F: Column mode escape sequence */ + +bug_f() { + int i, row, col; + + /* + * VT100 "toggle origin mode, forget rest" bug. If you try to set + * (or clear) parameters and one of them is the "origin mode" + * ("?6") parameter, parameters that appear after the "?6" + * remain unaffected. This is also true on CIT-101 terminals. + */ + sm ("?5"); /* Set reverse mode */ + sm ("?3"); /* Set 132 column mode */ + println("Test VT100 'Toggle origin mode, forget rest' bug, part 1."); + println("The screen should be in reverse, 132 column mode."); + holdit(); + ed (2); + rm ("?6;5;3"); /* Reset (origin, reverse, 132 col) */ + println("Test VT100 'Toggle origin mode, forget rest' bug, part 2.\n"); + println("The screen should be in non-reverse, 80 column mode."); + holdit(); +} + + /* Bug W: + * The dreaded "wraparound" bug! You CUP to col 80, write a char, + * CUP to another line in col 80, write a char. And the brain-damaged + * terminal thinks that "Hokay, so he's written a char in col 80, so + * I stay in col 80 and wait for next character. Let's see now, here + * comes another character, and I'm still in col 80, so I must make + * a NewLine first." -- It doesn't clear that "still in col 80" flag + * on a CUP. Argh! + */ + +bug_w() { + int row, col; + + cup (16,1); + println(" This illustrates the \"wrap around bug\" which exists on a"); + println(" standard VT100. At the top of the screen there should be"); + println(" a row of +'s, and the rightmost column should be filled"); + println(" with *'s. But if the bug is present, some of the *'s may"); + println(" be placed in other places, e.g. in the leftmost column,"); + println(" and the top line of +'s may be scrolled away."); + + cup(1,1); + for (col = 1; col <= 79; col++) + printf ("+"); + for (row = 1; row <= 24; row++) { + hvp (row, 80); + printf ("*"); + } + cup(24,1); + holdit(); +} + + /* Bug L: + * Check if the right half of double-width lines comes back + * when a line is first set to single-width, filled with stuff, + * set to double-width, and finally reset to single-width. + * + * A VT100 has this misfeature, and many others. Foo! + */ + +bug_l() { + cup(15, 1); + printf("This-is-a-long-line-This-is-a-long-line-"); + printf("This-is-a-long-line-This-is-a-long-line-"); + cup(1, 1); + printf("This is a test of what happens to the right half of double-width"); + println(" lines."); + printf("A common misfeature is that the right half does not come back"); + println(" when a long"); + printf("single-width line is set to double-width and then reset to"); + println(" single-width."); + + cup(5, 1); + println("Now the line below should contain 80 characters in single width."); + holdit(); + cup(15, 1); decdwl(); + cup(8, 1); + println("Now the line below should contain 40 characters in double width."); + holdit(); + cup(15, 1); decswl(); + cup(11, 1); + println("Now the line below should contain 80 characters in single width."); + holdit(); + + /* ...and in 132 column mode */ + + sm("?3"); + ed(2); + cup(15, 1); + printf("This-is-a-long-line-This-is-a-long-line-"); + printf("This-is-a-long-line-This-is-a-long-line-"); + printf("This-is-a-long-line-This-is-a-long-line-"); + printf("ending-here-"); + + cup(1, 1); + printf("This is the same test in 132 column mode."); + + cup(5, 1); + println("Now the line below should contain 132 characters in single width."); + holdit(); + cup(15, 1); decdwl(); + cup(8, 1); + println("Now the line below should contain 66 characters in double width."); + holdit(); + cup(15, 1); decswl(); + cup(11, 1); + println("Now the line below should contain 132 characters in single width."); + holdit(); + rm("?3"); +} + +bug_s() { + int i; + decstbm(20,10); /* 20-10=-10, < 2, so no scroll region. */ + cup(1,1); + for (i=1; i<=20; i++) + printf("This is 20 lines of text (line %d), no scroll region.\n", i); + holdit(); + ed(2); + decstbm(0,1); /* Should be interpreted as decstbm(1,1) = none */ + cup(1,1); + for (i=1; i<=20; i++) + printf("This is 20 lines of text (line %d), no scroll region.\n", i); + holdit(); + decstbm(0,0); /* No scroll region (just in case...) */ +} + +tst_rst() { + + /* + * Test of + * - RIS (Reset to Initial State) + * - DECTST (invoke terminal test) + */ + + cup(10,1); + printf ("The terminal will now be RESET. "); + holdit(); + ris(); +#ifdef UNIX + fflush(stdout); +#endif + zleep(5000); /* Wait 5.0 seconds */ + cup(10,1); + println("The terminal is now RESET. Next, the built-in confidence test"); + printf("%s", "will be invoked. "); + holdit(); + ed(2); + dectst(1); +#ifdef UNIX + fflush(stdout); +#endif + zleep(5000); /* Wait 5.0 seconds */ + cup(10,1); + println("If the built-in confidence test found any errors, a code"); + printf("%s", "is visible above. "); + holdit(); +} + +initterminal(pn) int pn; { + + +#ifdef UNIX +# ifdef TERMIO + if (pn==0) { + fflush(stdout); + (void) ioctl(0, TCGETA, &termioOrg); + (void) ioctl(0, TCGETA, &termioNew); + termioNew.c_lflag &= ~ICANON; + termioNew.c_cc[VMIN] = 1; + termioNew.c_cc[VTIME] = 0; + (void) ioctl(0, TCSETAW, &termioNew); + } + else { + fflush(stdout); + inflush(); + sleep(2); + termioNew.c_lflag = termioOrg.c_lflag & ~ICANON; + termioNew.c_cc[VMIN] = 1; + termioNew.c_cc[VTIME] = 0; + } + (void) ioctl(0, TCSETAW, &termioNew); +# else + if (pn==0) { + fflush(stdout); + gtty(0,&sgttyOrg); + gtty(0,&sgttyNew); + sgttyNew.sg_flags |= CBREAK; + } + else { + fflush(stdout); + inflush(); + sleep(2); + sgttyNew.sg_flags = sgttyOrg.sg_flags | CBREAK; + } + stty(0,&sgttyNew); +# endif +#ifdef SIII + close(2); + open("/dev/tty",O_RDWR|O_NDELAY); +#endif +#endif + +#ifdef SARG10 + /* Set up neccesary TOPS-10 terminal parameters */ + + trmop(02041, `VT100`); /* tty type vt100 */ + trmop(02002, 0); /* tty no tape */ + trmop(02003, 0); /* tty lc */ + trmop(02005, 1); /* tty tab */ + trmop(02010, 1); /* tty no crlf */ + trmop(02020, 0); /* tty no tape */ + trmop(02021, 1); /* tty page */ + trmop(02025, 0); /* tty blanks */ + trmop(02026, 1); /* tty no alt */ + trmop(02040, 1); /* tty defer */ +#endif +#ifdef SARG20 + ttybin(1); /* set line to binary mode */ +#endif + /* Set up my personal prejudices */ + + esc("<"); /* Enter ANSI mode (if in VT52 mode) */ + rm("?1"); /* cursor keys normal */ + rm("?3"); /* 80 col mode */ + rm("?4"); /* Jump scroll */ + rm("?5"); /* Normal screen */ + rm("?6"); /* Absolute origin mode */ + sm("?7"); /* Wrap around on */ + rm("?8"); /* Auto repeat off */ + decstbm(0,0); /* No scroll region */ + sgr("0"); /* Normal character attributes */ + +} + +bye () { + /* Force my personal prejudices upon the poor luser */ + + esc("<"); /* Enter ANSI mode (if in VT52 mode) */ + rm("?1"); /* cursor keys normal */ + rm("?3"); /* 80 col mode */ + rm("?5"); /* Normal screen */ + rm("?6"); /* Absolute origin mode */ + sm("?7"); /* Wrap around on */ + sm("?8"); /* Auto repeat on */ + decstbm(0,0); /* No scroll region */ + sgr("0"); /* Normal character attributes */ + + /* Say goodbye */ + + ed(2); + cup(12,30); + printf("That's all, folks!\n"); + printf("\n\n\n"); + inflush(); +#ifdef SARG20 + ttybin(0); /* reset line to normal mode */ +#endif +#ifdef UNIX +#ifdef TERMIO + (void) ioctl(0, TCSETAW, &termioOrg); +#else + stty(0,&sgttyOrg); +#endif +#endif + exit(0); +} + +#ifdef UNIX +onbrk() { + signal(SIGINT, onbrk); + if (reading) + brkrd = 1; + else + longjmp(intrenv, 1); +} + +onterm() { + signal(SIGTERM, onterm); + longjmp(intrenv, 1); +} +#endif + +holdit() { + inflush(); + printf("Push <RETURN>"); + readnl(); +} + +readnl() { +#ifdef UNIX + char ch; + fflush(stdout); + brkrd = 0; + reading = 1; + do { read(0,&ch,1); } while(ch != '\n' && !brkrd); + if (brkrd) + kill(getpid(), SIGTERM); + reading = 0; +#endif +#ifdef SARG10 + while (getchar() != '\n') + ; +#endif +#ifdef SARG20 + while (getchar() != '\n') + ; +#endif +} + +scanto(str, pos, toc) char *str; int *pos; char toc; { + char c; + int result = 0; + + while (toc != (c = str[(*pos)++])) { + if (isdigit(c)) result = result * 10 + c - '0'; + else break; + } + if (c == toc) return(result); + else return(0); +} + +char *lookup(t, k) struct table t[]; int k; { + + int i; + for (i = 0; t[i].key != -1; i++) { + if (t[i].key == k) return(t[i].msg); + } + return("BAD VALUE"); +} + +menu(table) char *table[]; { + + int i, tablesize, choice; + char c; + char storage[80]; + char *s = storage; + println(""); + tablesize = 0; + for (i = 0; *table[i] != '\0'; i++) { + printf(" %d. %s\n", i, table[i]); + tablesize++; + } + tablesize--; + + printf("\n Enter choice number (0 - %d): ", tablesize); + for(;;) { + inputline(s); + choice = 0; + while (c = *s++) choice = 10 * choice + c - '0'; + if (choice >= 0 && choice <= tablesize) { + ed(2); + return (choice); + } + printf(" Bad choice, try again: "); + } +} + +chrprint (s) char *s; { + + int i; + + printf(" "); + sgr("7"); + printf(" "); + for (i = 0; s[i] != '\0'; i++) { + if (s[i] <= ' ' || s[i] == '\177') + printf("<%d> ", s[i]); + else printf("%c ", s[i]); + } + sgr(""); +} diff --git a/konsole/tests/quote.c b/konsole/tests/quote.c new file mode 100644 index 000000000..61cf2ac4f --- /dev/null +++ b/konsole/tests/quote.c @@ -0,0 +1,50 @@ +// a silly quotation utitility + +#include <stdio.h> +#include <strings.h> + +int skip = 0; +int empty = 1; + +void pchr(int c, int indent) +{ + if (skip) + { + skip = (c != '\n'); + return; + } + switch(c) + { + case '\n': + if (!empty) + printf("\\n\"\n%*s\"",indent,""); + empty = 1; + break; + case '#' : + skip = 1; + break; + case '"' : case '\\': + printf("\\"); + // fallthrough + default: + printf("%c",c); + empty = 0; + break; + } +} + +#define INDENT 2 + +int main(int argc, char* argv[]) +{ int cc; FILE *sysin; + if (argc < 2) { fprintf(stderr,"usage: %s filename\n",argv[0]); return 1; } + sysin = fopen(argv[1],"r"); + if (!sysin) { fprintf(stderr,"cannot open %s\n",argv[1]); perror("reason: "); return 1; } + printf("%*s/* generated by '%s %s' */\n\n",INDENT,"",argv[0],argv[1]); + printf("%*s\"",INDENT,""); + while( (cc = fgetc(sysin)) > 0) + { + pchr(cc,INDENT); + } + printf("\"\n"); +} diff --git a/konsole/tests/ripple.c b/konsole/tests/ripple.c new file mode 100644 index 000000000..7047c7f94 --- /dev/null +++ b/konsole/tests/ripple.c @@ -0,0 +1,29 @@ +/* + Ripple test. + Usage: ripple [ w [ l ] ] + w = screen line width, default 80, must be > 0, max 132. + l = how many lines to display, default 1000, must be > 0. + Author: Frank da Cruz, Columbia University, 1995. +*/ +char *crlf = "\015\012"; +char *p = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]\ +^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH\ +IJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&'()*+,-./012\ +3456789:;<=>?@ABCD"; + +main(argc,argv) int argc; char *argv[]; { + int i, j, w = 80, l = 1000; + + if (argc > 1) /* User-specified width */ + w = atoi(argv[1]); + if (argc > 2) /* User-specified number of lines */ + l = atoi(argv[2]); + if (w < 1 || l < 1 || w > 132) /* Quit upon conversion error */ + exit(1); + + for (j = i = 0; i < l; i++) { /* Ripple loop */ + write(1, p+j, w); + write(1, crlf, 2); + if (++j > 94) j = 0; + } +} diff --git a/konsole/tests/sesstest b/konsole/tests/sesstest new file mode 100755 index 000000000..27127173a --- /dev/null +++ b/konsole/tests/sesstest @@ -0,0 +1,2 @@ +#!/bin/sh +while true; do date; sleep 1; done diff --git a/konsole/tests/titletest.sh b/konsole/tests/titletest.sh new file mode 100755 index 000000000..3c03d8efd --- /dev/null +++ b/konsole/tests/titletest.sh @@ -0,0 +1,5 @@ +#!/bin/sh -- +# +# display [user@host/path] in title + +export PS1="\\[]2;\\u@\\H\\w\\]$ " diff --git a/konsole/tests/utf8.sh b/konsole/tests/utf8.sh new file mode 100755 index 000000000..26d669d3d --- /dev/null +++ b/konsole/tests/utf8.sh @@ -0,0 +1,11 @@ +#!/bin/bash -- +# +# Switch utf-8 mode +# +#------------------------------------------------------------------------- + +case $1 in + on) echo $'\033%G'"UTF-8 on";; + off) echo $'\033%@'"UTF-8 off";; + *) echo "usage: $0 [on|off]";; +esac diff --git a/konsole/tests/vttest.1 b/konsole/tests/vttest.1 new file mode 100644 index 000000000..c4104925d --- /dev/null +++ b/konsole/tests/vttest.1 @@ -0,0 +1,13 @@ +.TH VTTEST 1 "LOCAL" +.SH NAME +vttest \- test VT100-type terminal +.SH SYNOPSIS +.B vttest +.SH DESCRIPTION +.I Vttest +is a program designed to test the functionality of a VT100 terminal +(or emulator thereof). +It tests both display (escape sequence handling) and keyboard. +.PP +The program is menu\-driven and contains full on\-line operating +instructions. |