Annotation of 43BSDTahoe/ucb/pascal/pdx/intro.nroff, revision 1.1

1.1     ! root        1: .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n
        !             2: .if n .po 1.25i
        !             3: .if t .po 1.0i
        !             4: .hy 14
        !             5: .de hd
        !             6: 'sp 3
        !             7: 'if \\n%-1 'tl ''- % -''
        !             8: 'sp 2
        !             9: .if \\n(vq>0 .xj
        !            10: .nr vq 0
        !            11: 'ns
        !            12: ..
        !            13: .de fo
        !            14: .nr vk 0
        !            15: .nr dn 0
        !            16: .nr wf \\n(.pu-\\n(nlu-\\n(vmu-1v
        !            17: .if \\n(vs>0 .if \\n(wf>0 .xn
        !            18: .if \\n(vs>0 .if \\n(wf<=0 .xo
        !            19: .ch fo -\\n(vmu
        !            20: .nr vs 0
        !            21: .nr vo \\n(vmu
        !            22: 'bp
        !            23: ..
        !            24: .de fe
        !            25: .br
        !            26: .di
        !            27: .ev
        !            28: .if \\n(vs=1 .nr dn +1v
        !            29: .nr vo +\\n(dnu
        !            30: .nr dn 0
        !            31: .if \\n(vou>=\\n(.pu-\\n(nlu-.5v .nr vo \\n(.pu-\\n(nlu-.5v
        !            32: .if \\n(vou<\\n(vmu .nr vo \\n(vmu
        !            33: .ch fo -\\n(vou
        !            34: ..
        !            35: .de xj
        !            36: .nr vs 1
        !            37: .nr vn 1
        !            38: .di
        !            39: .ev 1
        !            40: .da zb
        !            41: .ns
        !            42: .za
        !            43: .zc
        !            44: .fe
        !            45: .rm za
        !            46: .rm zc
        !            47: ..
        !            48: .de xn
        !            49: .ev 1
        !            50: 'in 0
        !            51: 'ti 0
        !            52: .ie \\n(vn \l\|6.0i\(ru\|
        !            53: .el \l\|15\(ru\|
        !            54: .nr vn 0
        !            55: .br
        !            56: .ns
        !            57: .zb
        !            58: .br
        !            59: .di
        !            60: .rm zb
        !            61: .nr vq \\n(dnu
        !            62: .nr dn 0
        !            63: .nr vs 0
        !            64: .ev
        !            65: ..
        !            66: .de xo
        !            67: .ev 1
        !            68: .di zc
        !            69: .zb
        !            70: .br
        !            71: .di
        !            72: .rm zb
        !            73: .nr vq \\n(dnu
        !            74: .nr dn 0
        !            75: .nr vs 0
        !            76: .nr vn 1
        !            77: .ev
        !            78: ..
        !            79: .de xp
        !            80: .di za
        !            81: ..
        !            82: .nr vm 6v
        !            83: .nr vo \n(vmu
        !            84: .wh 0 hd
        !            85: .wh -1.0i fo
        !            86: .ch fo 15i
        !            87: .wh -\n(vmu xp
        !            88: .ch fo -\n(vmu
        !            89: .if n .ll 6.5i
        !            90: .if t .ll 6.0i
        !            91: .if n .lt 6.5i
        !            92: .if t .lt 6.0i
        !            93: .ev 1
        !            94: .if n .ll 6.5i
        !            95: .if t .ll 6.0i
        !            96: .if n .lt 6.5i
        !            97: .if t .lt 6.0i
        !            98: .ev
        !            99: .nr ap 1
        !           100: .af ap A
        !           101: .sp 6
        !           102: .ps +2
        !           103: .ce
        !           104: \fBAn Introduction to Pdx\fP
        !           105: .ps -2
        !           106: .sp 1
        !           107: .ce
        !           108: \fIMark Linton\fR
        !           109: .sp 1
        !           110: .ce
        !           111: September 27, 1981
        !           112: .sp 1
        !           113: .br
        !           114: .nr wg 2v
        !           115: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           116: .el .nr vh 0
        !           117: .if \n(wg>0 \{\
        !           118: .sp \n(wgu
        !           119: .nr vh +\n(wgu \}
        !           120: .nr vk \n(.h
        !           121: .ne 6
        !           122: \fBIntroduction\fP
        !           123: .br
        !           124: .nr wg 1v
        !           125: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           126: .el .nr vh 0
        !           127: .if \n(wg>0 \{\
        !           128: .sp \n(wgu
        !           129: .nr vh +\n(wgu \}
        !           130: .nr vk \n(.h
        !           131: .ti +5n
        !           132: \fIPdx\fP is a tool for debugging Pascal programs
        !           133: that are translated by the Berkeley Pascal translator \fIpi\fP
        !           134: [Joy, Graham, and Haley 80].
        !           135: This tutorial introduces \fIpdx\fP and the basic ways that it can be used.
        !           136: For a complete reference, consult the \fIpdx\fP manual page.
        !           137: .br
        !           138: .nr wg 2v
        !           139: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           140: .el .nr vh 0
        !           141: .if \n(wg>0 \{\
        !           142: .sp \n(wgu
        !           143: .nr vh +\n(wgu \}
        !           144: .nr vk \n(.h
        !           145: .ne 6
        !           146: \fBGetting Started\fP
        !           147: .br
        !           148: .nr wg 1v
        !           149: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           150: .el .nr vh 0
        !           151: .if \n(wg>0 \{\
        !           152: .sp \n(wgu
        !           153: .nr vh +\n(wgu \}
        !           154: .nr vk \n(.h
        !           155: .ti +5n
        !           156: Suppose the program we are working on is in a file called ``prog.p''.
        !           157: Before using \fIpdx\fP, we must translate it with \fIpi\fP.
        !           158: \fIPdx\fP cannot be used if \fIpi\fP reports any errors during translation.
        !           159: To enter \fIpdx\fP, we type the following: (in examples,
        !           160: the user types is in boldface, what \fIpdx\fP prints
        !           161: is in normal type).
        !           162: .br
        !           163: .nr wg 1v
        !           164: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           165: .el .nr vh 0
        !           166: .if \n(wg>0 \{\
        !           167: .sp \n(wgu
        !           168: .nr vh +\n(wgu \}
        !           169: .nr vk \n(.h
        !           170: .in +8n
        !           171: .nf
        !           172: .ne 5
        !           173: % \fBpdx\fP
        !           174: >
        !           175: .br
        !           176: .nr wg 1v
        !           177: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           178: .el .nr vh 0
        !           179: .if \n(wg>0 \{\
        !           180: .sp \n(wgu
        !           181: .nr vh +\n(wgu \}
        !           182: .nr vk \n(.h
        !           183: .in -8n
        !           184: .fi
        !           185: The ``>'' is a prompt from \fIpdx\fP.
        !           186: Like the shell or editor, \fIpdx\fP prints the prompt when it
        !           187: is waiting for a command.
        !           188: .br
        !           189: .nr wg 2v
        !           190: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           191: .el .nr vh 0
        !           192: .if \n(wg>0 \{\
        !           193: .sp \n(wgu
        !           194: .nr vh +\n(wgu \}
        !           195: .nr vk \n(.h
        !           196: .ne 6
        !           197: \fBRunning the Program\fP
        !           198: .br
        !           199: .nr wg 1v
        !           200: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           201: .el .nr vh 0
        !           202: .if \n(wg>0 \{\
        !           203: .sp \n(wgu
        !           204: .nr vh +\n(wgu \}
        !           205: .nr vk \n(.h
        !           206: .ti +5n
        !           207: Once in \fIpdx\fP, we can begin executing our program
        !           208: by typing the command ``run''.
        !           209: Programs don't usually work the first time;
        !           210: with one of two things happening:
        !           211: .if n .nr In 5
        !           212: .if t .nr In 8
        !           213: .in +\n(Inn
        !           214: .br
        !           215: .nr wg 1v
        !           216: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           217: .el .nr vh 0
        !           218: .if \n(wg>0 \{\
        !           219: .sp \n(wgu
        !           220: .nr vh +\n(wgu \}
        !           221: .nr vk \n(.h
        !           222: .ti -5n
        !           223: \h'1n'1.\h'2n'\c
        !           224: The program tries to do something that isn't
        !           225: allowed in Pascal, such as dividing by 0.
        !           226: .br
        !           227: .nr wg 1v
        !           228: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           229: .el .nr vh 0
        !           230: .if \n(wg>0 \{\
        !           231: .sp \n(wgu
        !           232: .nr vh +\n(wgu \}
        !           233: .nr vk \n(.h
        !           234: .ti -5n
        !           235: \h'1n'2.\h'2n'\c
        !           236: The program runs but produces incorrect results.
        !           237: .in -\n(Inn
        !           238: .br
        !           239: .nr wg 1v
        !           240: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           241: .el .nr vh 0
        !           242: .if \n(wg>0 \{\
        !           243: .sp \n(wgu
        !           244: .nr vh +\n(wgu \}
        !           245: .nr vk \n(.h
        !           246: Let's consider the first case.
        !           247: Suppose ``prog.p'' contains the declarations
        !           248: .br
        !           249: .nr wg 1v
        !           250: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           251: .el .nr vh 0
        !           252: .if \n(wg>0 \{\
        !           253: .sp \n(wgu
        !           254: .nr vh +\n(wgu \}
        !           255: .nr vk \n(.h
        !           256: .in +8n
        !           257: .nf
        !           258: .ne 5
        !           259: var
        !           260:        sum, count : integer;
        !           261:        avg : real;
        !           262: .br
        !           263: .nr wg 1v
        !           264: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           265: .el .nr vh 0
        !           266: .if \n(wg>0 \{\
        !           267: .sp \n(wgu
        !           268: .nr vh +\n(wgu \}
        !           269: .nr vk \n(.h
        !           270: .in -8n
        !           271: .fi
        !           272: and the statement
        !           273: .br
        !           274: .nr wg 1v
        !           275: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           276: .el .nr vh 0
        !           277: .if \n(wg>0 \{\
        !           278: .sp \n(wgu
        !           279: .nr vh +\n(wgu \}
        !           280: .nr vk \n(.h
        !           281: .in +8n
        !           282: .nf
        !           283: .ne 5
        !           284:        avg := sum / count;
        !           285: .br
        !           286: .nr wg 1v
        !           287: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           288: .el .nr vh 0
        !           289: .if \n(wg>0 \{\
        !           290: .sp \n(wgu
        !           291: .nr vh +\n(wgu \}
        !           292: .nr vk \n(.h
        !           293: .in -8n
        !           294: .fi
        !           295: at line 15.
        !           296: Suppose further that when the program is run
        !           297: ``count'' has the value 0.
        !           298: Running under \fIpdx\fP, the following would be printed:
        !           299: .br
        !           300: .nr wg 1v
        !           301: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           302: .el .nr vh 0
        !           303: .if \n(wg>0 \{\
        !           304: .sp \n(wgu
        !           305: .nr vh +\n(wgu \}
        !           306: .nr vk \n(.h
        !           307: .in +8n
        !           308: .nf
        !           309: .ne 5
        !           310: > \fBrun\fP
        !           311: .sp 1
        !           312: error at line 15:  real divide by zero
        !           313:       15       avg := sum / count;
        !           314: >
        !           315: .br
        !           316: .nr wg 1v
        !           317: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           318: .el .nr vh 0
        !           319: .if \n(wg>0 \{\
        !           320: .sp \n(wgu
        !           321: .nr vh +\n(wgu \}
        !           322: .nr vk \n(.h
        !           323: .in -8n
        !           324: .fi
        !           325: .br
        !           326: .nr wg 2v
        !           327: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           328: .el .nr vh 0
        !           329: .if \n(wg>0 \{\
        !           330: .sp \n(wgu
        !           331: .nr vh +\n(wgu \}
        !           332: .nr vk \n(.h
        !           333: .ne 6
        !           334: \fBPrinting Out Variables\fP
        !           335: .br
        !           336: .nr wg 1v
        !           337: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           338: .el .nr vh 0
        !           339: .if \n(wg>0 \{\
        !           340: .sp \n(wgu
        !           341: .nr vh +\n(wgu \}
        !           342: .nr vk \n(.h
        !           343: .ti +5n
        !           344: When a program stops because of an execution error,
        !           345: \fIpdx\fP prints the error and the line in the program where
        !           346: the error occurred.
        !           347: We can then examine the program's ``state'', that is,
        !           348: print out the values of any variables that might be
        !           349: of interest.
        !           350: In the above example, we might want to know the value
        !           351: of \fIsum\fP, so we say
        !           352: .br
        !           353: .nr wg 1v
        !           354: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           355: .el .nr vh 0
        !           356: .if \n(wg>0 \{\
        !           357: .sp \n(wgu
        !           358: .nr vh +\n(wgu \}
        !           359: .nr vk \n(.h
        !           360: .in +8n
        !           361: .nf
        !           362: .ne 5
        !           363: > \fBprint sum\fP
        !           364: 5
        !           365: >
        !           366: .br
        !           367: .nr wg 1v
        !           368: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           369: .el .nr vh 0
        !           370: .if \n(wg>0 \{\
        !           371: .sp \n(wgu
        !           372: .nr vh +\n(wgu \}
        !           373: .nr vk \n(.h
        !           374: .in -8n
        !           375: .fi
        !           376: The print command can be given any number of Pascal expressions
        !           377: separated by commas.
        !           378: .br
        !           379: .nr wg 1v
        !           380: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           381: .el .nr vh 0
        !           382: .if \n(wg>0 \{\
        !           383: .sp \n(wgu
        !           384: .nr vh +\n(wgu \}
        !           385: .nr vk \n(.h
        !           386: .ne 3
        !           387: .ti +5n
        !           388: We can print the values of all variables by using
        !           389: the ``dump'' command.
        !           390: Continuing our example, we might get
        !           391: .br
        !           392: .nr wg 1v
        !           393: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           394: .el .nr vh 0
        !           395: .if \n(wg>0 \{\
        !           396: .sp \n(wgu
        !           397: .nr vh +\n(wgu \}
        !           398: .nr vk \n(.h
        !           399: .in +8n
        !           400: .nf
        !           401: .ne 5
        !           402: > \fBdump\fP
        !           403: sum = 5
        !           404: count = 0
        !           405: avg = 0.0
        !           406: >
        !           407: .br
        !           408: .nr wg 1v
        !           409: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           410: .el .nr vh 0
        !           411: .if \n(wg>0 \{\
        !           412: .sp \n(wgu
        !           413: .nr vh +\n(wgu \}
        !           414: .nr vk \n(.h
        !           415: .in -8n
        !           416: .fi
        !           417: Frequently there are many variables active
        !           418: so that we want to print the list of a file for perusal.
        !           419: This is done by saying
        !           420: .br
        !           421: .nr wg 1v
        !           422: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           423: .el .nr vh 0
        !           424: .if \n(wg>0 \{\
        !           425: .sp \n(wgu
        !           426: .nr vh +\n(wgu \}
        !           427: .nr vk \n(.h
        !           428: .in +8n
        !           429: .nf
        !           430: .ne 5
        !           431: > \fBdump > out\fP
        !           432: .br
        !           433: .nr wg 1v
        !           434: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           435: .el .nr vh 0
        !           436: .if \n(wg>0 \{\
        !           437: .sp \n(wgu
        !           438: .nr vh +\n(wgu \}
        !           439: .nr vk \n(.h
        !           440: .in -8n
        !           441: .fi
        !           442: where ``out'' is the name of file which does not exist.
        !           443: .br
        !           444: .nr wg 1v
        !           445: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           446: .el .nr vh 0
        !           447: .if \n(wg>0 \{\
        !           448: .sp \n(wgu
        !           449: .nr vh +\n(wgu \}
        !           450: .nr vk \n(.h
        !           451: .ne 3
        !           452: .ti +5n
        !           453: There are two other commands useful for printing information
        !           454: about variables.
        !           455: The command ``whatis'' prints out the declaration of a variable.
        !           456: Using the above example,
        !           457: .br
        !           458: .nr wg 1v
        !           459: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           460: .el .nr vh 0
        !           461: .if \n(wg>0 \{\
        !           462: .sp \n(wgu
        !           463: .nr vh +\n(wgu \}
        !           464: .nr vk \n(.h
        !           465: .in +8n
        !           466: .nf
        !           467: .ne 5
        !           468: > \fBwhatis\fP sum
        !           469: var sum : integer;
        !           470: .br
        !           471: .nr wg 1v
        !           472: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           473: .el .nr vh 0
        !           474: .if \n(wg>0 \{\
        !           475: .sp \n(wgu
        !           476: .nr vh +\n(wgu \}
        !           477: .nr vk \n(.h
        !           478: .in -8n
        !           479: .fi
        !           480: .br
        !           481: .nr wg 1v
        !           482: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           483: .el .nr vh 0
        !           484: .if \n(wg>0 \{\
        !           485: .sp \n(wgu
        !           486: .nr vh +\n(wgu \}
        !           487: .nr vk \n(.h
        !           488: .ne 3
        !           489: .ti +5n
        !           490: It is possible for a program to have the same name given
        !           491: to two or more different variables when they are local to
        !           492: different procedures.
        !           493: \fIPi\fP distinguishes the variables according to which procedure
        !           494: it is looking at;
        !           495: however, when debugging it is possible that both procedures
        !           496: are active (for example, one procedure could call the other).
        !           497: .br
        !           498: .nr wg 1v
        !           499: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           500: .el .nr vh 0
        !           501: .if \n(wg>0 \{\
        !           502: .sp \n(wgu
        !           503: .nr vh +\n(wgu \}
        !           504: .nr vk \n(.h
        !           505: .ne 3
        !           506: .ti +5n
        !           507: \fIPdx\fP normally allows printing of any variable declared within
        !           508: the most recently called procedure or any variables accessible
        !           509: to this procedure.
        !           510: A variable in an active procedure that is not normally accessible
        !           511: can be printed by preceding its name with the procedure it is in
        !           512: and a ``.''.
        !           513: It can sometimes become difficult to remember the variable
        !           514: that a given name is currently associated with.
        !           515: The ``which'' command is useful in resolving this confusion.
        !           516: It prints the variable name along with the procedure that it is contained in.
        !           517: .br
        !           518: .nr wg 1v
        !           519: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           520: .el .nr vh 0
        !           521: .if \n(wg>0 \{\
        !           522: .sp \n(wgu
        !           523: .nr vh +\n(wgu \}
        !           524: .nr vk \n(.h
        !           525: .ne 3
        !           526: .ti +5n
        !           527: Usually we want to know not only what the values of variables
        !           528: are, but how the program got to where it is.
        !           529: The ``where'' command lists the procedures that were called
        !           530: for the program to reach its current point.
        !           531: It might print, for example,
        !           532: .br
        !           533: .nr wg 1v
        !           534: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           535: .el .nr vh 0
        !           536: .if \n(wg>0 \{\
        !           537: .sp \n(wgu
        !           538: .nr vh +\n(wgu \}
        !           539: .nr vk \n(.h
        !           540: .in +8n
        !           541: .nf
        !           542: .ne 5
        !           543: > \fBwhere\fP
        !           544: LastCalled(parameters), line 15
        !           545: OneBeforeThat(parameters), line 30
        !           546: MainProgram, line 45
        !           547: >
        !           548: .br
        !           549: .nr wg 1v
        !           550: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           551: .el .nr vh 0
        !           552: .if \n(wg>0 \{\
        !           553: .sp \n(wgu
        !           554: .nr vh +\n(wgu \}
        !           555: .nr vk \n(.h
        !           556: .in -8n
        !           557: .fi
        !           558: .br
        !           559: .nr wg 2v
        !           560: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           561: .el .nr vh 0
        !           562: .if \n(wg>0 \{\
        !           563: .sp \n(wgu
        !           564: .nr vh +\n(wgu \}
        !           565: .nr vk \n(.h
        !           566: .ne 6
        !           567: \fBExecution Tracing\fP
        !           568: .br
        !           569: .nr wg 1v
        !           570: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           571: .el .nr vh 0
        !           572: .if \n(wg>0 \{\
        !           573: .sp \n(wgu
        !           574: .nr vh +\n(wgu \}
        !           575: .nr vk \n(.h
        !           576: .ti +5n
        !           577: Now let's look at the possibility that our program doesn't
        !           578: get an execution error but doesn't produce the correct results.
        !           579: To figure out what and where something is going wrong, we
        !           580: wish to ``watch'' execution information more closely.
        !           581: The \fBtrace\fP command in \fIpdx\fP allows us to do this.
        !           582: There are five classes of information that
        !           583: we can watch:
        !           584: .if n .nr In 5
        !           585: .if t .nr In 8
        !           586: .in +\n(Inn
        !           587: .br
        !           588: .nr wg 1v
        !           589: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           590: .el .nr vh 0
        !           591: .if \n(wg>0 \{\
        !           592: .sp \n(wgu
        !           593: .nr vh +\n(wgu \}
        !           594: .nr vk \n(.h
        !           595: .ti -3n
        !           596: -\h'2n'\c
        !           597: The execution of a particular source line.
        !           598: .br
        !           599: .nr wg 1v
        !           600: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           601: .el .nr vh 0
        !           602: .if \n(wg>0 \{\
        !           603: .sp \n(wgu
        !           604: .nr vh +\n(wgu \}
        !           605: .nr vk \n(.h
        !           606: .ti -3n
        !           607: -\h'2n'\c
        !           608: A call to a particular procedure or function.
        !           609: .br
        !           610: .nr wg 1v
        !           611: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           612: .el .nr vh 0
        !           613: .if \n(wg>0 \{\
        !           614: .sp \n(wgu
        !           615: .nr vh +\n(wgu \}
        !           616: .nr vk \n(.h
        !           617: .ti -3n
        !           618: -\h'2n'\c
        !           619: The value of an expression at a particular source line.
        !           620: .br
        !           621: .nr wg 1v
        !           622: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           623: .el .nr vh 0
        !           624: .if \n(wg>0 \{\
        !           625: .sp \n(wgu
        !           626: .nr vh +\n(wgu \}
        !           627: .nr vk \n(.h
        !           628: .ti -3n
        !           629: -\h'2n'\c
        !           630: The value of a variable whenever it changes; and the
        !           631: line at which it changes.
        !           632: .br
        !           633: .nr wg 1v
        !           634: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           635: .el .nr vh 0
        !           636: .if \n(wg>0 \{\
        !           637: .sp \n(wgu
        !           638: .nr vh +\n(wgu \}
        !           639: .nr vk \n(.h
        !           640: .ti -3n
        !           641: -\h'2n'\c
        !           642: The execution of all source lines.
        !           643: .in -\n(Inn
        !           644: .br
        !           645: .nr wg 1v
        !           646: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           647: .el .nr vh 0
        !           648: .if \n(wg>0 \{\
        !           649: .sp \n(wgu
        !           650: .nr vh +\n(wgu \}
        !           651: .nr vk \n(.h
        !           652: It should be noted that the last two kinds of information
        !           653: are expensive to obtain and will cause your program to run
        !           654: much more slowly than normal.
        !           655: They should be used sparingly.
        !           656: .br
        !           657: .nr wg 1v
        !           658: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           659: .el .nr vh 0
        !           660: .if \n(wg>0 \{\
        !           661: .sp \n(wgu
        !           662: .nr vh +\n(wgu \}
        !           663: .nr vk \n(.h
        !           664: .ne 3
        !           665: .ti +5n
        !           666: These forms of tracing can be combined and there is no
        !           667: limit to the number of things you can trace at any given time.
        !           668: .br
        !           669: .nr wg 1v
        !           670: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           671: .el .nr vh 0
        !           672: .if \n(wg>0 \{\
        !           673: .sp \n(wgu
        !           674: .nr vh +\n(wgu \}
        !           675: .nr vk \n(.h
        !           676: .ne 3
        !           677: .ti +5n
        !           678: To trace the execution of a particular source line,
        !           679: type
        !           680: .br
        !           681: .nr wg 1v
        !           682: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           683: .el .nr vh 0
        !           684: .if \n(wg>0 \{\
        !           685: .sp \n(wgu
        !           686: .nr vh +\n(wgu \}
        !           687: .nr vk \n(.h
        !           688: .in +8n
        !           689: .nf
        !           690: .ne 5
        !           691: > \fBtrace\fP \fIline-number\fP
        !           692: .br
        !           693: .nr wg 1v
        !           694: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           695: .el .nr vh 0
        !           696: .if \n(wg>0 \{\
        !           697: .sp \n(wgu
        !           698: .nr vh +\n(wgu \}
        !           699: .nr vk \n(.h
        !           700: .in -8n
        !           701: .fi
        !           702: The next time the \fBrun\fP command is given
        !           703: \fIpdx\fP will execute the program, printing the specified line
        !           704: each time it is about to be executed.
        !           705: .br
        !           706: .nr wg 1v
        !           707: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           708: .el .nr vh 0
        !           709: .if \n(wg>0 \{\
        !           710: .sp \n(wgu
        !           711: .nr vh +\n(wgu \}
        !           712: .nr vk \n(.h
        !           713: .ne 3
        !           714: .ti +5n
        !           715: To trace every call to a procedure,
        !           716: type
        !           717: .br
        !           718: .nr wg 1v
        !           719: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           720: .el .nr vh 0
        !           721: .if \n(wg>0 \{\
        !           722: .sp \n(wgu
        !           723: .nr vh +\n(wgu \}
        !           724: .nr vk \n(.h
        !           725: .in +8n
        !           726: .nf
        !           727: .ne 5
        !           728: > \fBtrace\fP \fIprocedure-name\fP
        !           729: .br
        !           730: .nr wg 1v
        !           731: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           732: .el .nr vh 0
        !           733: .if \n(wg>0 \{\
        !           734: .sp \n(wgu
        !           735: .nr vh +\n(wgu \}
        !           736: .nr vk \n(.h
        !           737: .in -8n
        !           738: .fi
        !           739: For each call to the named procedure during execution,
        !           740: \fIpdx\fP will print the name of the procedure, the procedure
        !           741: and line it was called from, and what parameters (if any) it was called with.
        !           742: .br
        !           743: .nr wg 1v
        !           744: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           745: .el .nr vh 0
        !           746: .if \n(wg>0 \{\
        !           747: .sp \n(wgu
        !           748: .nr vh +\n(wgu \}
        !           749: .nr vk \n(.h
        !           750: .ne 3
        !           751: .ti +5n
        !           752: To see the value of an expression at a particular line,
        !           753: type
        !           754: .br
        !           755: .nr wg 1v
        !           756: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           757: .el .nr vh 0
        !           758: .if \n(wg>0 \{\
        !           759: .sp \n(wgu
        !           760: .nr vh +\n(wgu \}
        !           761: .nr vk \n(.h
        !           762: .in +8n
        !           763: .nf
        !           764: .ne 5
        !           765: > \fBtrace\fP \fIexpression\fP \fBat\fP \fIsource-line-number\fP
        !           766: .br
        !           767: .nr wg 1v
        !           768: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           769: .el .nr vh 0
        !           770: .if \n(wg>0 \{\
        !           771: .sp \n(wgu
        !           772: .nr vh +\n(wgu \}
        !           773: .nr vk \n(.h
        !           774: .in -8n
        !           775: .fi
        !           776: To see whenever the value of a variable is changed,
        !           777: we type
        !           778: .br
        !           779: .nr wg 1v
        !           780: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           781: .el .nr vh 0
        !           782: .if \n(wg>0 \{\
        !           783: .sp \n(wgu
        !           784: .nr vh +\n(wgu \}
        !           785: .nr vk \n(.h
        !           786: .in +8n
        !           787: .nf
        !           788: .ne 5
        !           789: > \fBtrace\fP \fIvariable\fP
        !           790: .br
        !           791: .nr wg 1v
        !           792: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           793: .el .nr vh 0
        !           794: .if \n(wg>0 \{\
        !           795: .sp \n(wgu
        !           796: .nr vh +\n(wgu \}
        !           797: .nr vk \n(.h
        !           798: .in -8n
        !           799: .fi
        !           800: .br
        !           801: .nr wg 1v
        !           802: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           803: .el .nr vh 0
        !           804: .if \n(wg>0 \{\
        !           805: .sp \n(wgu
        !           806: .nr vh +\n(wgu \}
        !           807: .nr vk \n(.h
        !           808: .ne 3
        !           809: .ti +5n
        !           810: Finally, to have each source line printed
        !           811: as it's about to be executed, we simply say
        !           812: .br
        !           813: .nr wg 1v
        !           814: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           815: .el .nr vh 0
        !           816: .if \n(wg>0 \{\
        !           817: .sp \n(wgu
        !           818: .nr vh +\n(wgu \}
        !           819: .nr vk \n(.h
        !           820: .in +8n
        !           821: .nf
        !           822: .ne 5
        !           823: \fBtrace\fP
        !           824: .br
        !           825: .nr wg 1v
        !           826: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           827: .el .nr vh 0
        !           828: .if \n(wg>0 \{\
        !           829: .sp \n(wgu
        !           830: .nr vh +\n(wgu \}
        !           831: .nr vk \n(.h
        !           832: .in -8n
        !           833: .fi
        !           834: After issuing a trace command, \fIpdx\fP
        !           835: displays all currently active traces.
        !           836: Each command is identified with a number in parentheses.
        !           837: To turn off a trace,
        !           838: give the command
        !           839: .br
        !           840: .nr wg 1v
        !           841: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           842: .el .nr vh 0
        !           843: .if \n(wg>0 \{\
        !           844: .sp \n(wgu
        !           845: .nr vh +\n(wgu \}
        !           846: .nr vk \n(.h
        !           847: .in +8n
        !           848: .nf
        !           849: .ne 5
        !           850: > \fBdelete\fP \fIcommand-number\fP
        !           851: .br
        !           852: .nr wg 1v
        !           853: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           854: .el .nr vh 0
        !           855: .if \n(wg>0 \{\
        !           856: .sp \n(wgu
        !           857: .nr vh +\n(wgu \}
        !           858: .nr vk \n(.h
        !           859: .in -8n
        !           860: .fi
        !           861: Tracing information will be printed every time the program is run until
        !           862: it is explicitly turned off by giving the \fBdelete\fP command.
        !           863: .br
        !           864: .nr wg 1v
        !           865: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           866: .el .nr vh 0
        !           867: .if \n(wg>0 \{\
        !           868: .sp \n(wgu
        !           869: .nr vh +\n(wgu \}
        !           870: .nr vk \n(.h
        !           871: .ne 3
        !           872: .ti +5n
        !           873: To display the information that you are currently tracing, say
        !           874: .br
        !           875: .nr wg 1v
        !           876: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           877: .el .nr vh 0
        !           878: .if \n(wg>0 \{\
        !           879: .sp \n(wgu
        !           880: .nr vh +\n(wgu \}
        !           881: .nr vk \n(.h
        !           882: .in +8n
        !           883: .nf
        !           884: .ne 5
        !           885: > \fBstatus\fP
        !           886: .br
        !           887: .nr wg 1v
        !           888: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           889: .el .nr vh 0
        !           890: .if \n(wg>0 \{\
        !           891: .sp \n(wgu
        !           892: .nr vh +\n(wgu \}
        !           893: .nr vk \n(.h
        !           894: .in -8n
        !           895: .fi
        !           896: .br
        !           897: .nr wg 2v
        !           898: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           899: .el .nr vh 0
        !           900: .if \n(wg>0 \{\
        !           901: .sp \n(wgu
        !           902: .nr vh +\n(wgu \}
        !           903: .nr vk \n(.h
        !           904: .ne 6
        !           905: \fBStopping and Continuing\fP
        !           906: .br
        !           907: .nr wg 1v
        !           908: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           909: .el .nr vh 0
        !           910: .if \n(wg>0 \{\
        !           911: .sp \n(wgu
        !           912: .nr vh +\n(wgu \}
        !           913: .nr vk \n(.h
        !           914: .ti +5n
        !           915: Sometimes, when debugging, we want to stop our program,
        !           916: look at some data, and then continue execution.
        !           917: The \fBstop\fP command allows the suspension of execution.
        !           918: To continue execution from where it was suspended,
        !           919: the \fBcont\fP command is used.
        !           920: There are four ways to describe when execution should be stopped:
        !           921: .in +5n
        !           922: .if n .nr In 5
        !           923: .if t .nr In 8
        !           924: .in +\n(Inn
        !           925: .ta \n(Inn
        !           926: .br
        !           927: .nr wg 1v
        !           928: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           929: .el .nr vh 0
        !           930: .if \n(wg>0 \{\
        !           931: .sp \n(wgu
        !           932: .nr vh +\n(wgu \}
        !           933: .nr vk \n(.h
        !           934: .ti -\n(Inn
        !           935: \&\fBstop\fP \fBif\fP \fIcondition\fP
        !           936: .br
        !           937: \c
        !           938: Execution is stopped if the specified condition becomes true.
        !           939: The condition can be any Pascal boolean expression.
        !           940: .br
        !           941: .nr wg 1v
        !           942: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           943: .el .nr vh 0
        !           944: .if \n(wg>0 \{\
        !           945: .sp \n(wgu
        !           946: .nr vh +\n(wgu \}
        !           947: .nr vk \n(.h
        !           948: .ti -\n(Inn
        !           949: \&\fBstop\fP \fBat\fP \fIsource-line-number\fP
        !           950: .br
        !           951: \c
        !           952: Execution is stopped when the \fIline\fP is about to executed.
        !           953: .br
        !           954: .nr wg 1v
        !           955: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           956: .el .nr vh 0
        !           957: .if \n(wg>0 \{\
        !           958: .sp \n(wgu
        !           959: .nr vh +\n(wgu \}
        !           960: .nr vk \n(.h
        !           961: .ti -\n(Inn
        !           962: \&\fBstop\fP \fBin\fP \fIprocedure\fP
        !           963: .br
        !           964: \c
        !           965: Execution is stopped when the \fIprocedure\fP is called.
        !           966: .br
        !           967: .nr wg 1v
        !           968: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           969: .el .nr vh 0
        !           970: .if \n(wg>0 \{\
        !           971: .sp \n(wgu
        !           972: .nr vh +\n(wgu \}
        !           973: .nr vk \n(.h
        !           974: .ti -\n(Inn
        !           975: \&\fBstop\fP \fIvariable\fP
        !           976: .br
        !           977: \c
        !           978: Execution is stopped when the \fIvariable\fP is about to be changed.
        !           979: .in -\n(Inn
        !           980: .br
        !           981: .nr wg 1v
        !           982: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           983: .el .nr vh 0
        !           984: .if \n(wg>0 \{\
        !           985: .sp \n(wgu
        !           986: .nr vh +\n(wgu \}
        !           987: .nr vk \n(.h
        !           988: .in -5n
        !           989: Execution is also stopped by an interrupt, i.e.
        !           990: by typing the RUB or DEL key.
        !           991: .br
        !           992: .nr wg 1v
        !           993: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !           994: .el .nr vh 0
        !           995: .if \n(wg>0 \{\
        !           996: .sp \n(wgu
        !           997: .nr vh +\n(wgu \}
        !           998: .nr vk \n(.h
        !           999: .ne 3
        !          1000: .ti +5n
        !          1001: Execution can be momentarily continued by the commands \fBnext\fP
        !          1002: and \fBstep\fP.
        !          1003: The \fBnext\fP command stops after one source line has been executed.
        !          1004: The \fBstep\fP command stops at the next source line to be executed.
        !          1005: These are only different when the current source line
        !          1006: contains a call to a procedure or function.
        !          1007: \fBStep\fP will stop at the beginning of the subprogram, \fBnext\fP will not.
        !          1008: As in tracing, stops are set until explicitly unset
        !          1009: with the \fBdelete\fP command.
        !          1010: .br
        !          1011: .nr wg 2v
        !          1012: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1013: .el .nr vh 0
        !          1014: .if \n(wg>0 \{\
        !          1015: .sp \n(wgu
        !          1016: .nr vh +\n(wgu \}
        !          1017: .nr vk \n(.h
        !          1018: .ne 6
        !          1019: \fBSource Program Manipulation\fP
        !          1020: .br
        !          1021: .nr wg 1v
        !          1022: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1023: .el .nr vh 0
        !          1024: .if \n(wg>0 \{\
        !          1025: .sp \n(wgu
        !          1026: .nr vh +\n(wgu \}
        !          1027: .nr vk \n(.h
        !          1028: .ti +5n
        !          1029: \fIPdx\fP allows you to view your program during debugging.
        !          1030: For example, to print lines 10 to 20 from ``prog.p'', you would type
        !          1031: .br
        !          1032: .nr wg 1v
        !          1033: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1034: .el .nr vh 0
        !          1035: .if \n(wg>0 \{\
        !          1036: .sp \n(wgu
        !          1037: .nr vh +\n(wgu \}
        !          1038: .nr vk \n(.h
        !          1039: .in +8n
        !          1040: .nf
        !          1041: .ne 5
        !          1042: > \fBlist\fP 10,20
        !          1043: .br
        !          1044: .nr wg 1v
        !          1045: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1046: .el .nr vh 0
        !          1047: .if \n(wg>0 \{\
        !          1048: .sp \n(wgu
        !          1049: .nr vh +\n(wgu \}
        !          1050: .nr vk \n(.h
        !          1051: .in -8n
        !          1052: .fi
        !          1053: If you actually wish to change your program, or look at it
        !          1054: in a more sophisticated manner, the command
        !          1055: .br
        !          1056: .nr wg 1v
        !          1057: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1058: .el .nr vh 0
        !          1059: .if \n(wg>0 \{\
        !          1060: .sp \n(wgu
        !          1061: .nr vh +\n(wgu \}
        !          1062: .nr vk \n(.h
        !          1063: .in +8n
        !          1064: .nf
        !          1065: .ne 5
        !          1066: > \fBedit\fP
        !          1067: .br
        !          1068: .nr wg 1v
        !          1069: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1070: .el .nr vh 0
        !          1071: .if \n(wg>0 \{\
        !          1072: .sp \n(wgu
        !          1073: .nr vh +\n(wgu \}
        !          1074: .nr vk \n(.h
        !          1075: .in -8n
        !          1076: .fi
        !          1077: will invoke the editor on your program.
        !          1078: You can also say
        !          1079: .br
        !          1080: .nr wg 1v
        !          1081: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1082: .el .nr vh 0
        !          1083: .if \n(wg>0 \{\
        !          1084: .sp \n(wgu
        !          1085: .nr vh +\n(wgu \}
        !          1086: .nr vk \n(.h
        !          1087: .in +8n
        !          1088: .nf
        !          1089: .ne 5
        !          1090: > \fBedit\fP \fIprocedure\fP
        !          1091: .br
        !          1092: .nr wg 1v
        !          1093: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1094: .el .nr vh 0
        !          1095: .if \n(wg>0 \{\
        !          1096: .sp \n(wgu
        !          1097: .nr vh +\n(wgu \}
        !          1098: .nr vk \n(.h
        !          1099: .in -8n
        !          1100: .fi
        !          1101: and \fIpdx\fP will invoke the editor on your program
        !          1102: and position the current line on the first line of
        !          1103: the \fIprocedure\fP.
        !          1104: .br
        !          1105: .nr wg 1v
        !          1106: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1107: .el .nr vh 0
        !          1108: .if \n(wg>0 \{\
        !          1109: .sp \n(wgu
        !          1110: .nr vh +\n(wgu \}
        !          1111: .nr vk \n(.h
        !          1112: .ne 3
        !          1113: .ti +5n
        !          1114: If you change your program and wish to start debugging the
        !          1115: new version, you should give the command
        !          1116: .br
        !          1117: .nr wg 1v
        !          1118: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1119: .el .nr vh 0
        !          1120: .if \n(wg>0 \{\
        !          1121: .sp \n(wgu
        !          1122: .nr vh +\n(wgu \}
        !          1123: .nr vk \n(.h
        !          1124: .in +8n
        !          1125: .nf
        !          1126: .ne 5
        !          1127: > \fBpi\fP
        !          1128: .br
        !          1129: .nr wg 1v
        !          1130: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1131: .el .nr vh 0
        !          1132: .if \n(wg>0 \{\
        !          1133: .sp \n(wgu
        !          1134: .nr vh +\n(wgu \}
        !          1135: .nr vk \n(.h
        !          1136: .in -8n
        !          1137: .fi
        !          1138: This command runs \fIpi\fP on your program, and automatically
        !          1139: reads in the new information that \fIpdx\fP needs from the new \fIobj\fP file.
        !          1140: .br
        !          1141: .nr wg 2v
        !          1142: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1143: .el .nr vh 0
        !          1144: .if \n(wg>0 \{\
        !          1145: .sp \n(wgu
        !          1146: .nr vh +\n(wgu \}
        !          1147: .nr vk \n(.h
        !          1148: .ne 6
        !          1149: \fBCommand Aliasing\fP
        !          1150: .br
        !          1151: .nr wg 1v
        !          1152: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1153: .el .nr vh 0
        !          1154: .if \n(wg>0 \{\
        !          1155: .sp \n(wgu
        !          1156: .nr vh +\n(wgu \}
        !          1157: .nr vk \n(.h
        !          1158: .ti +5n
        !          1159: The \fBalias\fP command is used to create a new name for a command.
        !          1160: This is especially useful for saving typing by defining
        !          1161: abbreviations as aliases.
        !          1162: For example, if you gave the command
        !          1163: .br
        !          1164: .nr wg 1v
        !          1165: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1166: .el .nr vh 0
        !          1167: .if \n(wg>0 \{\
        !          1168: .sp \n(wgu
        !          1169: .nr vh +\n(wgu \}
        !          1170: .nr vk \n(.h
        !          1171: .in +8n
        !          1172: .nf
        !          1173: .ne 5
        !          1174: > \fBalias\fP r run
        !          1175: .br
        !          1176: .nr wg 1v
        !          1177: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1178: .el .nr vh 0
        !          1179: .if \n(wg>0 \{\
        !          1180: .sp \n(wgu
        !          1181: .nr vh +\n(wgu \}
        !          1182: .nr vk \n(.h
        !          1183: .in -8n
        !          1184: .fi
        !          1185: then you could use ``r'' to run your program.
        !          1186: .br
        !          1187: .nr wg 2v
        !          1188: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1189: .el .nr vh 0
        !          1190: .if \n(wg>0 \{\
        !          1191: .sp \n(wgu
        !          1192: .nr vh +\n(wgu \}
        !          1193: .nr vk \n(.h
        !          1194: .ne 6
        !          1195: \fBWhere to go from here\fP
        !          1196: .br
        !          1197: .nr wg 1v
        !          1198: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1199: .el .nr vh 0
        !          1200: .if \n(wg>0 \{\
        !          1201: .sp \n(wgu
        !          1202: .nr vh +\n(wgu \}
        !          1203: .nr vk \n(.h
        !          1204: .ti +5n
        !          1205: If you feel comfortable what we've discussed here,
        !          1206: you're ready to read the \fIpdx\fP manual page.
        !          1207: It contains a complete, but brief, description of the
        !          1208: commands discussed here along with some other commands that you
        !          1209: might find useful.
        !          1210: .br
        !          1211: .nr wg 2v
        !          1212: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1213: .el .nr vh 0
        !          1214: .if \n(wg>0 \{\
        !          1215: .sp \n(wgu
        !          1216: .nr vh +\n(wgu \}
        !          1217: .nr vk \n(.h
        !          1218: .ne 6
        !          1219: \fBReferences\fP
        !          1220: .br
        !          1221: .nr wg 1v
        !          1222: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1223: .el .nr vh 0
        !          1224: .if \n(wg>0 \{\
        !          1225: .sp \n(wgu
        !          1226: .nr vh +\n(wgu \}
        !          1227: .nr vk \n(.h
        !          1228: .ti +5n
        !          1229: .ti -5n
        !          1230: .if n .nr In 5
        !          1231: .if t .nr In 8
        !          1232: .in +\n(Inn
        !          1233: .ta \n(Inn
        !          1234: .br
        !          1235: .nr wg 1v
        !          1236: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1237: .el .nr vh 0
        !          1238: .if \n(wg>0 \{\
        !          1239: .sp \n(wgu
        !          1240: .nr vh +\n(wgu \}
        !          1241: .nr vk \n(.h
        !          1242: .ti -\n(Inn
        !          1243: \&[Joy, Graham and Haley 80]
        !          1244: .br
        !          1245: \c
        !          1246: Joy, W., Graham, S., and Haley, C.,
        !          1247: ``Berkeley Pascal User's Manual'',
        !          1248: version 2.0, EECS Dept., Univ. of Calif. at Berkeley, October 1980.
        !          1249: .in -\n(Inn
        !          1250: .br
        !          1251: .nr wg 1v
        !          1252: .ie \n(.h=\n(vk .nr wg -\n(vhu
        !          1253: .el .nr vh 0
        !          1254: .if \n(wg>0 \{\
        !          1255: .sp \n(wgu
        !          1256: .nr vh +\n(wgu \}
        !          1257: .nr vk \n(.h

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.