comparison discussion.roff @ 173:4c7db172fb59

Various corrections and improvements.
author markus schnalke <meillo@marmaro.de>
date Tue, 10 Jul 2012 17:26:05 +0200
parents 346ff7e201f5
children 3d7db5c7965d
comparison
equal deleted inserted replaced
172:6800d594b2b7 173:4c7db172fb59
19 MH once provided anything necessary for email handling. 19 MH once provided anything necessary for email handling.
20 The community around nmh has the similar understanding that nmh should 20 The community around nmh has the similar understanding that nmh should
21 provide a complete email system. 21 provide a complete email system.
22 In fundamental contrast, mmh shall be a MUA only. 22 In fundamental contrast, mmh shall be a MUA only.
23 I believe that the development of all-in-one mail systems is obsolete. 23 I believe that the development of all-in-one mail systems is obsolete.
24 Today, email is too complex to be fully covered by single projects. 24 Today, email is too complex to be fully covered by a single project.
25 Such a project won't be able to excel in all aspects. 25 Such a project will not be able to excel in all aspects.
26 Instead, the aspects of email should be covered by multiple projects, 26 Instead, the aspects of email should be covered by multiple projects,
27 which then can be combined to form a complete system. 27 which then can be combined to form a complete system.
28 Excellent implementations for the various aspects of email already exist. 28 Excellent implementations for the various aspects of email already exist.
29 Just to name three examples: Postfix is a specialized MTA, 29 Just to name three examples: Postfix is a specialized MTA,
30 .\" XXX homepages verlinken 30 .\" XXX homepages verlinken
41 or modular \(en will never be the best choice in any of the fields. 41 or modular \(en will never be the best choice in any of the fields.
42 Even in providing the best consistent all-in-one system, they are likely 42 Even in providing the best consistent all-in-one system, they are likely
43 to be beaten by projects that focus only on integrating existing mail 43 to be beaten by projects that focus only on integrating existing mail
44 components to create a homogeneous system. 44 components to create a homogeneous system.
45 .P 45 .P
46 The limiting resource in the community development of Free Software 46 The limiting resource in the community development of free software
47 is usually man power. 47 is usually man power.
48 .\" XXX FIXME ref! 48 .\" XXX FIXME ref!
49 If the development power is spread over a large development area, 49 If the development power is spread over a large development area,
50 it becomes even more difficult to compete with the specialists in the 50 it becomes even more difficult to compete with the specialists in the
51 various fields. 51 various fields.
152 The question whether there is sense in having a fall-back pager in all 152 The question whether there is sense in having a fall-back pager in all
153 the command line tools, for the cases when 153 the command line tools, for the cases when
154 .Pn more 154 .Pn more
155 or 155 or
156 .Pn less 156 .Pn less
157 aren't available, appears to be ridiculous. 157 are not available, appears to be ridiculous.
158 Of course, MSAs and MRAs are more complex than text pagers 158 Of course, MSAs and MRAs are more complex than text pagers
159 and not necessarily available but still the concept of orthogonal 159 and not necessarily available but still the concept of orthogonal
160 design holds: ``Write programs that do one thing and do it well.'' 160 design holds: ``Write programs that do one thing and do it well.''
161 .[ 161 .[
162 mcilroy unix phil 162 mcilroy unix phil
272 272
273 273
274 .H2 "Non-MUA Tools 274 .H2 "Non-MUA Tools
275 .P 275 .P
276 One goal of mmh is to remove the tools that are not part of the MUA's task. 276 One goal of mmh is to remove the tools that are not part of the MUA's task.
277 Further more, any tools that don't significantly improve the MUA's job 277 Further more, any tools that do not significantly improve the MUA's job
278 should be removed. 278 should be removed.
279 Loosely related and rarely used tools distract from the lean appearance. 279 Loosely related and rarely used tools distract from the lean appearance.
280 They require maintenance work without adding much to the core task. 280 They require maintenance work without adding much to the core task.
281 By removing these tools, the project shall become more streamlined 281 By removing these tools, the project shall become more streamlined
282 and focused. 282 and focused.
351 .Pn msh 351 .Pn msh
352 was removed 352 was removed
353 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02 353 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02
354 because the tool was in conflict with the philosophy of MH. 354 because the tool was in conflict with the philosophy of MH.
355 It provided an interactive shell to access the features of MH, 355 It provided an interactive shell to access the features of MH,
356 but it wasn't just a shell tailored to the needs of mail handling. 356 but it was not just a shell tailored to the needs of mail handling.
357 Instead, it was one large program that had several MH tools built in. 357 Instead, it was one large program that had several MH tools built in.
358 This conflicts with the major feature of MH of being a tool chest. 358 This conflicts with the major feature of MH of being a tool chest.
359 .Pn msh 's 359 .Pn msh 's
360 main use case had been accessing Bulletin Boards, which have ceased to 360 main use case had been accessing Bulletin Boards, which have ceased to
361 be popular. 361 be popular.
446 had been MH's message display program. 446 had been MH's message display program.
447 .Pn show 447 .Pn show
448 mapped message numbers and sequences to files and invoked 448 mapped message numbers and sequences to files and invoked
449 .Pn mhl 449 .Pn mhl
450 to have the files formatted. 450 to have the files formatted.
451 With MIME, this approach wasn't sufficient anymore. 451 With MIME, this approach was not sufficient anymore.
452 MIME messages can consist of multiple parts. Some parts are not 452 MIME messages can consist of multiple parts. Some parts are not
453 directly displayable and text content might be encoded in 453 directly displayable and text content might be encoded in
454 foreign charsets. 454 foreign charsets.
455 .Pn show 's 455 .Pn show 's
456 understanding of messages and 456 understanding of messages and
457 .Pn mhl 's 457 .Pn mhl 's
458 display capabilities couldn't cope with the task any longer. 458 display capabilities could not cope with the task any longer.
459 .P 459 .P
460 Instead of extending these tools, additional tools were written from 460 Instead of extending these tools, additional tools were written from
461 scratch and added to the MH tool chest. 461 scratch and added to the MH tool chest.
462 Doing so is encouraged by the tool chest approach. 462 Doing so is encouraged by the tool chest approach.
463 Modular design is a great advantage for extending a system, 463 Modular design is a great advantage for extending a system,
500 or 500 or
501 .Pn mhshow , 501 .Pn mhshow ,
502 whatever was more appropriate. 502 whatever was more appropriate.
503 .P 503 .P
504 Having two similar tools for essentially the same task is redundant. 504 Having two similar tools for essentially the same task is redundant.
505 Usually, 505 Usually, users would not distinguish between
506 users wouldn't distinguish between
507 .Pn show 506 .Pn show
508 and 507 and
509 .Pn mhshow 508 .Pn mhshow
510 in their daily mail reading. 509 in their daily mail reading.
511 Having two separate display programs was therefore mainly unnecessary 510 Having two separate display programs was therefore mainly unnecessary
604 There is the cost of code complexity to be able to customize. 603 There is the cost of code complexity to be able to customize.
605 There is the cost of less tested setups, because there are 604 There is the cost of less tested setups, because there are
606 more possible setups and especially corner cases. 605 more possible setups and especially corner cases.
607 Additionally, there is the cost of choice itself. 606 Additionally, there is the cost of choice itself.
608 The code complexity directly affects the developers. 607 The code complexity directly affects the developers.
609 Less tested code affects both, users and developers. 608 Less tested code affects both users and developers.
610 The problem of choice affects the users, for once by having to choose, 609 The problem of choice affects the users, for once by having to choose,
611 but also by more complex interfaces that require more documentation. 610 but also by more complex interfaces that require more documentation.
612 Whenever options add few advantages but increase the complexity of the 611 Whenever options add few advantages but increase the complexity of the
613 system, they should be considered for removal. 612 system, they should be considered for removal.
614 I have reduced the number of project-specific configure options from 613 I have reduced the number of project-specific configure options from
666 665
667 .U3 "Backup Prefix 666 .U3 "Backup Prefix
668 .P 667 .P
669 The backup prefix is the string that was prepended to message 668 The backup prefix is the string that was prepended to message
670 filenames to tag them as deleted. 669 filenames to tag them as deleted.
671 By default it had been the comma character `\f(CW,\fP'. 670 By default it had been the comma character (`\fL,\fP').
672 .\" XXX Zeitlich ordnen 671 .\" XXX Zeitlich ordnen
673 In July 2000, Kimmo Suominen introduced 672 In July 2000, Kimmo Suominen introduced
674 the configure option 673 the configure option
675 .Sw --with-hash-backup 674 .Sw --with-hash-backup
676 to change the default to the hash symbol `\f(CW#\fP'. 675 to change the default to the hash character `\f(CW#\fP'.
677 The choice was probably personal preference, because first, the 676 The choice was probably personal preference, because first, the
678 option was named 677 option was named
679 .Sw --with-backup-prefix. 678 .Sw --with-backup-prefix.
680 and had the prefix symbol as argument. 679 and had the prefix character as argument.
681 But giving the hash symbol as argument caused too many problems 680 But giving the hash character as argument caused too many problems
682 for Autoconf, 681 for Autoconf,
683 thus the option was limited to use the hash symbol as the default prefix. 682 thus the option was limited to use the hash character as the default prefix.
684 This supports the assumption, that the choice for the hash was 683 This supports the assumption, that the choice for the hash was
685 personal preference only. 684 personal preference only.
686 Being related or not, words that start with the hash symbol 685 Being related or not, words that start with the hash character
687 introduce a comment in the Unix shell. 686 introduce a comment in the Unix shell.
688 Thus, the command line 687 Thus, the command line
689 .Cl "rm #13 #15 688 .Cl "rm #13 #15
690 calls 689 calls
691 .Pn rm 690 .Pn rm
692 without arguments because the first hash symbol starts the comment 691 without arguments because the first hash character starts the comment
693 that reaches until the end of the line. 692 that reaches until the end of the line.
694 To delete the backup files, 693 To delete the backup files,
695 .Cl "rm ./#13 ./#15" 694 .Cl "rm ./#13 ./#15"
696 needs to be used. 695 needs to be used.
697 Using the hash as backup prefix can be seen as a precaution against 696 Using the hash as backup prefix can be seen as a precaution against
931 .I "plussed user 930 .I "plussed user
932 processing of sendmail. 931 processing of sendmail.
933 The decision to remove this username_extension masquerading was 932 The decision to remove this username_extension masquerading was
934 motivated by the fact that 933 motivated by the fact that
935 .Pn spost 934 .Pn spost
936 hadn't supported it already. 935 had not supported it already.
937 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9 936 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9
938 Username extensions are possible in mmh, but less convenient to use. 937 Username extensions are possible in mmh, but less convenient to use.
939 .\" XXX covered by next paragraph 938 .\" XXX covered by next paragraph
940 .\" XXX format file %(getenv USERNAME_EXTENSION) 939 .\" XXX format file %(getenv USERNAME_EXTENSION)
941 .P 940 .P
1832 .Cl "comp -editor prompter" , 1831 .Cl "comp -editor prompter" ,
1833 the resulting behavior is similar to 1832 the resulting behavior is similar to
1834 .Pn mailx . 1833 .Pn mailx .
1835 Apparently, 1834 Apparently,
1836 .Pn prompter 1835 .Pn prompter
1837 hadn't been touched lately. 1836 had not been touched lately.
1838 Otherwise it's hardly explainable why it 1837 Otherwise it's hardly explainable why it
1839 still offered the switches 1838 still offered the switches
1840 .Sw -erase 1839 .Sw -erase
1841 .Ar chr 1840 .Ar chr
1842 and 1841 and
1900 The perception of the topic described in the RFCs is clearly visible 1899 The perception of the topic described in the RFCs is clearly visible
1901 in MH's implementation. 1900 in MH's implementation.
1902 .\" XXX rewrite ``no idea''. 1901 .\" XXX rewrite ``no idea''.
1903 As a result, 1902 As a result,
1904 MH had all the MIME features but no idea of attachments. 1903 MH had all the MIME features but no idea of attachments.
1905 But users don't need all the MIME features, 1904 But users do not need all the MIME features,
1906 they want convenient attachment handling. 1905 they want convenient attachment handling.
1907 1906
1908 1907
1909 .U3 "Composing MIME Messages 1908 .U3 "Composing MIME Messages
1910 .P 1909 .P
1973 attachment headers. 1972 attachment headers.
1974 If the MIMEification fails, for instance because the file to attach 1973 If the MIMEification fails, for instance because the file to attach
1975 is not accessible, the original draft is not changed. 1974 is not accessible, the original draft is not changed.
1976 .P 1975 .P
1977 The attachment system handles the forwarding of messages, too. 1976 The attachment system handles the forwarding of messages, too.
1978 If the attachment header value starts with a plus character (`+'), 1977 If the attachment header value starts with a plus character (`\fL+\fP'),
1979 like in 1978 like in
1980 .Cl "Attach: +bob 30 42" , 1979 .Cl "Attach: +bob 30 42" ,
1981 the given messages in the specified folder will be attached. 1980 the given messages in the specified folder will be attached.
1982 This allowed to simplify 1981 This allowed to simplify
1983 .Pn forw . 1982 .Pn forw .
2012 Mmh's current solution is even more elaborate. 2011 Mmh's current solution is even more elaborate.
2013 Any necessary MIMEification is done automatically. 2012 Any necessary MIMEification is done automatically.
2014 There is no `mime' command at the WhatNow prompt anymore. 2013 There is no `mime' command at the WhatNow prompt anymore.
2015 The draft will be converted automatically to MIME when either an 2014 The draft will be converted automatically to MIME when either an
2016 attachment header or non-ASCII text is present. 2015 attachment header or non-ASCII text is present.
2017 Furthermore, the hash character (`#') is not special any more 2016 Furthermore, the hash character (`\fL#\fP') is not special any more
2018 at line beginnings in the draft message. 2017 at line beginnings in the draft message.
2019 .\" XXX REF ? 2018 .\" XXX REF ?
2020 Users need not concern themselves with the whole topic at all. 2019 Users need not concern themselves with the whole topic at all.
2021 .P 2020 .P
2022 Although the new approach does not anymore support arbitrary MIME 2021 Although the new approach does not anymore support arbitrary MIME
2331 2330
2332 .ig 2331 .ig
2333 2332
2334 .P 2333 .P
2335 mhshow/mhstore: Removed support for retrieving message/external-body parts. 2334 mhshow/mhstore: Removed support for retrieving message/external-body parts.
2336 These tools won't download the contents automatically anymore. Instead, 2335 These tools will not download the contents automatically anymore. Instead,
2337 they print the information needed to get the contents. If someone should 2336 they print the information needed to get the contents. If someone should
2338 really receive one of those rare message/external-body messages, he can 2337 really receive one of those rare message/external-body messages, he can
2339 do the job manually. We save nearly a thousand lines of code. That's worth 2338 do the job manually. We save nearly a thousand lines of code. That's worth
2340 it! 2339 it!
2341 (The profile entry `nmh-access-ftp' and sbr/ruserpass.c for reading 2340 (The profile entry `nmh-access-ftp' and sbr/ruserpass.c for reading
2578 .U3 "Trash Folder 2577 .U3 "Trash Folder
2579 .Id trash-folder 2578 .Id trash-folder
2580 .P 2579 .P
2581 Similar to the situation for drafts is the situation for removed messages. 2580 Similar to the situation for drafts is the situation for removed messages.
2582 Historically, a message was ``deleted'' by prepending a specific 2581 Historically, a message was ``deleted'' by prepending a specific
2583 \fIbackup prefix\fP, usually the comma character, to the file name. 2582 \fIbackup prefix\fP, usually the comma character,
2583 to the file name.
2584 The specific file would then be ignored by MH because only files with 2584 The specific file would then be ignored by MH because only files with
2585 names consisting of digits only are treated as messages. 2585 names consisting of digits only are treated as messages.
2586 Although files remained in the file system, 2586 Although files remained in the file system,
2587 the messages were no longer visible in MH. 2587 the messages were no longer visible in MH.
2588 To truly delete them, a maintenance job was needed. 2588 To truly delete them, a maintenance job was needed.
2762 just to allow them use MH in a convenient and modern way? 2762 just to allow them use MH in a convenient and modern way?
2763 Unless they are strongly convinced of the concepts, they will fail. 2763 Unless they are strongly convinced of the concepts, they will fail.
2764 I have seen friends of me giving up disappointed 2764 I have seen friends of me giving up disappointed
2765 before they truly used the system, 2765 before they truly used the system,
2766 although they had been motivated in the beginning. 2766 although they had been motivated in the beginning.
2767 They suffer hard enough to get used to the toolchest approach, 2767 They suffer hard enough to get used to the tool chest approach,
2768 we should spare them further inconveniences. 2768 we should spare them further inconveniences.
2769 .P 2769 .P
2770 Maintaining compatibility for its own sake is bad, 2770 Maintaining compatibility for its own sake is bad,
2771 because the code base collects more and more compatibility code. 2771 because the code base collects more and more compatibility code.
2772 Sticking to the compatiblity code means remaining limited; 2772 Sticking to the compatiblity code means remaining limited;
3113 Having identified the problem, I solved it by putting structure into 3113 Having identified the problem, I solved it by putting structure into
3114 .Pn anno 3114 .Pn anno
3115 and its documentation. 3115 and its documentation.
3116 .Ci d54c8db8bdf01e8381890f7729bc0ef4a055ea11 3116 .Ci d54c8db8bdf01e8381890f7729bc0ef4a055ea11
3117 .P 3117 .P
3118 The difference is visible in both, the code and the documentation. 3118 The difference is visible in both the code and the documentation.
3119 The following code excerpt: 3119 The following code excerpt:
3120 .VS 3120 .VS
3121 int delete = -2; /* delete header element if set */ 3121 int delete = -2; /* delete header element if set */
3122 int list = 0; /* list header elements if set */ 3122 int list = 0; /* list header elements if set */
3123 [...] 3123 [...]
3207 The second parameter of 3207 The second parameter of
3208 .Fu path() 3208 .Fu path()
3209 defines the type of path given as first parameter. 3209 defines the type of path given as first parameter.
3210 Directory paths are converted to absolute directory paths. 3210 Directory paths are converted to absolute directory paths.
3211 Folder paths are converted to absolute folder paths. 3211 Folder paths are converted to absolute folder paths.
3212 Folder paths must not include a leading `@' character. 3212 Folder paths must not include a leading `\fL@\fP' character.
3213 Leading plus characters are preserved. 3213 Leading plus characters are preserved.
3214 The result is a pointer to newly allocated memory. 3214 The result is a pointer to newly allocated memory.
3215 .LI 2 3215 .LI 2
3216 .Fu pluspath() 3216 .Fu pluspath()
3217 is a convenience-wrapper to 3217 is a convenience-wrapper to
3220 This function can not be used for directory paths. 3220 This function can not be used for directory paths.
3221 An empty string parameter causes a buffer overflow. 3221 An empty string parameter causes a buffer overflow.
3222 .LI 3 3222 .LI 3
3223 .Fu m_mailpath() 3223 .Fu m_mailpath()
3224 converts directory paths to absolute directory paths. 3224 converts directory paths to absolute directory paths.
3225 The characters `+' or `@' at the beginning of the path name are 3225 The characters `\fL+\fP' or `\fL@\fP' at the beginning of the path name are
3226 treated literal, i.e. as the first character of a relative directory path. 3226 treated literal, i.e. as the first character of a relative directory path.
3227 Hence, this function can not be used for folder paths. 3227 Hence, this function can not be used for folder paths.
3228 In any case, the result is an absolute directory path. 3228 In any case, the result is an absolute directory path.
3229 The result is a pointer to newly allocated memory. 3229 The result is a pointer to newly allocated memory.
3230 .LI 4 3230 .LI 4
3231 .Fu m_maildir() 3231 .Fu m_maildir()
3232 returns the parameter unchanged if it is an absolute directory path 3232 returns the parameter unchanged if it is an absolute directory path
3233 or begins with the entry `.' or `..'. 3233 or begins with the entry `\fL.\fP' or `\fL..\fP'.
3234 All other strings are prepended with the current working directory. 3234 All other strings are prepended with the current working directory.
3235 Hence, this functions can not be used for folder paths. 3235 Hence, this functions can not be used for folder paths.
3236 The result is either an absolute directory path or a relative 3236 The result is either an absolute directory path or a relative
3237 directory path, starting with a dot. 3237 directory path, starting with a dot.
3238 In contrast to the other functions, the result is a pointer to 3238 In contrast to the other functions, the result is a pointer to
3466 could have set up a well-defined profile and caused all MH tools 3466 could have set up a well-defined profile and caused all MH tools
3467 in the session use it by exporting an environment variable. 3467 in the session use it by exporting an environment variable.
3468 With this approach, no special cases would have been introduced, 3468 With this approach, no special cases would have been introduced,
3469 no surprises would have been caused. 3469 no surprises would have been caused.
3470 By writing a clean-profile-wrapper, the concept could have been 3470 By writing a clean-profile-wrapper, the concept could have been
3471 generalized orthogonally to the whole MH toolchest. 3471 generalized orthogonally to the whole MH tool chest.
3472 Then Rose's motivation behind the decision that 3472 Then Rose's motivation behind the decision that
3473 .Pn post 3473 .Pn post
3474 ignores the profile, as quoted by Jeffrey Honig, 3474 ignores the profile, as quoted by Jeffrey Honig,
3475 .[ 3475 .[
3476 nmh-workers post profile 3476 nmh-workers post profile
3488 Mapping such problems on the concepts of switching between different 3488 Mapping such problems on the concepts of switching between different
3489 profiles, solves them once for all. 3489 profiles, solves them once for all.
3490 .P 3490 .P
3491 In mmh, the wish to have 3491 In mmh, the wish to have
3492 .Pn mhmail 3492 .Pn mhmail
3493 as as replacement for 3493 as a replacement for
3494 .Pn mailx 3494 .Pn mailx
3495 is considered obsolete. 3495 is considered obsolete.
3496 Mmh's 3496 Mmh's
3497 .Pn mhmail 3497 .Pn mhmail
3498 does no longer cover this use-case. 3498 does no longer cover this use-case.
3508 will become an ordinary MH tool, reading the profile. 3508 will become an ordinary MH tool, reading the profile.
3509 If, however, this idea will not convince, then 3509 If, however, this idea will not convince, then
3510 .Pn mhmail 3510 .Pn mhmail
3511 will be removed. 3511 will be removed.
3512 .P 3512 .P
3513 Every program in the mmh toolchest reads the profile. 3513 Every program in the mmh tool chest reads the profile.
3514 The only exception is 3514 The only exception is
3515 .Pn slocal , 3515 .Pn slocal ,
3516 which is not considered part of the mmh toolchest. 3516 which is not considered part of the mmh tool chest.
3517 This MDA is only distributed with mmh, currently. 3517 This MDA is only distributed with mmh, currently.
3518 Mmh has no 3518 Mmh has no
3519 .Pn post 3519 .Pn post
3520 program, but 3520 program, but
3521 .Pn spost , 3521 .Pn spost ,
3565 .Fu snprintf() 3565 .Fu snprintf()
3566 was dropped in March 2012 in favor for using the one of the 3566 was dropped in March 2012 in favor for using the one of the
3567 standard library. 3567 standard library.
3568 .Ci 0052f1024deb0a0a2fc2e5bacf93d45a5a9c9b32 3568 .Ci 0052f1024deb0a0a2fc2e5bacf93d45a5a9c9b32
3569 Such decisions limit the portability of mmh 3569 Such decisions limit the portability of mmh
3570 if systems don't support these standardized and widespread functions. 3570 if systems do not support these standardized and widespread functions.
3571 This compromise is made because mmh focuses on the future. 3571 This compromise is made because mmh focuses on the future.
3572 .P 3572 .P
3573 I am not yet thirty years old and my C and Unix experience comprises 3573 I am not yet thirty years old and my C and Unix experience comprises
3574 only half a dozen years. 3574 only half a dozen years.
3575 Hence, I need to learn about the history in retrospective. 3575 Hence, I need to learn about the history in retrospective.
3761 .Fn profile . 3761 .Fn profile .
3762 The location of the profile is no longer fixed to 3762 The location of the profile is no longer fixed to
3763 .Fn $HOME/.mh_profile 3763 .Fn $HOME/.mh_profile
3764 but to 3764 but to
3765 .Fn $HOME/.mmh/profile . 3765 .Fn $HOME/.mmh/profile .
3766 Having both, the file 3766 Having both the file
3767 .Fn $HOME/.mh_profile 3767 .Fn $HOME/.mh_profile
3768 and the configuration directory 3768 and the configuration directory
3769 .Fn $HOME/.mmh 3769 .Fn $HOME/.mmh
3770 appeared to be inconsistent. 3770 appeared to be inconsistent.
3771 The approach chosen for mmh is consistent, simple, and familiar to 3771 The approach chosen for mmh is consistent, simple, and familiar to
3819 is built from 3819 is built from
3820 .Fn uip/rmm.c . 3820 .Fn uip/rmm.c .
3821 Some source files are used for multiple programs. 3821 Some source files are used for multiple programs.
3822 For example 3822 For example
3823 .Fn uip/scansbr.c 3823 .Fn uip/scansbr.c
3824 is used for both, 3824 is used for both
3825 .Pn scan 3825 .Pn scan
3826 and 3826 and
3827 .Pn inc . 3827 .Pn inc .
3828 In nmh, 49 tools were built from 76 source files. 3828 In nmh, 49 tools were built from 76 source files.
3829 This is a ratio of 1.6 source files per program. 3829 This is a ratio of 1.6 source files per program.
4043 .Pn grep 4043 .Pn grep
4044 would page without 4044 would page without
4045 .Pn more 4045 .Pn more
4046 just because both programs are part of the same code base. 4046 just because both programs are part of the same code base.
4047 .P 4047 .P
4048 The clear separation on the surface \(en the toolchest approach \(en 4048 The clear separation on the surface \(en the tool chest approach \(en
4049 is violated on the level below. 4049 is violated on the level below.
4050 This violation is for the sake of time performance. 4050 This violation is for the sake of time performance.
4051 On systems where 4051 On systems where
4052 .Fu fork() 4052 .Fu fork()
4053 and 4053 and