0707070000020022061006440001460001440000010025320366121770300000500000000004Size250 0707070000020035521006440001460001440000010233260367443500500000500000000077Namecppflex - Big Name Computing for the UNIXpc - from THE STORE! 0707070000020035241007550001460001440000010025350366123371500000700000003161Remove# # Remove script for cppflex, a cpp replacement # May 1986, Bill Carpenter # #----------------------------------------------------------------------- ##### ###### # # #### # # ###### # # # ## ## # # # # # # # ##### # ## # # # # # ##### ##### # # # # # # # # # # # # # # # # # # # # ###### # # #### ## ###### #----------------------------------------------------------------------- # # try to replace /lib/cpp with /lib/ocpp # if [ ! -f /lib/ocpp ] then # get confirmation message -c "Can't find /lib/ocpp. Still okay to delete /lib/cpp?" if [ "$?" != "0" ] then exit fi rm -f /lib/cpp /lib/mcpp else mv /lib/ocpp /lib/cpp ln /lib/cpp /lib/mcpp fi # # leave ownerships, permissions, etc, as-is # Message="$Message\nGot rid of cppflex version of cpp." if [ ! -f /lib/pflexceptions ] then # don't bother to get confirmation Message="$Message\nDidn't find /lib/pflexceptions." else rm -f /lib/pflexceptions Message="$Message\nPflexceptions table removed." fi for ii in DOCS Docs docs DOC Doc doc # install script put these in a convenient place do if [ -d $LOGDIR/Filecabinet/$ii ] then DocDir=$LOGDIR/Filecabinet/$ii for iii in mm.cppflex cppflex.mm 1.cppflex cppflex.1 do rm -f $DocDir/$iii done fi done Message="$Message\ncppflex documents removed (from this login, anyhow)" Message="$Message\nIt's up to you to zap any \ .pflexnames files laying around." message -i "$Message" message -i "cppflex was brought to you by Bill Carpenter, \ AT&T Bell Laboratories, Department 52462, ho2cad!wjc" 0707070000020035271007550001460001440000010025310366123522100001000000004020Install# # install script for cppflex, a cpp replacement # May 1986, Bill Carpenter # #------------------------------------------------------------------ # # # #### ##### ## # # # ## # # # # # # # # # # # #### # # # # # # # # # # # ###### # # # # ## # # # # # # # # # # #### # # # ###### ###### #------------------------------------------------------------------ # # First, try to save cpp so it can be dragged back on "Remove" # if [ ! -f /lib/cpp ] then message -c "Hey!!!! I couldn't find /lib/cpp. \ If you have the Software Development Utilities installed, it should be \ here. 'cppflex' must be installed AFTER the Development Utilites. \ Now's your chance to quit [CANCEL]." if [ "$?" != "0" ] then exit fi else if [ -f /lib/ocpp ] then message -c "I'm trying to save /lib/cpp as /lib/ocpp, but \ it already exists. Okay to delete it?[ENTER] (If not[CANCEL], \ I'll discard /lib/cpp and keep the existing /lib/ocpp.)" if [ "$?" = '0' ] then # enter mv /lib/cpp /lib/ocpp else # cancel rm -f /lib/cpp fi rm -f /lib/mcpp # this was linked to cpp else mv /lib/cpp /lib/ocpp fi fi # # cpp has been backed up or discarded # ln cpp /lib ln cpp /lib/mcpp chmod -w,+r,+x /lib/cpp chgrp bin /lib/cpp chown bin /lib/cpp # # new cpp (cppflex) has been installed # ln pflexceptions /lib chmod -w,+r,-x /lib/pflexceptions chgrp bin /lib/pflexceptions chown bin /lib/pflexceptions # # documents # DocDir=$LOGDIR/Filecabinet/doc for ii in DOCS Docs docs DOC Doc doc do if [ -d $LOGDIR/Filecabinet/$ii ] then DocDir=$LOGDIR/Filecabinet/$ii fi done ls mm.cppflex cppflex.mm 1.cppflex cppflex.1 | cpio -pld $DocDir >/dev/null 2>&1 # message -i "That's it. I have installed some documents (a man page \ and a Technical Memo) in $DocDir. The cppflex package is provided \ by Bill Carpenter, AT&T Bell Laboratories, Department 52462, ho2cad!wjc." 0707070000020035301007550001460001440000010025600367406121600001100000000043MAKEcpiocat Files | cpio -ocB > CPPFLEX+IN 0707070000020035311007550001460001440000010025660364527363700001100000000044MAKEflopcat Files | cpio -ocB > /dev/rfp021 0707070000020035321006440001460001440000010025250364527711600000600000000155FilesSize Name Remove Install MAKEcpio MAKEflop Files pflexceptions cpp cppflex.1 1.cppflex cppflex.mm mm.cppflex 0707070000020035401004440001460001440000010025510366122515200001600000012216pflexceptions# # /lib/pflexceptions # # I have commented out the entry points beginning with underbar, # since these are not likely to be used by applications programs. # I have also not bothered to try to find the full names, so they # only appear as 8 character prefixes below. # # The other entry points are sorted by a couple letters in the # middle somewhere so that they don't skew the binary tree that # they are stored in inside the program (i.e., they are in pseudo # alpha random order). # # I think I got all the useful entry points from all the libraries # in development set 3.0, but if you find any more, just add them # to the list below. Also please drop me an email note so that # I can update my list. # # ho2cad!wjc # 30 Mar 86 # # __advanc # __braeli # __brasli # __bravar # __cclass # __cerror # __execut # __getrng # __i_size # __msgsys # __omatch # __semsys # __shmsys # __utssys # _adf_rnu # _adf_rsn # _adf_rtb # _adf_rtx # _adf_skp # _arc_poi # _br_setu # _br_step # _bufendt # _bufsync # _cgssvdi # _chkpbfu # _cleanup # _clip_st # _cm_clos # _cm_open # _cm_star # _cm_stop # _cmtx_wa # _draw_cu # _em_fill # _em_line # _em_lmod # _em_loca # _findbuf # _findiop # _hlt_dri # _interce # _inv_xfm # _lastbuf # _m_actio # _m_cos_a # _m_dashe # _m_m_def # _m_map_c # _m_up_ve # _new_xfm # _pb_firs # _pbadf_k # _pbcount # _pbnum_k # _pbstore # _pbtbl_k # _pbtxt_k # _poly_fi # _pup_ord # _putchar # _rawmode # _res_flg # _res_ter # _rubberb # _s_build # _s_free_ # _s_unlin # _send_br # _show_mo # _sigfunc # _sprintw # _stat_wo # _up_orde # _v_circl # _v_escap # _xflsbuf # _xfm_32k # _xfm_mul # # Couldn't find the longnames for these (I didn't look very hard), so # I figured they weren't intended for applications programs. # # arrow_po: # atext_y_: # bytes_op: # ch_intin: # ch_intou: # clr_inde: # cmtx_nst: # curs_att: # curs_lin: # curs_scr: # dirty_cu: # dismnt_c: # disp_ins: # em_funct: # err_stat: # exit_cur: # fd_qual_: # first_li: # flushinp: # freadvhb: # gdname_c: # gdnlblk_: # get_mous: # get_term: # gin_term: # half_cur: # in_curs_: # insert_m: # labelflu: # last_fla: # linerefr: # local_gi: # m_cos_ap: # m_dashes: # m_m_def : # m_map_co: # m_up_vec: # max_curs: # mouse_po: # mvprintw: # mvwprint: # mvwscanw: # old_wind: # opnwk_ho: # port_str: # rd_curks: # redo_cur: # rlayerop: # rvon_off: # s_editch: # s_rowcol: # savetext: # scalefla: # scrn_lim: # scrn_siz: # set_chan: # set_cook: # set_term: # sig_grab: # sig_quit: # sig_vect: # slkhilit: # slkshort: # sreadvhb: # tnamatch: # tobotlef: # touchrec: # tty_open: # txt_repl: # txt_rota: # u_screen: # upd_curs: # use_coun: # v_escape: # val_wr_m: # vsin_mod: UPPERCASE ALLRIGHT vst_alignment set_attr vqf_attributes vql_attributes vqm_attributes vqt_attributes vqa_cell vrq_choice vsm_choice cur_color max_color vsa_color vsb_color vsf_color vsl_color vsm_color vst_color vrd_curkeys sys_errlist lck_file dqa_font dsa_font vqa_font vsa_font vst_font adf_gttok adf_gtwrd adf_gtxcd dsm_height vsm_height vst_height gin_init vsf_interior vqa_length vrq_locator vsm_locator bit_mask sys_nerr vsa_overstrike new_para old_para vsa_passthru gin_point raw_port vqa_position vsa_position vsa_quality fdp_read vst_rotation vsa_spacing vrq_string vsf_style vsm_string vsa_supersub Def_term vsl_type vsm_type vsa_underline vrq_valuator vsm_valuator vsl_width fdp_write wreadmouse em_alignment localtime clean_up wstandend wstandout v_hardcopy clearerr hdrassign volatile ldtbindex patblack ldtbread nocbreak ldtbseek vq_cellarray qa_chcell vq_chcells cm_check pb_check rq_choice touchwin em_circle cm_close fd_close ldaclose gr_clrwk vq_color vs_color fd_conneect hopcount B_Action m_action vq_curaddress vs_curaddress hard_copy fd_delete kcodemap fd_directory fd_disconnect baudrate vs_editchars xfreeall wprefresh yyreject freeldptr saveldptr Freelist q_cellarray v_cellarray pb_empty basename vq_error insertln deleteln resetter aadevname timezone kdefault cm_flush nrefresh wrefresh wsigcatch putgetty wsigflag wsigintr longname cm_going endgrent getgrent setgrent getgrgid getgrnam cm_handle st_height ldahread ldfhread ldshread ldohseek v_pieslice unsigned v_fillarea v_circle register cellarray ctrldisp vldldptr wdeleteln daylight nullmouse maxlnnos syslocal getlogin ldnlseek patltgray em_marker v_pmarker devnames getnames standend standout nlineref printable v_enter_cur unlockit allocldptr fltodb__ ultodb__ dbtofl__ ultofl__ scrollok l_control q_rowcol fd_parse getpdest vs_penspeed addpiece utmpname em_polygon allprint endpwent getpwent putpwent setpwent getpwnam getpwuid vcur_att vcur_color attr_mask vswr_mode fd_rename yyprevious userexit nocrmode username st_rotate ldnrseek wclrtobot wclrtoeol overwrite mouse_key mouseflg parseline winsertln ldnshread v_dspcur mdisplay ldnsseek crosshair cm_start yylstate wrestore hdestroy rq_string wpostwait font_byte last_line tgetflag xlatflag continue destline gettmode wgetmouse wsetmouse clrtobot clrtoeol aoftspace wgetstat wsetstat setuname q_curaddress s_curaddress v_curdown v_curhome v_curleft v_curright v_curtext endutent getutent setutent getutline pututline yyoutput fd_valid denviron adevname do_w_new patwhite fd_write cmrx_now cmtx_now cmtx_string cmrx_wait cmtx_wait v_exit_cur external 0707070000020035411007550001460001440000010056370366122660000000400000054700cppR- @l0 .text@l .data H@.bss  0.lib /< N1X OQ./HJf/H#0N#8/N1x0<N@NVJ f< 9 "| . 9 "| 0/1/< J/9 N1 N^NuNVH $y  gA# NBR `&S e.N @$H`*.g * fS` *\f4` .NT @$H  f 9 "| 0R`&S dR`S e .N @$H`RHH"| 1f~`S ej.N @$HHH"| 1g`.N y E*HH$ | 0(gHH& | 08g$ | 08gHH$ | 0(g | 0(gHH& | 08g | 08gHH$ | 0(g | 0(gpHH& | 08g | 08gHHH$ | 0(g^ | 0(g$HH& | 08g: | 08fHH"| 1g`HH"| 1fS dp./ /9 NPJ g $y `D./9 N4 X` **f`L# .N @$H`8 * fb 9 "| 0RJ fn  n` y Sm y "hRp `@. p /N1X`*S epJ f# .Nz @$H`  m4*/# .NN @$HU#  J# /*`.N( @$H`R`B J f#  J# S HH"y 1gA# HH`0 /gS eLJ g  mJ*/# .N @$HU#  J# /*`HH"| 1f:`.NT @$H`NVH$n#  J# .N @$H y HH"|  1g J LN^NuNVH$n  mN. `/< NX`& 9 "| p 1"9 o.N @$H y # $HN:`J oS 9 "| &q`b&y   e6. NN=J Dg  Dfp`p`p.N1x y R B 9 "| # y Id (J` d Jg` 9 R "| # y G y I# d(J`$ y e y رe . N $չ չ չ lA( LN^NuNVH$n.N @$HG y R  fBS `F y  ("f"B`R  y e #"fB`p./< N Xp-@R #  J# .Nh @$H y   fS # N f`p./< N X` 9 Rr l y -H c6. 6N RN=J Dg  Dfp`p`p.N1xB ."| `A-H` ./g PJfHn/.N1`2 n./.N1X. ?/.N1XHn/.N1P. A/.N1RX @(H 9 R"| #gp-@ѹ 9 # `pѮ nJfVJfHn/< CN JP` 9 "| 0#&n 9 "| #Jf# .N @.N @# ` 9 "| #N` .N @$H e 9 "| p#  J LN^Nu y d@R `NVH$n&n (nB./ N1X-@Jf pLN^Nup`NVJH-y c. ^N (`&-y R .N @-H$y HH"|  1g*. pN `.NN @-H y   f`p././ N P @-H-hg# p-@(J`,HH-@ | . .Ѐ-@eB n# # .N @-H$y  (fIPAP-H`p  f 9 "| 0Sp&y -Kp# -@` y "hRp `. p /N1X`  g,HH"|  1fJf p-@`# + fSB(n gRSJ$fR./ N1XJg 9 "| 0S n./< N X 9 "| 0R nC!IS # #  n LN^NuB /f" **f`^ y "hRp `HJgHH"|  1fl-np nCPe./ /NPJgAP".쒈R$n` y Smz y "hRp `v "g 'ftROڵdf.Og\` y Sm y "hRp `. p /N1XSR`. p /N1XSR`&n`.N$ @-H$y   f, 9 "| 0Sp n./< NvX`< )g6 ,gHH"|  1g* nHH-@B./< `4Jf(S` nC̱e* nHH-@B./< NX n`: nX `ڵeBR` n# # .Nf @-H$y  \f * fJf  p-@ y Sm`d  f y Sl. p /N1X`Եd(HH"| 1f  f *\g`(J`RdHH"| 1f-np nCPe&./ /NRPJgAP".쒈R$Ld`d  f *\gH`NVH<$n`#  .N( @$H y   fpѹ N#  .N @$Hp  y ##  ѹ p./ /9 N6P @&HS p#  fJ f.N` fJ f.N@ @$H` fDR .N. @$Hp./ /9 NP @&HS J fJgLR `p fNR .N @$Hp./ /9 NtP @&HS J fJg R `$R ` fHJ gS fN"`J g`R S `p./< NX`ʷ fFJ g S g R `R N`J fp./< NX`| f6J fjR .N @$Hp./ /9 NvPS `> f0# J fN/JJgR `R $y ` fJ fJ f#  J# ` $y # p  y #(J`RJg  f e .Nl @$H(y `RHH"|  1gt` Ѐ"ЁHHЁr0$HH"|0 1fJg 9 "| 0A"S `R` . N0HH"|  1g  g "g. N`t.N @$H`f*y R "g  gJf^. NB 9 "| ./9 N1XJg 9 "| # #  y   f`` f p# D`P gHpѹ  y   f# `, y HH"|0 1fR `4R `*R ` $c "n ./< ` "n qJ(g  qA"y $X $` "n qA"y (X ("`  o "n ./< 8`H "n qA&H 9 R "| `#``p# `T "n ./< W` 0 f. g "n /1N1RX @# f" "n ./< iNXp.N1x "n .Nl @( 9 "| # "n .N* 9 "| A"E # `` 0 fl. { "n /1N1RX @# f$ "n ./< }NXp.N1x`:.0N1F. /9 N1X` "n ./< NXRm 9 "| # B D 9 R "| `#  9 R B. N @# . N @# . N @# . N @# . N @# . N @# . N @# . N @# . N @# . Nz @# . Nh @# $< ` | B0(Sl. N @# . N @# . N @# . Nz @# 9 "| -q 9 #   9 "| 0#-| ` X.N$ n $e-| `Pp=./N1&X @$H gB n.N1 o 9 "n"QB1p. nX/NX n (e 9 "| # |  # A# A# B B p# 0NH y # # .N~J g y ( g . NN=J Dg$  Dfp.N1xL Jf`6Jf`Jg *`: `4# `D D`"Jgbp` F`# `S b@0; NJ"08P @-Hf./< "N(Xp.N1x n P f&./9 NX y !nB `tJgV. n PA/N1XJg: n PA./. n P//< HnN1HnNX y .N1H y B n P N^NuNVp.J g n ` n P/ nA/N1P nB( nA.Nj.8/< Z/.N@PJgrR R 9 R oR9 p# R. Rp//< JHnN1 .  nA/N1XHn nA/N1P.8/< Z/.N>8PJf n./< "N(Xp.N1xN^NuNV. O/.N1RX @-Hf./< QNXp.N1x`-n`pѮ nHH"|0 1HHr€f _g nB-n .-@pѮ. t/.N18X"nA-HHH"|0 1HHr€f _gB`>-n`pѮ nHH"|0 1HHr€f _g nB-n.p//./.N` ./<HnN1P @ gF. pHnN18XCA-HHH"|0 1HHr€f _g`.N1FN^NuNVp./< /.N1PJf. nA.N1V-@ Ro .` 9 R# RN^NuNVJ g  fH n PJg -<> .<> /<> 0 1 #:  <  9 ;      !                   "%&'()*+,-./012345678$=  llaaLCC7)  $  -!~(*/%+- <>&^|  ?,():)||&&>><<>=<=!===bt n f r \\+-*/%<>&^|?:!~(),defined\ Illegal character %c in preprocessor if"defined" modifying non-identifier "%s" in preprocessor ifIllegal number %syacc stack overflowsyntax errorWjCout of space while pflexing '%s' (alas)/lib/pflexceptionsrCan't open pflexceptions table '%s' PFLEXNAMES.pflexnames./unable to stat %s../warning: no writable '%s' for pflex; %swill make one in current directoryredepflexed '%s' as '%s' ... but earlier '%s' kept%.*drCan't open pflexname file '%s' aunable to write '%s' to update pflexnames # update: %s %s %s #%d 0707070000020035421006660001460001440000010056760367336015000001200000023474cppflex.1.ds PC \\fI\\s-1UNIX\\s+1\\fP\\fBpc\\fP .ds PF \\fIcppflex\\fP .deTH .PD .nrIN \\n()Mu .ift .ds ]H \\$1\^(\^\\$2\^) .ifn .ds ]H \\$1(\\$2) .if\\n()s .ds ]D .if\\n()t .ds ]D UNIX pc (local) .ifn .ds ]D UNIX pc (local) .ds]L .if!\\$3 .ds ]L (\^\\$3\^) .if!\\$4 .ds ]D \\$4 .wh0 }H .wh-\\n(:mu }F .em}M .if\\n(nl .bp .nr)I \\n()Mu .nr)R 0 .}E .DT .ifn \{.na .nh\} .ift \{.bd S 3 3 .hy14 \} .. .TH CPPFLEX 1 .SH NAME cppflex \- the C language preprocessor with flexnames .SH SYNOPSIS .B /lib/cpp [ option ... .B ] .B [ ifile .B [ ofile .B ] ] .SH DESCRIPTION .PP .I Cpp\^ is the C language preprocessor which is invoked as the first pass of any C compilation using the .IR cc (1) command. Thus the output of .I cpp\^ is designed to be in a form acceptable as input to the next pass of the C compiler. As the C language evolves, .I cpp\^ and the rest of the C compilation package will be modified to follow these changes. Therefore, the use of .I cpp\^ other than in this framework is not suggested. The preferred way to invoke .I cpp\^ is through the .IR cc (1) command, since the functionality of .I cpp\^ may someday be moved elsewhere. See .IR m4 (1) for a general macro processor. .PP .I Cpp\^ optionally accepts two file names as arguments. .I Ifile\^ and .I ofile\^ are respectively the input and output for the preprocessor. They default to standard input and standard output if not supplied. .PP The following \fIoptions\fP to .I cpp\^ are recognized: .TP .B \-P Preprocess the input without producing the line control information used by the next pass of the C compiler. .TP .B \-C By default, .I cpp\^ strips C-style comments. If the .B \-C option is specified, all comments (except those found on .I cpp directive lines) are passed along. .TP .BI \-U name\^ Remove any initial definition of .IR name , where .I name\^ is a reserved symbol that is predefined by the particular preprocessor. The current list of these possibly reserved symbols includes: .PD 0 .ne 3v .RS 10 .TP 23 operating system: ibm, gcos, os, tss, unix .TP hardware: interdata, pdp11, u370, u3b, u3b5, vax, mc68k .TP \s-1UNIX\s+1 system variant: .SM RES\*S, .SM RT .TP \fIlint\fR(1): lint .RE .PD .TP .BI \-D name\^ .PD 0 .TP .BI \-D name=def\^ Define .I name\^ as if by a .B #define directive. If no .I =def\^ is given, .I name\^ is defined as 1. The .B \-D option has lower precedence than the .B \-U option. That is, if the same name is used in both a .B \-U option and a .B \-D option, the name will be undefined regardless of the order of the options. .PD .TP .B \-T Except on the \s-1PDP\s+1-11 (and the \*(PC without cppflex), preprocessor symbols are no longer restricted to eight characters. The .B \-T option forces .I cpp\^ to use only the first eight characters for distinguishing different preprocessor names. This behavior is the same as previous preprocessors with respect to the length of names and is included for backward compatibility. .TP .BI \-I dir\^ Change the algorithm for searching for .B #include files whose names do not begin with \f3/\fP to look in .I dir\^ before looking in the directories on the standard list. Thus, .B #include files whose names are enclosed in \f3"\|"\fP will be searched for first in the directory of the file with the .B #include line, then in directories named in .B \-I options, and last in directories on a standard list. For .B #include files whose names are enclosed in .BR <> , the directory of the file with the .B #include line is not searched. .PP Two special names are understood by .IR cpp . The name .B _\^\^_\s-1LINE\s+1_\^\^_ is defined as the current line number (as a decimal integer) as known by .IR cpp , and .B _\^\^_\s-1FILE\s+1_\^\^_ is defined as the current file name (as a C string) as known by .I cpp.\^ They can be used anywhere (including in macros) just as any other defined name. .PP All .I cpp\^ directives start with lines begun by .BR # . Any number of blanks and tabs are allowed between the .B # and the directive. The directives are: .TP .BI #define " name" " " token-string Replace subsequent instances of .I name\^ with .IR token-string . .TP \fB#define\fI name\fB(\fI arg\fB, ...,\fI arg\fB )\fI token-string\fR Notice that there can be no space between .I name and the .BR ( . Replace subsequent instances of .I name followed by a .BR ( , a list of comma-separated set of tokens, and a .B ) by .IR token-string , where each occurrence of an .I arg in the .I token-string is replaced by the corresponding set of tokens in the comma-separated list. When a macro with arguments is expanded, the arguments are placed into the expanded .I token-string unchanged. After the entire .I token-string has been expanded, .I cpp re-starts its scan for names to expand at the beginning of newly created .IR token-string . .TP .BI #undef " name" Cause the definition of .I name (if any) to be forgotten from now on. .TP \fB#include\fI "filename" .PD 0 .TP .BI #include " " < filename > Include at this point the contents of .I filename (which will then be run through .IR cpp ). When the .BI < filename > notation is used, .I filename is only searched for in the standard places. See the .B \-I option above for more detail. .PD .TP \fB#line\fI integer-constant "filename" Causes .I cpp to generate line control information for the next pass of the C compiler. .I Integer-constant is the line number of the next line and .I filename is the file where it comes from. If \fI"filename"\fR is not given, the current file name is unchanged. .TP .B #endif .br Ends a section of lines begun by a test directive .RB ( #if , .BR #ifdef , or .BR #ifndef ). Each test directive must have a matching .BR #endif . .TP .BI #ifdef " name" The lines following will appear in the output if and only if .I name has been the subject of a previous .B #define without being the subject of an intervening .BR #undef . .TP .BI #ifndef " name" The lines following will not appear in the output if and only if .I name has been the subject of a previous .B #define without being the subject of an intervening .BR #undef . .TP .BI #if " constant-expression" Lines following will appear in the output if and only if the .I constant-expression evaluates to non-zero. All binary non-assignment C operators, the .B ?: operator, the unary .BR \(mi , .BR ! , and .B ~ operators are all legal in .IR constant-expression . The precedence of the operators is the same as defined by the C language. There is also a unary operator .BR defined , which can be used in .I constant-expression in these two forms: .BI defined " " ( " name " ) or .BI defined " name" . This allows the utility of .BR #ifdef " and " #ifndef in a .B #if directive. Only these operators, integer constants, and names which are known by .I cpp should be used in .IR constant-expression . In particular, the .B sizeof operator is not available. .\"bp .TP .B #else Reverses the notion of the test directive which matches this directive. So if lines previous to this directive are ignored, the following lines will appear in the output. And vice versa. .PP The test directives and the possible .B #else directives can be nested. .SH FILES .TP 1.5i /usr/include standard directory for .B #include files .TP 1.5i /lib/pflexceptions table of "system-wide" names that must remain "unflexed" due to limitations of .B ld(1). .TP 1.5i \&.pflexnames historical lists of prior .I cppflex translations. .TP 1.5i /lib/ocpp the original version of .I cpp replaced by .I cppflex .SH SEE ALSO .PP cc(1), cpp(1), m4(1). .br \fITurn Your \*(PC into a Big Name Computer with \*(PF\fR, William J. Carpenter, TM 52462-860512-01. .SH DIAGNOSTICS .PP The error messages produced by .I cpp\^ are intended to be self-explanatory. The line number and filename where the error occurred are printed along with the diagnostic. .SH NOTES .PP When new-line characters were found in argument lists for macros to be expanded, previous versions of .I cpp\^ put out the new-lines as they were found and expanded. The current version of .I cpp\^ replaces these new-lines with blanks to alleviate problems that the previous versions had when this occurred. .PP .I cppflex uses files named ".pflexnames" to record and re-read earlier variable name transformations. These are searched in the current directory and then all parent directories back to root. The first writable file is used to record new transformations. If no writable file is found, a warning is given and a file named ".pflexnames" is created in the current directory. .PP .RS +5 If a symbol is multiply defined in history files with different transformations, the first detected is used (warnings are issued for the subsequent definitions). The theory is that the earlier occurrence is hierarchically closer to the current directory. .PP When compiling a system that spans several directories, find the lowest common parent directory and "touch .pflexnames" in that directory. Compilations in all subdirectories will then use a common history-recording file. .PP If you absolutely must, you can override the filename ".pflexnames" by defining and exporting an environment variable "PFLEXNAMES" with the name of the file you prefer. The search backward to root will still occur, except the filename portion of "PFLEXNAMES" will be used rather than ".pflexnames". Use of this feature is discouraged and at your own risk. .PP Obviously, there is a small performance penalty for using .I cppflex, due mainly to processing of the exceptions and history files. As a percentage of "cc" time, it is too small to accurately measure. There is no penalty when the .B -T option is used (but no benefits, either). .PP Programs which previously compiled correctly (but which had spelling errors beyond the eighth character of some variable names) may not compile correctly under .I cppflex. Those variant spellings will be considered distinct variables. Action is to correct the spelling errors or attempt to use the .B -T option. .RS -5 .\" @(#)cpp.1 6.2 of 9/2/83 .\" modified by wjc for cppflex, April 86 07070700000200354410066600014600014400000100572603673361412000012000000345611.cppflex CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) UUUUNNNNIIIIXXXX ppppcccc ((((llllooooccccaaaallll)))) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) NNNNAAAAMMMMEEEE cppflex - the C language preprocessor with flexnames SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS ////lllliiiibbbb////ccccpppppppp [[[[ option ... ]]]] [[[[ ifile [[[[ ofile ]]]] ]]]] DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN _C_p_p is the C language preprocessor which is invoked as the first pass of any C compilation using the _c_c(1) command. Thus the output of _c_p_p is designed to be in a form acceptable as input to the next pass of the C compiler. As the C language evolves, _c_p_p and the rest of the C compilation package will be modified to follow these changes. Therefore, the use of _c_p_p other than in this framework is not suggested. The preferred way to invoke _c_p_p is through the _c_c(1) command, since the functionality of _c_p_p may someday be moved elsewhere. See _m_4(1) for a general macro processor. _C_p_p optionally accepts two file names as arguments. _I_f_i_l_e and _o_f_i_l_e are respectively the input and output for the preprocessor. They default to standard input and standard output if not supplied. The following _o_p_t_i_o_n_s to _c_p_p are recognized: ----PPPP Preprocess the input without producing the line control information used by the next pass of the C compiler. ----CCCC By default, _c_p_p strips C-style comments. If the ----CCCC option is specified, all comments (except those found on _c_p_p directive lines) are passed along. ----UUUU_n_a_m_e Remove any initial definition of _n_a_m_e, where _n_a_m_e is a reserved symbol that is predefined by the particular preprocessor. The current list of these possibly reserved symbols includes: operating system: ibm, gcos, os, tss, unix hardware: interdata, pdp11, u370, u3b, u3b5, vax, mc68k UNIX system variant: RES, RT _l_i_n_t(1): lint ----DDDD_n_a_m_e ----DDDD_n_a_m_e=_d_e_f Define _n_a_m_e as if by a ####ddddeeeeffffiiiinnnneeee directive. If no =_d_e_f is given, _n_a_m_e is defined as 1. The ----DDDD option has lower precedence than the ----UUUU option. That is, if the same name is used in both a ----UUUU option and a ----DDDD option, the name will be undefined regardless of the order of the options. Page 1 (last mod. 5/8/86) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) UUUUNNNNIIIIXXXX ppppcccc ((((llllooooccccaaaallll)))) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) ----TTTT Except on the PDP-11 (and the _U_N_I_Xppppcccc without cppflex), preprocessor symbols are no longer restricted to eight characters. The ----TTTT option forces _c_p_p to use only the first eight characters for distinguishing different preprocessor names. This behavior is the same as previous preprocessors with respect to the length of names and is included for backward compatibility. ----IIII_d_i_r Change the algorithm for searching for ####iiiinnnncccclllluuuuddddeeee files whose names do not begin with //// to look in _d_i_r before looking in the directories on the standard list. Thus, ####iiiinnnncccclllluuuuddddeeee files whose names are enclosed in """""""" will be searched for first in the directory of the file with the ####iiiinnnncccclllluuuuddddeeee line, then in directories named in ----IIII options, and last in directories on a standard list. For ####iiiinnnncccclllluuuuddddeeee files whose names are enclosed in <<<<>>>>, the directory of the file with the ####iiiinnnncccclllluuuuddddeeee line is not searched. Two special names are understood by _c_p_p. The name ________LLLLIIIINNNNEEEE________ is defined as the current line number (as a decimal integer) as known by _c_p_p, and ________FFFFIIIILLLLEEEE________ is defined as the current file name (as a C string) as known by _c_p_p. They can be used anywhere (including in macros) just as any other defined name. All _c_p_p directives start with lines begun by ####. Any number of blanks and tabs are allowed between the #### and the directive. The directives are: ####ddddeeeeffffiiiinnnneeee _n_a_m_e _t_o_k_e_n-_s_t_r_i_n_g Replace subsequent instances of _n_a_m_e with _t_o_k_e_n-_s_t_r_i_n_g. ####ddddeeeeffffiiiinnnneeee _n_a_m_e(((( _a_r_g,,,, ............,,,, _a_r_g )))) _t_o_k_e_n-_s_t_r_i_n_g Notice that there can be no space between _n_a_m_e and the ((((. Replace subsequent instances of _n_a_m_e followed by a ((((, a list of comma-separated set of tokens, and a )))) by _t_o_k_e_n-_s_t_r_i_n_g, where each occurrence of an _a_r_g in the _t_o_k_e_n-_s_t_r_i_n_g is replaced by the corresponding set of tokens in the comma-separated list. When a macro with arguments is expanded, the arguments are placed into the expanded _t_o_k_e_n-_s_t_r_i_n_g unchanged. After the entire _t_o_k_e_n-_s_t_r_i_n_g has been expanded, _c_p_p re-starts its scan for names to expand at the beginning of newly created _t_o_k_e_n-_s_t_r_i_n_g. ####uuuunnnnddddeeeeffff _n_a_m_e Cause the definition of _n_a_m_e (if any) to be forgotten from now on. ####iiiinnnncccclllluuuuddddeeee "_f_i_l_e_n_a_m_e" Page 2 (last mod. 5/8/86) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) UUUUNNNNIIIIXXXX ppppcccc ((((llllooooccccaaaallll)))) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) ####iiiinnnncccclllluuuuddddeeee <<<<_f_i_l_e_n_a_m_e>>>> Include at this point the contents of _f_i_l_e_n_a_m_e (which will then be run through _c_p_p). When the <<<<_f_i_l_e_n_a_m_e>>>> notation is used, _f_i_l_e_n_a_m_e is only searched for in the standard places. See the ----IIII option above for more detail. ####lllliiiinnnneeee _i_n_t_e_g_e_r-_c_o_n_s_t_a_n_t "_f_i_l_e_n_a_m_e" Causes _c_p_p to generate line control information for the next pass of the C compiler. _I_n_t_e_g_e_r-_c_o_n_s_t_a_n_t is the line number of the next line and _f_i_l_e_n_a_m_e is the file where it comes from. If "_f_i_l_e_n_a_m_e" is not given, the current file name is unchanged. ####eeeennnnddddiiiiffff Ends a section of lines begun by a test directive (####iiiiffff, ####iiiiffffddddeeeeffff, or ####iiiiffffnnnnddddeeeeffff). Each test directive must have a matching ####eeeennnnddddiiiiffff. ####iiiiffffddddeeeeffff _n_a_m_e The lines following will appear in the output if and only if _n_a_m_e has been the subject of a previous ####ddddeeeeffffiiiinnnneeee without being the subject of an intervening ####uuuunnnnddddeeeeffff. ####iiiiffffnnnnddddeeeeffff _n_a_m_e The lines following will not appear in the output if and only if _n_a_m_e has been the subject of a previous ####ddddeeeeffffiiiinnnneeee without being the subject of an intervening ####uuuunnnnddddeeeeffff. ####iiiiffff _c_o_n_s_t_a_n_t-_e_x_p_r_e_s_s_i_o_n Lines following will appear in the output if and only if the _c_o_n_s_t_a_n_t-_e_x_p_r_e_s_s_i_o_n evaluates to non-zero. All binary non-assignment C operators, the ????:::: operator, the unary ----, !!!!, and ~~~~ operators are all legal in _c_o_n_s_t_a_n_t- _e_x_p_r_e_s_s_i_o_n. The precedence of the operators is the same as defined by the C language. There is also a unary operator ddddeeeeffffiiiinnnneeeedddd, which can be used in _c_o_n_s_t_a_n_t- _e_x_p_r_e_s_s_i_o_n in these two forms: ddddeeeeffffiiiinnnneeeedddd (((( _n_a_m_e )))) or ddddeeeeffffiiiinnnneeeedddd _n_a_m_e.... This allows the utility of ####iiiiffffddddeeeeffff and ####iiiiffffnnnnddddeeeeffff in a ####iiiiffff directive. Only these operators, integer constants, and names which are known by _c_p_p should be used in _c_o_n_s_t_a_n_t-_e_x_p_r_e_s_s_i_o_n. In particular, the ssssiiiizzzzeeeeooooffff operator is not available. ####eeeellllsssseeee Reverses the notion of the test directive which matches this directive. So if lines previous to this directive are ignored, the following lines will appear in the output. And vice versa. The test directives and the possible ####eeeellllsssseeee directives can be Page 3 (last mod. 5/8/86) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) UUUUNNNNIIIIXXXX ppppcccc ((((llllooooccccaaaallll)))) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) nested. FFFFIIIILLLLEEEESSSS /usr/include standard directory for ####iiiinnnncccclllluuuuddddeeee files /lib/pflexceptions table of "system-wide" names that must remain "unflexed" due to limitations of lllldddd((((1111)))).... .pflexnames historical lists of prior _c_p_p_f_l_e_x translations. /lib/ocpp the original version of _c_p_p replaced by _c_p_p_f_l_e_x SSSSEEEEEEEE AAAALLLLSSSSOOOO cc(1), cpp(1), m4(1). _T_u_r_n _Y_o_u_r _U_N_I_Xppppcccc _i_n_t_o _a _B_i_g _N_a_m_e _C_o_m_p_u_t_e_r _w_i_t_h _c_p_p_f_l_e_x, William J. Carpenter, TM 52462-860512-01. DDDDIIIIAAAAGGGGNNNNOOOOSSSSTTTTIIIICCCCSSSS The error messages produced by _c_p_p are intended to be self- explanatory. The line number and filename where the error occurred are printed along with the diagnostic. NNNNOOOOTTTTEEEESSSS When new-line characters were found in argument lists for macros to be expanded, previous versions of _c_p_p put out the new-lines as they were found and expanded. The current version of _c_p_p replaces these new-lines with blanks to alleviate problems that the previous versions had when this occurred. _c_p_p_f_l_e_x uses files named ".pflexnames" to record and re-read earlier variable name transformations. These are searched in the current directory and then all parent directories back to root. The first writable file is used to record new transformations. If no writable file is found, a warning is given and a file named ".pflexnames" is created in the current directory. If a symbol is multiply defined in history files with different transformations, the first detected is used (warnings are issued for the subsequent definitions). The theory is that the earlier occurrence is hierarchically closer to the current directory. When compiling a system that spans several directories, find the lowest common parent directory and "touch .pflexnames" in that directory. Compilations in all subdirectories will then use a common history-recording file. Page 4 (last mod. 5/8/86) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) UUUUNNNNIIIIXXXX ppppcccc ((((llllooooccccaaaallll)))) CCCCPPPPPPPPFFFFLLLLEEEEXXXX((((1111)))) If you absolutely must, you can override the filename ".pflexnames" by defining and exporting an environment variable "PFLEXNAMES" with the name of the file you prefer. The search backward to root will still occur, except the filename portion of "PFLEXNAMES" will be used rather than ".pflexnames". Use of this feature is discouraged and at your own risk. Obviously, there is a small performance penalty for using _c_p_p_f_l_e_x, due mainly to processing of the exceptions and history files. As a percentage of "cc" time, it is too small to accurately measure. There is no penalty when the ----TTTT option is used (but no benefits, either). Programs which previously compiled correctly (but which had spelling errors beyond the eighth character of some variable names) may not compile correctly under _c_p_p_f_l_e_x. Those variant spellings will be considered distinct variables. Action is to correct the spelling errors or attempt to use the ----TTTT option. Page 5 (last mod. 5/8/86) 0707070000020035471006660001460001440000010057460367336101500001300000042431cppflex.mm.PM BP .de UX .ie \\n(UX=0 \\{\\ \\s-1UNIX\\s+1\\*F .FS \\s-1UNIX\\s+1 is a trademark of AT&T Bell Laboratories. .FE .nr UX 1 \\} .el \\s-1UNIX\\s+1 .. .ds PC \\fIUNIX\\fP\\fBpc\\fP .ds PF \\fIcppflex\\fP .ND "May 12, 1986" .TL "821007-0010" "40467-3" Turn Your \*(PC into a Big Name Computer with \*(PF .AU "William J. Carpenter" WJC HO 52462 8392 1L-410 ho2cad!wjc .TM 52462-860512-01 .AS 2 This paper describes \*(PF, a package developed to provide easy use of flexnames (up to 100 character variable names in SVR2) in source code used on the \*(PC. The package is installable using the normal \*(PC facilities. Using it requires no source code nor ``makefile'' modifications. The method is usable with no difficulty for source code packages spread across several files and even across several directories. In short, flexname capability is provided at negligible cost to the \*(PC software developer. .AE .MT "TECHNICAL MEMORANDUM" .P .H 1 "Introduction" Beginning with .UX System V, release 2, \fIC\fP programmers were guaranteed at least 100 significant characters in variable names. Once used, the flexname luxury can quickly become a necessity. Of course, the limit of 100 is seldom approached. The previous limit (generally eight characters, but seven in some cases) often frustrated attempts at making easily-read source code. .P On the \*(PC, a hybrid of .UX System V, release 1, is used. Flexnames are not supported, and variable names are still limited to eight significant characters. (This is true at least through release 3.0 of the \*(PC software development utilities.) .P For original code being developed on the \*(PC, this is only a small inconvenience, since time spent compensating for variable name collisions is small compared to total development time. Also, the inconvenience occurs incrementally in very small parcels. For the porting of software from other systems, however, the lack of flexnames can be a significant bother. .P The traditional approach to porting flexname source code to a non-flexname system is to either manually edit the variable names or to use preprocessor macros to logically redefine them to resolve collisions. On the \*(PC, the latter approach fails because the \fIC\fP preprocessor (\fIcpp\fP) also considers only the first eight characters. Editing source code to ``deflex'' a software package of non-trivial size has the following disadvantages: .BL .LI considerable time is often spent performing mechanical editing tasks on code that is usually already working; .LI errors might be introduced into previously correct code; .LI the author's original variable naming conventions are disturbed, possibly affecting the readability of the code; .LI the conversion work is lost if an updated version of the same package is later ported to the \*(PC; .LI doing this is basically a tedious, aggravating, time-consuming task. .LE .P .H 1 "The \*(PF Package" \*(PF provides an easy-to-use alternative to the traditional method of getting around the eight-character restriction. It provides the following features: .BL .LI easily installed via the normal \*(PC facilities; .LI fully compatible with SVR2 flexnames (over 100 significant characters are provided); .LI no changes to the source code are required; .LI no changes to ``makefiles'' are required; .LI automatic invocation via \fBcc\fP (no special user action usually needed); .LI compatible with both release 2.0 and 3.0 development utilities; .LI negligible performance penalty during compiles; .LI works with software split into several files or several directories. .LE .P .H 2 "Installation" The \*(PF package is installed from floppy disk or electronic mail via the normal administrative facilities of the \*(PC. Installation includes providing this document and a \fBman\fP page, replacing the normal \fIC\fP preprocessor, and placing a data file in \fB/lib\fP. The original \fIC\fP preprocessor is still available as \fB/lib/ocpp\fP. (No capabilities are lost as a result of using \*(PF.) .P .H 2 "Operation" To invoke \*(PF, the user invokes the \fBcc\fP command as usual. (If the source code is spread across more than one directory, one additional step is necessary for the first compilation of it. This is explained below.) At least 100 characters of variable names will be considered significant for the compilation. .P \*(PF uses files named ``\fB.pflexnames\fP'' to record and re-read earlier variable name transformations. These are searched in the current directory and then all parent directories back to root. All files found are read as history files. The first writable file is used to record new transformations. If no writable file is found, a warning is given and a file named ``\fB.pflexnames\fP'' is created in the current directory. .P If a symbol is multiply defined in history files with different transformations, the first detected is used (warnings are issued for the subsequent definitions). The theory is that the earlier occurrence is hierarchically closer to the current directory. .P When compiling a system that spans two or more directories, find the lowest common parent directory and ``\fBtouch .pflexnames\fP'' in that directory. (This is needed only prior to the first time the source package is compiled.) Compilations in all subdirectories will then use a common history-recording file, since they will all reach that file first in the search upward toward the root directory. .P You can override the filename ``\fB.pflexnames\fP'' by defining and exporting an environment variable ``\fBPFLEXNAMES\fP'' with the name of the file you prefer. The search backward to the root directory will still occur (starting with ``\fI$PFLEXNAMES\fP''), except that the filename portion of ``\fI$PFLEXNAMES\fP'' will be used rather than ``\fB.pflexnames\fP''. Use of this feature is discouraged and at your own risk. .P Obviously, there is a small performance penalty for using \*(PF, due mainly to processing of the exceptions and history files. As a percentage of \fBcc\fP time, it is too small to accurately measure. There is no penalty when the .B -T option is used to restrict names to eight characters as in the original preprocessor (but no benefits, either). The original \fIC\fP preprocessor replaced by \*(PF is still available as \fB/lib/ocpp\fP. The standard \fBman\fP page for \fBcc\fP gives instructions for invoking it as an alternate preprocessor. .P Programs which previously compiled correctly (but which had spelling errors beyond the eighth character of some variable names) may not compile correctly under \*(PF. User action is to correct the spelling errors or attempt to use the .B -T option. Those variant spellings will be considered distinct variables. In particular, \*(PF ``pre-remembers'' all the global symbols from the object libraries provided with the \*(PC, so these must be spelled out completely and correctly to avoid errors in \fBld\fP. .P .H 2 "Diagnostics" \*(PF remembers some things about past compilations for a given source code file or package. Most diagnostics arise from problems with that remembered information. In particular, it is normal to receive a warning that no historical data exists when a source package is compiled for the first time. .BL .LI warning: no writable .pflexnames for pflex; will make one in current directory \fB[warning\fP ... normal on first compilation\fB]\fP .LI Can't open pflexceptions table `\fIfilename\fP' \fB[fatal\fP ... check existence and permissions on the indicated file\fB]\fP .LI redepflexed `\fIveryLongName\fP' as `\fIshortnme\fP' ... but earlier `\fIshtname\fP' kept \fB[warning\fP ... a particular flexname has had more than one shortname substitution defined in the exceptions and/or history file; the definition closer to the current directory is used\fB]\fP .LI Can't open pflexname file `\fIfilename\fP' \fB[fatal\fP ... check permissions\fB]\fP .LI unable to write `\fIfilename\fP' to update pflexnames \fB[warning\fP ... this compilation will complete, but no history can be written (a rare message; you'll get this if your filesystem is damaged or full)\fB]\fP .LE .P .H 2 "Inside \*(PF" \*(PF intercedes between the \fIC\fP preprocessor and the \fIC\fP compiler and performs substitutions of short symbols (eight characters) for long symbols (eight or more characters). The preprocessor gives \*(PF a symbol. \*(PF gives back a symbol, and the preprocessor passes this (possibly transformed) symbol to the compiler. \*(PF uses a combination of transformation history and symbol-making rules. .H 3 "Short Names." If the preprocessor passes \*(PF a symbol of seven or fewer characters, then that same symbol is returned without change. Since all such short names are presumed to be unique already, it is not necessary to keep track of them. .H 3 "Long Names." Symbols with eight or more characters are considered long. The first attempted transformation is to simply use the initial eight characters as the short name. A table of transformations is searched. If that eight-character prefix has already been used for some other long symbol, it cannot be used for this symbol. A name is generated by using a fixed three-character prefix and appending a unique five-digit number to it. These resulting symbols are intended to be unusual and not collide with actual symbols in the source code.\*F .FS It is natural to wonder how the various scope levels for variable names are handled. In fact, they are simply ignored. If duplicate variable names were used in a syntactically correct manner in the flexname source code, then consistently applied transformations will still yield a correct program that also compiles correctly on the \*(PC. .FE The transformation is added to the table (both the long name and the transformed short name are recorded). .H 3 "Exceptions." A table of exceptions (kept in file \fB/lib/pflexceptions\fP) lists symbols which can only be transformed into their own eight-character initial string. These symbols are from two classes: the globals from the libraries provided with the \*(PC, and the few eight-character reserved symbols in the \fIC\fP language (\fBcontinue\fP, \fBexternal\fP,\*F .FS Although "\fIexternal\fP" is not reserved and "\fIextern\fP" is, "\fIextern\fP" is handled properly because it is only six characters. The word "\fIexternal\fP" is listed in the \*(PC documentation as reserved and is, therefore, included in the exceptions list. The cost of a few extra entries in the exceptions list in marginal. .FE \fBregister\fP, \fBunsigned\fP, and \fBvolatile\fP). Since there is no reasonable way to change an arbitrary reference to these symbols, they must remain consistent throughout all software on the machine. For example, the symbol \fBlocaltime\fP must always be transformed into \fBlocaltim\fP, since that is the reference in the symbol table in \fBlibc.a\fP. (Such library symbols with seven or fewer characters are handled appropriately by the \*(PF methodology explained above.) .P It is possible that some symbol has been inadvertently omited from the list, or a developer may have his/her own widely-used local library. (The symptom is likely to be that some global symbol from the application will not be resolved during \fBld\fP.) Additional entries may be added to the exceptions list (but see the section ``Performance Factors'' below). I would like to hear about any missing symbols from the standard \*(PC libraries. .H 3 "History Mechanism." More often than not, source code packages consist of more than a single compilable source file. Indeed, a package can span several directories. Since \*(PF transformations would usually give global symbols different symbol table definitions in resulting object files, the transformations must be forced to be done consistently from file to file. (Obviously, this doesn't matter for unrelated object modules.) At the conclusion of the \fIC\fP preprocessor pass, \*(PF appends its table of transformations onto a file for future reference. The actual file used (``\fB.pflexnames\fP'') is described above in the ``Operation'' section. .H 3 "Performance Factors." The exception and history files are not read until a long symbol transformation is needed. Therefore, if all symbols in a source file are seven or fewer characters, essentially no overhead is incurred via \*(PF. .P When the first long-name transformation is needed, the exceptions file is read, and then all history files are read. An in-core table of exceptions\*F .FS The entries in the exceptions file are treated as prior transformations. They have been intentionally randomized to avoid severe skewing of the binary tree. Do not make the mistake of sorting that file, since these will be the first entries in the tree and will be inserted in the order listed. .FE and prior transformations is built as a binary tree of structures searchable on either the long name or the short name. .P One could avoid ever getting the ``no writable pflexnames file ...'' message by touching a file named ``\fB/.pflexnames\fP'' which would always be found in the search toward the root directory. Since all new transformations are appended to the first discovered writable pflexnames file, most would end up in this file in the root directory. Most such transformations would be irrelevant to any particular compilation, but the (possibly quite lengthy) file would have to be read anyhow. For this reason, a search from the current directory toward root is used instead, so that the read history can be limited to reasonably related files. .H 1 "Related Software" The development of \*(PF was motivated by the lack of support for flexnames in the \fIC\fP compiler on the \*(PC. The particular approach taken was a result of the fact that neither the preprocessor (\fBcpp\fP), the assembler (\fBas\fP), nor the loader (\fBld\fP) support them either. The method of variable name transformation, along with the history mechanism, allows the standard versions of programs other than the preprocessor to run without modification. (Occasionally, the loader might make a comment about some symbol for which a short name has been fabricated. This may require a peek into the history file, but usually something obvious will be wrong [i.e., an incorrect \fBcc\fP command line].) In fact, it is not even required that these programs be invoked via \fBcc\fP. Consistency is maintained by the methodology, which localizes the transformations to the preprocessor. .P The symbol tables in the object files (both relocatables and executables) will contain entries which indicate the transformed names. Any program which manipulates those entries may report variable names which are misleading. For example, \fBsdb\fP (the source-level debugging tool) will only know about the transformed variable names. Use of \fBsdb\fP in conjunction with source files (the usual case) will sometimes be awkward because of this. Correct cross-references between the long and short names can be obtained from the history files, although the practice of using the first eight characters when possible should minimize the need for this. .P Object files on the \*(PC are written in the Common Object File Format (\s-1COFF\s+1), which allows for arbitrarily long symbols. It would be straight-forward to write a companion program to \*(PF which would follow \fBld\fP and ``untransform'' the executable file so that symbols would match the source code. \fBsdb\fP seems to understand flexnames, and would be somewhat easier to use. On the other hand, \fBld\fP does not understand the flexname symbol table entries. It was, in fact, this restriction in \fBld\fP which obviated the writing of that companion program and necessitated the use of history files. (If \fBld\fP understood flexnames, it would seem smart to ``untransform'' the relocatable object files immediately after \fBas\fP. In that case, global symbols would always agree with the source code. But, alas, \fBld\fP does not cooperate.) .P The \fIC\fP cross-reference utility, \fBcxref\fP, is actually a separate, modified copy of \fBcpp\fP. \*(PF does not do anything to \fBcxref\fP, so it still only considers the first eight characters to be significant. This can be either good or bad, depending on how you use \fBcxref\fP. .H 1 "Availability and Support" \*(PF is an installable package. The \*(PF package is available from the author via electronic mail. Since it is based, in part, on .UX source code, it will be distributed only within AT&T. \*(PF is also being submitted to \fITHE STORE!\fP for possible distribution. Since their distribution is automated, it is better to get it from there than from me. .P The package is complete to the point of serving my original needs. Further support, therefore, cannot be offered. Of course, I am interested in hearing about bugs or problems. .H 1 "Acknowledgement" It is probably obvious that the \fIC\fP preprocessor is not really replaced. Rather, it has been given added functionality. Large portions of the \*(PF \fBcpp\fP are a direct steal from the .UX SVR2 \fBcpp\fP. .SG wjc .NS 3 \fBcppflex(1)\fP \fBman\fP page \f(CW .NS 1 J. H. Carey HO 1L-419 T. S. Chen HO 1L-410 B. R. Fowler HO 1K-419 L. A. O'Neill HO 1M-411 S. Pardee WH 3B-316 J. S. Striegel HO 1M-404 All Members, Design Libraries Development Group, Dept 52462 .sp Barry Brooks MT 3G-332 ) Jonathon Clark MT 3G-317 ) E. V. Courte FJ 1H-103 ) ATT-IS J. A. Kutsch MT 3P-344 ) All Supervision, Department 624-01311 ) .NS "cover sheet only" All Supervision, Center 5246 All Members, Center 5246 \fP 0707070000020035501006660001460001440000010232630367336441200001300000061670mm.cppflex AAAATTTT&&&&TTTT BBBBeeeellllllll LLLLaaaabbbboooorrrraaaattttoooorrrriiiieeeessss subject: Turn Your _U_N_I_Xppppcccc into a date: May 12, 1986 Big Name Computer with _c_p_p_f_l_e_x from: William J. Carpenter Charge Case 821007-0010 HO 52462 File Case 40467-3 1L-410 x8392 ho2cad!wjc TM 52462-860512-01 _A_B_S_T_R_A_C_T This paper describes _c_p_p_f_l_e_x, a package developed to provide easy use of flexnames (up to 100 character variable names in SVR2) in source code used on the _U_N_I_Xppppcccc. The package is installable using the normal _U_N_I_Xppppcccc facilities. Using it requires no source code nor ``makefile'' modifications. The method is usable with no difficulty for source code packages spread across several files and even across several directories. In short, flexname capability is provided at negligible cost to the _U_N_I_Xppppcccc software developer. _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 AAAATTTT&&&&TTTT BBBBeeeellllllll LLLLaaaabbbboooorrrraaaattttoooorrrriiiieeeessss subject: Turn Your _U_N_I_Xppppcccc into a date: May 12, 1986 Big Name Computer with _c_p_p_f_l_e_x from: William J. Carpenter Charge Case 821007-0010 HO 52462 File Case 40467-3 1L-410 x8392 ho2cad!wjc TM 52462-860512-01 _T_E_C_H_N_I_C_A_L__M_E_M_O_R_A_N_D_U_M 1. _I_n_t_r_o_d_u_c_t_i_o_n Beginning with UNIX1 System V, release 2, _C programmers were guaranteed at least 100 significant characters in variable names. Once used, the flexname luxury can quickly become a necessity. Of course, the limit of 100 is seldom approached. The previous limit (generally eight characters, but seven in some cases) often frustrated attempts at making easily-read source code. On the _U_N_I_Xppppcccc, a hybrid of UNIX System V, release 1, is used. Flexnames are not supported, and variable names are still limited to eight significant characters. (This is true at least through release 3.0 of the _U_N_I_Xppppcccc software development utilities.) For original code being developed on the _U_N_I_Xppppcccc, this is only a small inconvenience, since time spent compensating for variable name collisions is small compared to total development time. Also, the inconvenience occurs incrementally in very small parcels. For the porting of software from other systems, however, the lack of flexnames can be a significant bother. The traditional approach to porting flexname source code to a non-flexname system is to either manually edit the variable names or to use preprocessor macros to logically __________ 1. UNIX is a trademark of AT&T Bell Laboratories. _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 2 - redefine them to resolve collisions. On the _U_N_I_Xppppcccc, the latter approach fails because the _C preprocessor (_c_p_p) also considers only the first eight characters. Editing source code to ``deflex'' a software package of non-trivial size has the following disadvantages: +o considerable time is often spent performing mechanical editing tasks on code that is usually already working; +o errors might be introduced into previously correct code; +o the author's original variable naming conventions are disturbed, possibly affecting the readability of the code; +o the conversion work is lost if an updated version of the same package is later ported to the _U_N_I_Xppppcccc; +o doing this is basically a tedious, aggravating, time- consuming task. 2. _T_h_e__c_p_p_f_l_e_x__P_a_c_k_a_g_e _c_p_p_f_l_e_x provides an easy-to-use alternative to the traditional method of getting around the eight-character restriction. It provides the following features: +o easily installed via the normal _U_N_I_Xppppcccc facilities; +o fully compatible with SVR2 flexnames (over 100 significant characters are provided); +o no changes to the source code are required; +o no changes to ``makefiles'' are required; +o automatic invocation via cccccccc (no special user action usually needed); +o compatible with both release 2.0 and 3.0 development utilities; +o negligible performance penalty during compiles; +o works with software split into several files or several directories. _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 3 - 2.1 _I_n_s_t_a_l_l_a_t_i_o_n The _c_p_p_f_l_e_x package is installed from floppy disk or electronic mail via the normal administrative facilities of the _U_N_I_Xppppcccc. Installation includes providing this document and a mmmmaaaannnn page, replacing the normal _C preprocessor, and placing a data file in ////lllliiiibbbb. The original _C preprocessor is still available as ////lllliiiibbbb////ooooccccpppppppp. (No capabilities are lost as a result of using _c_p_p_f_l_e_x.) 2.2 _O_p_e_r_a_t_i_o_n To invoke _c_p_p_f_l_e_x, the user invokes the cccccccc command as usual. (If the source code is spread across more than one directory, one additional step is necessary for the first compilation of it. This is explained below.) At least 100 characters of variable names will be considered significant for the compilation. _c_p_p_f_l_e_x uses files named ``....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'' to record and re- read earlier variable name transformations. These are searched in the current directory and then all parent directories back to root. All files found are read as history files. The first writable file is used to record new transformations. If no writable file is found, a warning is given and a file named ``....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'' is created in the current directory. If a symbol is multiply defined in history files with different transformations, the first detected is used (warnings are issued for the subsequent definitions). The theory is that the earlier occurrence is hierarchically closer to the current directory. When compiling a system that spans two or more directories, find the lowest common parent directory and ``ttttoooouuuucccchhhh ....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'' in that directory. (This is needed only prior to the first time the source package is compiled.) Compilations in all subdirectories will then use a common history-recording file, since they will all reach that file first in the search upward toward the root directory. You can override the filename ``....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'' by defining and exporting an environment variable ``PPPPFFFFLLLLEEEEXXXXNNNNAAAAMMMMEEEESSSS'' with the name of the file you prefer. The search backward to the root directory will still occur (starting with _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 4 - ``$_P_F_L_E_X_N_A_M_E_S''), except that the filename portion of ``$_P_F_L_E_X_N_A_M_E_S'' will be used rather than ``....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss''. Use of this feature is discouraged and at your own risk. Obviously, there is a small performance penalty for using _c_p_p_f_l_e_x, due mainly to processing of the exceptions and history files. As a percentage of cccccccc time, it is too small to accurately measure. There is no penalty when the ----TTTT option is used to restrict names to eight characters as in the original preprocessor (but no benefits, either). The original _C preprocessor replaced by _c_p_p_f_l_e_x is still available as ////lllliiiibbbb////ooooccccpppppppp. The standard mmmmaaaannnn page for cccccccc gives instructions for invoking it as an alternate preprocessor. Programs which previously compiled correctly (but which had spelling errors beyond the eighth character of some variable names) may not compile correctly under _c_p_p_f_l_e_x. User action is to correct the spelling errors or attempt to use the ----TTTT option. Those variant spellings will be considered distinct variables. In particular, _c_p_p_f_l_e_x ``pre-remembers'' all the global symbols from the object libraries provided with the _U_N_I_Xppppcccc, so these must be spelled out completely and correctly to avoid errors in lllldddd. 2.3 _D_i_a_g_n_o_s_t_i_c_s _c_p_p_f_l_e_x remembers some things about past compilations for a given source code file or package. Most diagnostics arise from problems with that remembered information. In particular, it is normal to receive a warning that no historical data exists when a source package is compiled for the first time. +o warning: no writable .pflexnames for pflex; will make one in current directory [[[[wwwwaaaarrrrnnnniiiinnnngggg ... normal on first compilation]]]] +o Can't open pflexceptions table `_f_i_l_e_n_a_m_e' [[[[ffffaaaattttaaaallll ... check existence and permissions on the indicated file]]]] +o redepflexed `_v_e_r_y_L_o_n_g_N_a_m_e' as `_s_h_o_r_t_n_m_e' ... but earlier `_s_h_t_n_a_m_e' kept [[[[wwwwaaaarrrrnnnniiiinnnngggg ... a particular flexname has had more than one shortname substitution defined in the exceptions and/or history file; the definition closer to the current directory is used]]]] _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 5 - +o Can't open pflexname file `_f_i_l_e_n_a_m_e' [[[[ffffaaaattttaaaallll ... check permissions]]]] +o unable to write `_f_i_l_e_n_a_m_e' to update pflexnames [[[[wwwwaaaarrrrnnnniiiinnnngggg ... this compilation will complete, but no history can be written (a rare message; you'll get this if your filesystem is damaged or full)]]]] 2.4 _I_n_s_i_d_e__c_p_p_f_l_e_x _c_p_p_f_l_e_x intercedes between the _C preprocessor and the _C compiler and performs substitutions of short symbols (eight characters) for long symbols (eight or more characters). The preprocessor gives _c_p_p_f_l_e_x a symbol. _c_p_p_f_l_e_x gives back a symbol, and the preprocessor passes this (possibly transformed) symbol to the compiler. _c_p_p_f_l_e_x uses a combination of transformation history and symbol-making rules. 2.4.1 _S_h_o_r_t__N_a_m_e_s_. If the preprocessor passes _c_p_p_f_l_e_x a symbol of seven or fewer characters, then that same symbol is returned without change. Since all such short names are presumed to be unique already, it is not necessary to keep track of them. 2.4.2 _L_o_n_g__N_a_m_e_s_. Symbols with eight or more characters are considered long. The first attempted transformation is to simply use the initial eight characters as the short name. A table of transformations is searched. If that eight-character prefix has already been used for some other long symbol, it cannot be used for this symbol. A name is generated by using a fixed three-character prefix and appending a unique five-digit number to it. These resulting symbols are intended to be unusual and not collide with actual symbols in the source code.2 The transformation is __________ 2. It is natural to wonder how the various scope levels for variable names are handled. In fact, they are simply ignored. If duplicate variable names were used in a syntactically correct manner in the flexname source code, then consistently applied transformations will _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 6 - added to the table (both the long name and the transformed short name are recorded). 2.4.3 _E_x_c_e_p_t_i_o_n_s_. A table of exceptions (kept in file ////lllliiiibbbb////ppppfffflllleeeexxxxcccceeeeppppttttiiiioooonnnnssss) lists symbols which can only be transformed into their own eight-character initial string. These symbols are from two classes: the globals from the libraries provided with the _U_N_I_Xppppcccc, and the few eight- character reserved symbols in the _C language (ccccoooonnnnttttiiiinnnnuuuueeee, eeeexxxxtttteeeerrrrnnnnaaaallll,3 rrrreeeeggggiiiisssstttteeeerrrr, uuuunnnnssssiiiiggggnnnneeeedddd, and vvvvoooollllaaaattttiiiilllleeee). Since there is no reasonable way to change an arbitrary reference to these symbols, they must remain consistent throughout all software on the machine. For example, the symbol llllooooccccaaaallllttttiiiimmmmeeee must always be transformed into llllooooccccaaaallllttttiiiimmmm, since that is the reference in the symbol table in lllliiiibbbbcccc....aaaa. (Such library symbols with seven or fewer characters are handled appropriately by the _c_p_p_f_l_e_x methodology explained above.) It is possible that some symbol has been inadvertently omited from the list, or a developer may have his/her own widely-used local library. (The symptom is likely to be that some global symbol from the application will not be resolved during lllldddd.) Additional entries may be added to the exceptions list (but see the section ``Performance Factors'' below). I would like to hear about any missing symbols from the standard _U_N_I_Xppppcccc libraries. 2.4.4 _H_i_s_t_o_r_y__M_e_c_h_a_n_i_s_m_. More often than not, source code packages consist of more than a single compilable source file. Indeed, a package can span several directories. Since _c_p_p_f_l_e_x transformations would usually give global symbols different symbol table definitions in resulting ____________________________________________________________ still yield a correct program that also compiles correctly on the _U_N_I_Xppppcccc. 3. Although "_e_x_t_e_r_n_a_l" is not reserved and "_e_x_t_e_r_n" is, "_e_x_t_e_r_n" is handled properly because it is only six characters. The word "_e_x_t_e_r_n_a_l" is listed in the _U_N_I_Xppppcccc documentation as reserved and is, therefore, included in the exceptions list. The cost of a few extra entries in the exceptions list in marginal. _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 7 - object files, the transformations must be forced to be done consistently from file to file. (Obviously, this doesn't matter for unrelated object modules.) At the conclusion of the _C preprocessor pass, _c_p_p_f_l_e_x appends its table of transformations onto a file for future reference. The actual file used (``....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'') is described above in the ``Operation'' section. 2.4.5 _P_e_r_f_o_r_m_a_n_c_e__F_a_c_t_o_r_s_. The exception and history files are not read until a long symbol transformation is needed. Therefore, if all symbols in a source file are seven or fewer characters, essentially no overhead is incurred via _c_p_p_f_l_e_x. When the first long-name transformation is needed, the exceptions file is read, and then all history files are read. An in-core table of exceptions4 and prior transformations is built as a binary tree of structures searchable on either the long name or the short name. One could avoid ever getting the ``no writable pflexnames file ...'' message by touching a file named ``////....ppppfffflllleeeexxxxnnnnaaaammmmeeeessss'' which would always be found in the search toward the root directory. Since all new transformations are appended to the first discovered writable pflexnames file, most would end up in this file in the root directory. Most such transformations would be irrelevant to any particular compilation, but the (possibly quite lengthy) file would have to be read anyhow. For this reason, a search from the current directory toward root is used instead, so that the read history can be limited to reasonably related files. __________ 4. The entries in the exceptions file are treated as prior transformations. They have been intentionally randomized to avoid severe skewing of the binary tree. Do not make the mistake of sorting that file, since these will be the first entries in the tree and will be inserted in the order listed. _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 8 - 3. _R_e_l_a_t_e_d__S_o_f_t_w_a_r_e The development of _c_p_p_f_l_e_x was motivated by the lack of support for flexnames in the _C compiler on the _U_N_I_Xppppcccc. The particular approach taken was a result of the fact that neither the preprocessor (ccccpppppppp), the assembler (aaaassss), nor the loader (lllldddd) support them either. The method of variable name transformation, along with the history mechanism, allows the standard versions of programs other than the preprocessor to run without modification. (Occasionally, the loader might make a comment about some symbol for which a short name has been fabricated. This may require a peek into the history file, but usually something obvious will be wrong [i.e., an incorrect cccccccc command line].) In fact, it is not even required that these programs be invoked via cccccccc. Consistency is maintained by the methodology, which localizes the transformations to the preprocessor. The symbol tables in the object files (both relocatables and executables) will contain entries which indicate the transformed names. Any program which manipulates those entries may report variable names which are misleading. For example, ssssddddbbbb (the source-level debugging tool) will only know about the transformed variable names. Use of ssssddddbbbb in conjunction with source files (the usual case) will sometimes be awkward because of this. Correct cross- references between the long and short names can be obtained from the history files, although the practice of using the first eight characters when possible should minimize the need for this. Object files on the _U_N_I_Xppppcccc are written in the Common Object File Format (COFF), which allows for arbitrarily long symbols. It would be straight-forward to write a companion program to _c_p_p_f_l_e_x which would follow lllldddd and ``untransform'' the executable file so that symbols would match the source code. ssssddddbbbb seems to understand flexnames, and would be somewhat easier to use. On the other hand, lllldddd does not understand the flexname symbol table entries. It was, in fact, this restriction in lllldddd which obviated the writing of that companion program and necessitated the use of history files. (If lllldddd understood flexnames, it would seem smart to ``untransform'' the relocatable object files immediately after aaaassss. In that case, global symbols would always agree with the source code. But, alas, lllldddd does not cooperate.) The _C cross-reference utility, ccccxxxxrrrreeeeffff, is actually a separate, modified copy of ccccpppppppp. _c_p_p_f_l_e_x does not do _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 9 - anything to ccccxxxxrrrreeeeffff, so it still only considers the first eight characters to be significant. This can be either good or bad, depending on how you use ccccxxxxrrrreeeeffff. 4. _A_v_a_i_l_a_b_i_l_i_t_y__a_n_d__S_u_p_p_o_r_t _c_p_p_f_l_e_x is an installable package. The _c_p_p_f_l_e_x package is available from the author via electronic mail. Since it is based, in part, on UNIX source code, it will be distributed only within AT&T. _c_p_p_f_l_e_x is also being submitted to _T_H_E _S_T_O_R_E! for possible distribution. Since their distribution is automated, it is better to get it from there than from me. The package is complete to the point of serving my original needs. Further support, therefore, cannot be offered. Of course, I am interested in hearing about bugs or problems. 5. _A_c_k_n_o_w_l_e_d_g_e_m_e_n_t It is probably obvious that the _C preprocessor is not really replaced. Rather, it has been given added functionality. Large portions of the _c_p_p_f_l_e_x ccccpppppppp are a direct steal from the UNIX SVR2 ccccpppppppp. HO-52462-WJC-wjc William J. Carpenter Att. ccccppppppppfffflllleeeexxxx((((1111)))) mmmmaaaannnn page Copy (with att.) to J. H. Carey HO 1L-419 T. S. Chen HO 1L-410 B. R. Fowler HO 1K-419 L. A. O'Neill HO 1M-411 S. Pardee WH 3B-316 J. S. Striegel HO 1M-404 All Members, Design Libraries Development Group, Dept 52462 CCCCoooonnnnttttiiiinnnnuuuueeeedddd nnnneeeexxxxtttt ppppaaaaggggeeee _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 - 10 - CCCCooooppppyyyy ((((wwwwiiiitttthhhh aaaatttttttt....)))) ttttoooo ---- ccccoooonnnnttttdddd.... Barry Brooks MT 3G-332 ) Jonathon Clark MT 3G-317 ) E. V. Courte FJ 1H-103 ) ATT-IS J. A. Kutsch MT 3P-344 ) All Supervision, Department 624-01311 ) Copy (cover sheet only) to All Supervision, Center 5246 All Members, Center 5246 _A_T_&_T _B_E_L_L _L_A_B_O_R_A_T_O_R_I_E_S _- _P_R_O_P_R_I_E_T_A_R_Y Use pursuant to G.E.I. 2.2 0707070000020035501006660001460001440000010232630367336441200001300000000000TRAILER!!!ly long symbols. It would be straight-forward to write a companion program to _c_p_p_f_l_e_x which would follow lllldddd and ``untransform'' the executable file so that symbols would match the source code. ssssddddbbbb seems to understand flexnames, and would be somewhat easier to use. On the other hand, lllldddd does not understand the flexname symbol table entries. It was, in fact, this restriction in lllldddd which obviated the writing of that companion program and necessitated the use of history files. (If lllldddd understood flexnames, it would seem smart to ``untransform'' the relocatable object files immediately after aaaassss. In that case, global symbols would always agree with the source code. But, alas, lllldddd does not cooperate.) The _C cross-reference utility, ccccxxxxrrrreeeeffff, is actually a separate, modified copy of ccccpppppppp. _c_p_