Advertisement
oxyd76

SO! internal documentation

Dec 18th, 2015
460
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.91 KB | None | 0 0
  1.  
  2. //////// //////// //
  3. // // // //
  4. ////////// // // //
  5. // // //
  6. //////// //////// //
  7.  
  8. (c) 2009, 2010 by Igor V. Krassikov
  9.  
  10.  
  11. Fist, sorry for my English :)
  12.  
  13. So... SO! is inspired by Carsten Wimmer's GO!. It isn't remake, but
  14. in some details SO! is very similar to GO!.
  15.  
  16. Like GO!, SO! is able to show a list of running processes. But this
  17. list can be sorted by names, pid, ppid or time.
  18.  
  19. Like GO!, SO! is able to kill processes. But if DosKillProcess() call is
  20. not enough, and so! (or xf86sup) device driver was loaded, SO! will try use
  21. it for hard kill such process. And SO! can kill whole process tree (I think,
  22. that it is more correct way) - not only specified process, but at first
  23. all its children.
  24.  
  25. Like GO!, SO! is able to kill all instances of a program.
  26.  
  27. Like GO!, SO! is able to check whether a process is running or not
  28.  
  29. Like GO!, SO! is able to switch to other processes
  30.  
  31. Like GO!, SO! is able to query an application's type. Buf SO! return
  32. more info, and can search program file in PATH (or even use running
  33. process info for locating program file).
  34.  
  35. Like GO!, SO! is able to show your machine's uptime since last boot.
  36. But SO! show not only uptime, but boot time also :)
  37.  
  38. Like GO!, SO! is able to show info about your disks and, at least on my
  39. computer, SO! is more accurate, then GO!
  40.  
  41. Unlike GO!, SO! is able to count instances of specified process, and
  42. wait for specified process is [not] exists.
  43.  
  44. Unlike GO!, SO! is able to show Windows list.
  45.  
  46. Unlike GO!, SO! is able to sleep for specified time.
  47.  
  48. Unlike GO!, SO! is able to reboot your computer, and ever to power off.
  49.  
  50. Unlike GO!, SO! is able to remove non-empty directories (strange feature,
  51. heh? :))
  52.  
  53. Unlike GO!, SO! is able to calculate md5 checksum, split lagre files into
  54. small parts.
  55.  
  56. I never used some GO! features, so, I don't implement them. But you can
  57. inform me, if these features are required for you.
  58.  
  59. Usage:
  60. ~~~~~
  61. SO! is easy to use, you can get a detailed help when running it without any
  62. command-line parameters.
  63.  
  64. Output is colored using ANSI, but if you use redirect, color output turn
  65. to BW :)
  66. If the first argument is comma (,), it removed from command line. So, you
  67. can write
  68.  
  69. so, diskinfo
  70.  
  71. to get information about your drives (yet another strange feature :))
  72.  
  73.  
  74. Command line
  75. ~~~~~~~~~~~~
  76. SO command [arguments]
  77.  
  78. command │ arguments │ description
  79. ────────────┼────────────────┼─────────────────────────────────────────────────────
  80. doc │ │ Write so.doc in the current directory and output
  81. │ │ this text to screen
  82. ────────────┼────────────────┼─────────────────────────────────────────────────────
  83. ver │ │ Short info about SO! version
  84. ────────────┼────────────────┼─────────────────────────────────────────────────────
  85. -pl[iptnu] │ [mask] │ Output process list. This list can be sorted by:
  86. │ │ i: PID p: PPID t: CPU time
  87. │ │ n: Name u: unsorted (by delault)
  88. │ │
  89. │ │ If mask is defined, so! will output those processes,
  90. │ │ which names are matches mask (path and extension are
  91. │ │ ignored; used standard pmatch pattern (*,?,[-] wild-
  92. │ │ cards)). The '*' automatically added at the end of
  93. │ │ mask, so, 'so -pl ftp' will find both ftp.exe and
  94. │ │ ftpd.exe
  95. ────────────┼────────────────┼─────────────────────────────────────────────────────
  96. -lpl[iptnu]│ [mask] │ Same as -pl, but module names includes path
  97. ────────────┼────────────────┼─────────────────────────────────────────────────────
  98. proclist │ │ Same as -plu
  99. ────────────┼────────────────┼─────────────────────────────────────────────────────
  100. -wl[f] │ │ Output windows list (without entries which have pid
  101. │ | or hwnd equal to zero)
  102. │ │ If you use -wlf, full windows list (according to
  103. │ │ WinQuerySwitchList call) will be outputed.
  104. ────────────┼────────────────┼─────────────────────────────────────────────────────
  105. winlist │ │ Same as -wl
  106. ────────────┼────────────────┼─────────────────────────────────────────────────────
  107. -j │ process │ Jump to a `process'. Is used to switch to another
  108. │ │ process. On the command line you may specify an .EXE
  109. │ │ name or a PID.
  110. ────────────┼────────────────┼─────────────────────────────────────────────────────
  111. jump │ process │ Same as -j
  112. ────────────┼────────────────┼─────────────────────────────────────────────────────
  113. -nl │ │ Jack Tan's NoList simulation - remove programs from
  114. │ │ both the OS/2 window list and the OS/2 Alt-Esc
  115. │ │ round-robin (see below)
  116. ────────────┼────────────────┼─────────────────────────────────────────────────────
  117. nolist │ │ Same as -nl
  118. ────────────┼────────────────┼─────────────────────────────────────────────────────
  119. -k[t] │ proc [proc[..]]│ This closes a process(es), but only its first
  120. │ │ instance. It can be be specified either by its .EXE
  121. │ │ name or by its PID.
  122. │ │ -kt closes a process with all its descendants.
  123. ────────────┼────────────────┼─────────────────────────────────────────────────────
  124. -ka │ proc [proc[..]]│ This closes all instances of a program which name
  125. │ │ you supplied on the command line.
  126. ────────────┼────────────────┼─────────────────────────────────────────────────────
  127. kill │ proc [proc[..]]│ Same as -k
  128. ────────────┼────────────────┼─────────────────────────────────────────────────────
  129. killall │ proc [proc[..]]│ Same as -ka
  130. ────────────┼────────────────┼─────────────────────────────────────────────────────
  131. -cp │ process │ The -cp command checks whether a specific process
  132. │ │ is running in the system or not. The following
  133. │ │ Errorlevels are returned: 0 - Process is not running.
  134. │ │ 1 - Process is running.
  135. │ │ This feature is useful for batch files to check if
  136. │ │ a program should be started or not.
  137. ────────────┼────────────────┼─────────────────────────────────────────────────────
  138. exist │ process │ Same as -cp
  139. ────────────┼────────────────┼─────────────────────────────────────────────────────
  140. wait │ [~|!]process │ Wait for `process' exists (or, if ~ or ! used, wait
  141. │ │ for NOT exist (check existence every 100ms)
  142. ────────────┼────────────────┼─────────────────────────────────────────────────────
  143. -cnt │ process │ Count instances of `process'. Returned Errorlevel
  144. │ │ is equal to counted value. If count > 255,
  145. │ │ errorlevel 255 is returned.
  146. ────────────┼────────────────┼─────────────────────────────────────────────────────
  147. count │ process │ Same as -cnt
  148. ────────────┼────────────────┼─────────────────────────────────────────────────────
  149. -at │ module │ This shows the info about an application, ie. if it
  150. │ │ is an OS/2 or DOS program etc.
  151. │ │ Supply an module name as argument. If such file is
  152. │ │ absent in a current directory, PATH used for locate
  153. │ │ the program file. If search is unsuccessfull, SO!
  154. │ │ will try use process list to locate module file.
  155. │ │ This feature is useful when you need to find
  156. │ │ the full name of a program file, which running using
  157. │ │ path.
  158. ────────────┼────────────────┼─────────────────────────────────────────────────────
  159. whatis │ module │ Same as -at
  160. ────────────┼────────────────┼─────────────────────────────────────────────────────
  161. -ut │ │ This shows how long your machine is running since
  162. │ │ the last reboot and time of this last reboot.
  163. ────────────┼────────────────┼─────────────────────────────────────────────────────
  164. uptime │ │ Same as -ut
  165. ────────────┼────────────────┼─────────────────────────────────────────────────────
  166. -df │ │ This shows information about your drives (Drive,
  167. │ │ Label, Location (Local/Remote), FileSystem, Size,
  168. │ │ Free Space, Used Space in %.
  169. ────────────┼────────────────┼─────────────────────────────────────────────────────
  170. diskinfo │ │ Same as -df
  171. ────────────┼────────────────┼─────────────────────────────────────────────────────
  172. reboot │ │ Reboot your computer
  173. ────────────┼────────────────┼─────────────────────────────────────────────────────
  174. shutdown │ │ Sutdown your computer and power off using APM.
  175. │ │ Sorry, not tested feature, may not work on some
  176. │ │ computers!!!
  177. ────────────┼────────────────┼─────────────────────────────────────────────────────
  178. sleep │ ###[s|m|h|d] │ Sleep for ### seconds (minutes, hours, days)
  179. │ date time │ of wait for specified time (see below)
  180. │ │ Multiple time parameters are allowed (e.g.,
  181. │ │ so sleep 1d 2h 3m 15s). You can omit any
  182. │ │ parameter(s), but you must use this order -
  183. │ │ d, h, m, s. So, "3h 12s" is valid value, but
  184. │ │ "12s 3h" isn't.
  185. ────────────┼────────────────┼─────────────────────────────────────────────────────
  186. -rd │ dir [dir[..]] │ Remove directory `dir', even if it is not empty
  187. ────────────┼────────────────┼─────────────────────────────────────────────────────
  188. rmdir │ dir [dir[..]] │ Same as -rd
  189. ────────────┼────────────────┼─────────────────────────────────────────────────────
  190. md5sum │ file [file[..]]│ Calculate md5sum for file(s) in binary mode. Files
  191. │ │ more 2Gbytes are allowed. Wildcards are allowed.
  192. ────────────┼────────────────┼─────────────────────────────────────────────────────
  193. sha1sum │ file [file[..]]│ Calculate sha1sum for file(s) in binary mode. Files
  194. │ │ more 2Gbytes are allowed. Wildcards are allowed.
  195. ────────────┼────────────────┼─────────────────────────────────────────────────────
  196. md5 │ string [..] │ Calculate md5sum for string(s).
  197. ────────────┼────────────────┼─────────────────────────────────────────────────────
  198. sha1 │ string [..] │ Calculate sha1sum for string(s).
  199. ────────────┼────────────────┼─────────────────────────────────────────────────────
  200. split │ file size [dir]│ Split file into dir (current if omited). Size is
  201. │ │ ###[bkmg]. Files more 2G are allowed, max part <2G.
  202. ────────────┼────────────────┼─────────────────────────────────────────────────────
  203. -du[S1[cs]] │ dir │ Get directory `dir' statistics. `S' - do not include
  204. │ │ subdirectories; `1' - first level subdirectories
  205. │ │ info (files count and total size); `c' to order by
  206. │ │ count, `s' to order by size, otherwise - by name.
  207. ────────────┼────────────────┼─────────────────────────────────────────────────────
  208. sys │ │ Write so.sys into current directory. Setup
  209. │ │ procedure is very simple: add string
  210. │ │ DEVICE=DRIVE:\PATH\SO.SYS
  211. │ │ into your config.sys. But if you already use
  212. │ │ xf86sup.sys driver, you may not to install SO!
  213. │ │ driver - SO! is able to use xf86sup.sys also.
  214. ────────────┼────────────────┼─────────────────────────────────────────────────────
  215. check │ │ See below the table
  216. ────────────┼────────────────┼─────────────────────────────────────────────────────
  217. -ip │ │ See below the table
  218. ────────────┼────────────────┼─────────────────────────────────────────────────────
  219. ipinfo │ │ Same as -ip
  220. ────────────┼────────────────┼─────────────────────────────────────────────────────
  221. calc │ │ Simple command-line calculator: see below the table
  222. ────────────┴────────────────┴─────────────────────────────────────────────────────
  223.  
  224. sleep
  225. ~~~~~
  226.  
  227. so sleep date time wait for specified time.
  228.  
  229. Date is grigorian :) date in one of formats: YYYY-MM-DD (ISO), DD.MM.YYYY,
  230. MM/DD/YYYY or YYYYMMDD. You can omit year (assumed current year), or both year and
  231. month (assumed current). You can also omit date completely (in this case in shortcut
  232. mode (see below) time has slightly another meaning). If year is two-digit (e.g. 08),
  233. 2000 added :)
  234.  
  235. Timezones not supported! Use localtime only.
  236.  
  237. Time is in format HH:MM:SS (24h format). You can omit SS or both MM and SS parts.
  238. By default, omitted parts are zeros (12:20 is 12:20:00).
  239.  
  240. shortcut mode
  241. ~~~~~~~~~~~~~
  242.  
  243. There is another (shortcut) mode. In this case what XX:YY or XX means depends on
  244. date availability:
  245.  
  246. value │ means
  247. ──────────┼───────────────────────────────────┼──────────────────────────────────────
  248. │ Date is specified │ Date is absent
  249. ──────────┼───────────────────────────────────┼──────────────────────────────────────
  250. XX:YY:ZZ │ XX hours, YY minutes, ZZ seconds │XX hours, YY minutes, ZZ seconds
  251. ──────────┼───────────────────────────────────┼──────────────────────────────────────
  252. XX:YY │ XX hours, YY minutes, 00 seconds │XX minutes, YY seconds of current hour
  253. ──────────┼───────────────────────────────────┼──────────────────────────────────────
  254. XX │ XX hours, 00 minutes, 00 seconds │XX seconds of current hour and minute
  255.  
  256. If destination time is in past while date is absent, program attempt to add some time
  257. to destination - one minute, if XX specified; one hour, if XX:YY specified, and one day
  258. in case of XX:YY:ZZ. For example, if now is November 8, 2009, 09:34:15:
  259.  
  260. command line │ wait for
  261. ───────────────────┼───────────────────────────────────────────────
  262. so sleep 25 │ 2009-11-08 09:34:25
  263. so sleep 5 │ 2009-11-08 09:35:05
  264. so sleep 33:25 │ 2009-11-08 10:33:25
  265. so sleep 09:33:25 │ 2009-11-09 09:33:25
  266. so sleep 10:33:25 │ 2009-11-08 10:33:25
  267.  
  268. This feature is intend for simplified input if you needs waiting for a little time.
  269.  
  270. You can switch between modes using command
  271.  
  272. so sleep switch
  273.  
  274. Current mode saved in OS2.INI file, so, don't forget to switch in new system :)
  275.  
  276. nolist
  277. ~~~~~~
  278. nolist removes and restores programs in the OS/2 window list and the
  279. Alt-Esc round-robin. OS/2 text (VIO), Presentation Manager, DOS, and
  280. WIN-OS/2 programs are supported. Each program is specified by a unique
  281. identifier (ID). Each ID can be either the mask of the process name
  282. (standard `pmatch' algorithm, allows *, ? and [-] wildcards, case-sensitive)
  283. or the system process ID. Process IDs are assumed to be decimal.
  284. Either '-' or '/' can be used as the switch prefix; supported switches are
  285. (case-insensitive):
  286.  
  287. /A Use both /A:J and /A:V switches
  288. /A:J Add processes to the Alt-Esc round-robin (jumpable)
  289. /A:V Add processes to the window list (visible)
  290. /L List process IDs (same as `so -wl')
  291. /M Apply to each entry if there are multiple matches (default !)
  292. /S Apply to first entry if there are multiple matches
  293. /R Use both /R:J and /R:V switches (default action)
  294. /R:J Remove processes from the Alt-Esc round-robin (nonjumpable)
  295. /R:V Remove processes from the window list (invisible)
  296.  
  297. Full command-line pattern is
  298.  
  299. so -nl opt [opt ... ] ID [ID ...] [opt [opt ... ] ID [ID ...] ...]
  300.  
  301. For example,
  302.  
  303. so -nl -r:j -m Help* -s -a FC* -l
  304.  
  305. means:
  306. remove all programs with first letters of title 'Help' from the Alt-Esc
  307. round-robin, restore first program with first letters of title 'FC' in the
  308. OS/2 window list and the Alt-Esc round-robin, and show resulting windows list.
  309.  
  310. Note: unlike NoList:
  311. - hex ID not supported
  312. - wildcards are supported
  313. - apply to multiple entries id default behaviour.
  314.  
  315. P.S. This feature was added by request of Vadim "Oxyd" Priluzkiy, FidoNet 2:466/466.152
  316.  
  317. check
  318. ~~~~~
  319.  
  320. There is an advanced check feature in SO!. You can use it mainly in batch files
  321. to check whether some (complex) condition is true or false. For example, you can
  322. check free space on disk C: using following code:
  323.  
  324. so check diskfree C: more 500M return 2 otherwise 4
  325.  
  326. This line tell SO!, that it must return errorlevel 2, if free space on drive C: more
  327. than 500 Megabytes, or 4 otherwise.
  328.  
  329. Command line must follow this pattern:
  330.  
  331. so check expression [return okcode [otherwise failcode]]
  332.  
  333. where `okcode' and `failcode' are the errorlevels, which SO! will return if expression
  334. is true (okcode, 1 by default) or false (failcode, 0 by default). If there is an error
  335. (e.g., syntax error) in expression, SO! return errorlevel 255.
  336.  
  337. expression can be:
  338.  
  339. 1. OR'ed other expressions ( expr1 or expr2 ) lowest priority
  340. 2. AND'ed other expressions ( expr1 and expr2 ) highest priority
  341. 3. NOT'ed expression ( not expr )
  342. 4. expression in parenthesis ( (expr) )
  343. 5. Comparing of two values ( val1 comp val2 )
  344. where `comp' can be one of:
  345. less
  346. more (you can use `greater')
  347. equal
  348. not less
  349. not more
  350. not equal
  351. If there is quotes around main expression, you can use natural operators
  352. <, <=, >, >=, <>, = (< and > symbols have special meanings in command lines).
  353.  
  354. 5.1. Value is an integer number or integer value, returned by "functions".
  355. Integer number is any integer with optional suffix (K, M or G), e.g.
  356. 256, 145K (145*1024), 12M (12*1024*1024), 2G (2*1024*1024*1024).
  357. Non-integer values not allowed!
  358.  
  359. 5.2. "Functions" are:
  360. disksize d: returns size of drive d: in bytes; in case of
  361. error (incorrect drive etc) returns 0.
  362. diskfree d: returns free spaxe on drive d: in bytes; in case
  363. of error (incorrect drive etc) returns 0.
  364. filesize file returns size of `file'. If this file not exist,
  365. returns -1!!!
  366. dirsize dir returns total size of all files in directory `dir'
  367. and subdirectories. If directory not exist,
  368. return 0.
  369. proc module count returns count instances of process `module'.
  370. count proc module The same as "proc module count".
  371.  
  372. 5.3. You can use arithmetic operators `add', `sub', `mul', and `div' with
  373. integer values. These operators corresponding to usually +, -, * and /
  374. arithmetic operators with their priorities. All operations are integer
  375. (e.g., 7 div 2 == 3).
  376.  
  377. 6. "Boolean functions"
  378. file filename exist returns true, if file `filename' is exist, false
  379. otherwise
  380. file filename not exist returns true, if file `filename' is not exist,
  381. false otherwise
  382. proc module exist returns true, if process `module' is running,
  383. false otherwise
  384. proc module not exist returns true, if process `module' is not running,
  385. false otherwise
  386.  
  387. All keywords
  388.  
  389. add div filesize no
  390. and equal greater not
  391. count exist less proc
  392. diskfree exists more process
  393. disksize file mul sub
  394.  
  395. are case-sensitive! Please, don't forget this! Also, keywords `not' and `no'
  396. (also `exists' and `exist', `proc' and `process') are absolutely equivalent.
  397.  
  398. If some parameter (such as file name or process name) is equal to some keyword,
  399. you'll get syntax error. The solution is to put such word in brackets (which are
  400. ignored during parse), for example
  401.  
  402. so check file [not] exist
  403.  
  404. checks existence of file "not". You can also use brackets for names, which are not
  405. keywords. Sorry, but spaces not allowed in the names of files and processes...
  406.  
  407. Some examples:
  408.  
  409. If size of disk E: more than twice free space on disk D: return 1, otherwise 0:
  410. so check disksize E: more diskfree D: mul 2
  411.  
  412. If process "make" exist and either size of file "c:\flag1" less than 2K or size
  413. of file "c:\flag2" more than 3K, return 5, otherwise 8:
  414. so check proc [make] exist and (filesize [c:\flag1] less 2K or filesize [c:\flag2] more 3K) return 5 otherwise 8
  415.  
  416. If process "make" has more 20 instances and free space on drive E: less than 10M, return 2,
  417. otherwise return 0:
  418. so check count proc [make] more 20 and diskfree E: less 10M return 2
  419.  
  420. ipinfo
  421. ~~~~~~
  422.  
  423. You can use SO! as small IP-calculator :) to obtain info about ip addresses and netmasks
  424. (it is too exhausting to juggle with bits :-))
  425.  
  426. SO! take IP address and netmask in three forms:
  427.  
  428. so ipinfo ###.###.###.###/## (address, netmask bits)
  429. so ipinfo ###.###.###.### ###.###.###.### (address, netmask)
  430. so ipinfo ###.###.###.### - ###.###.###.### (min - max ip address of subnet)
  431.  
  432. Please, note spaces around dash - in fact, 4 arguments are passed to SO! in this case.
  433. For example, results of calls
  434.  
  435. so ipinfo 194.44.31.225/28
  436. so ipinfo 194.44.31.225 255.255.255.240
  437. so ipinfo 194.44.31.225 - 194.44.31.238
  438.  
  439. will be the same. Notice that if you use last form, SO! evaluate minimal subnet which include
  440. both specified addresses. For example, what is minimal subnet, which include 194.44.31.225
  441. and 194.44.31.228? Command "so ipinfo 194.44.31.225 - 194.44.31.228" returns:
  442.  
  443. IP address 194 . 44 . 31 . 225 / 29 194.44.31.225/29
  444. IP bits 11000010.00101100.00011111.11100001
  445. Mask bytes 255 . 255 . 255 . 248 / 29 255.255.255.248
  446. Mask bits 11111111.11111111.11111111.11111000
  447. Network 194 . 44 . 31 . 224 194.44.31.224
  448. Broadcast 194 . 44 . 31 . 231 194.44.31.231
  449. First host 194 . 44 . 31 . 225 194.44.31.225
  450. Last host 194 . 44 . 31 . 230 194.44.31.230
  451. Total hosts 6
  452.  
  453. calc
  454. ~~~~
  455. You can use SO! as simple command-line calculator: "so calc expression"
  456. SO! evaluate expression and display result.
  457.  
  458. You can use standard arithmetic operations, such as + - * / ** (involution),
  459. and use parenthesis. Raise to power is right-associative (a**b**c == a**(b**c)).
  460.  
  461. List of accessible built-in functions:
  462. sin, cos, tan (or tg), log (or ln), exp, lg (== log10), sqrt.
  463.  
  464. Constants pi and e are also allowed:
  465. so calc sin(pi/2) == 1
  466.  
  467. You can (permanently) change display precision using
  468. so precision ## or so digits ## command. By default ## == 6.
  469.  
  470. If expression is omitted, SO! puts in multiline calculator mode: you can input
  471. single expression per line, and it will be evaluated. You can use variables - any word,
  472. beginning from letter and containing letters and digits, is variable name (of course,
  473. exclude keywords, such as function's name or constant). All variables initially set to 0.0.
  474. To assign value to variable use standard symbol '='. After
  475.  
  476. var = 2 + 4
  477.  
  478. variable 'var' will contain value 6. To list all variables use command 'varlist', to remove
  479. all variables - use 'clean'. To quit from calculator - quit, exit or bye.
  480.  
  481. For example, small calc session:
  482.  
  483. user input output
  484. ----------------------------------------
  485. so calc
  486. 2+sin(pi/2)
  487. Result is: 3
  488. b = c = cos(e)
  489. Result is: -0.911734
  490. varlist
  491. b = -0.911734
  492. c = -0.911734
  493. precision 12
  494. New digits: 12
  495. varlist
  496. b = -0.911733914787
  497. c = -0.911733914787
  498. clean
  499. d = sqrt(3*3+4*4)
  500. Result is: 5
  501. varlist
  502. d = 5
  503. quit
  504.  
  505.  
  506.  
  507.  
  508.  
  509. SO.SYS API:
  510. ~~~~~~~~~~
  511.  
  512. Device name: /DEV/SO!$
  513. When device is opened, you can use DosDevIOCtl call:
  514.  
  515. Category: 160
  516. Function: 160
  517. Param: PID of the process being killed (USHORT)
  518. Return: Error code (USHORT)
  519.  
  520. Category: 160
  521. Function: 161
  522. Param: No param
  523. Return: USHORT driver version: lsb - minor version, msb - major version.
  524.  
  525.  
  526. Like GO!:
  527.  
  528. Legal Disclaimer:
  529. ~~~~~~~~~~~~~~~~
  530. Permission is granted to any individual or institution to use, copy, or
  531. redistribute this executable as long as it is not modified and that it
  532. is not sold for profit.
  533.  
  534. SO! and its associated utilities are provided AS IS and come with no
  535. warranty of any kind, either expressed or implied. In no event will
  536. the copyright holder be liable for any damages resulting from the use
  537. of this software.
  538.  
  539. Registration:
  540. ~~~~~~~~~~~~
  541. SO! is neither Freeware nor Shareware. It's Cardware. If you use SO!
  542. on a regular basis and like it, you have to send a picture postcard
  543. from your location to the author. His snail mail address is shown below.
  544.  
  545. Any help in documentation writing and correcting mistakes in English
  546. kindly accepted!
  547.  
  548. Final Note:
  549. ~~~~~~~~~~
  550. If you want to contact me, write to kiyanyn@gmail.com
  551.  
  552. Comments, Bug-Reports and Feature-Requests are welcome. Flames are not.
  553.  
  554. Send any nice picture postcards to:
  555.  
  556. Igor V. Krassikov
  557. IPMS, dep.44
  558. Krzhyzhanovsky str., 3
  559. 03142 Kiev
  560. Ukraine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement