home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFV12J / COUNTER.RX0 < prev    next >
Text File  |  1997-07-26  |  20KB  |  687 lines

  1. /* This is a server-side-include  "counter display" for SRE-Filter.
  2.   See COUNTER.DOC for details on installation and use.
  3.  
  4.   Calling syntax:
  5.    1) as a server side include:
  6.          <!-- INTERPRET FILE COUNTER.RXX file=afile opt1=val1 opt2=.. , 0 -->
  7.       where opt1=var1, etc. are additional options
  8.       and where a , 1 signals "read, but do not augment, the counter"
  9.  
  10.    2) or, from a procedure (such as SENDFILE built in procedure)
  11.        ctval=counter.rxx(optlist,noaugment,usedfile,sel,isent,ilen)
  12.  
  13.   3) or as an in-line image
  14.      The graphic="YES" is required, the SEL="a_selector" is highly recommended.
  15.  
  16.   4) or as a series of digits  (several gif files)
  17.        i.e; <!-- INTERPRET FILE COUNTER.RXX FILE=afile IMGTYPE=FLAME -->
  18.  
  19.  
  20. Note: if a 5th argument is detected, then this is being called as a
  21.       "server side program" (typically, as <Img src="counter.rxx?option_list">
  22.  
  23. */
  24.  
  25. /* ---- BEGIN USER CONFIGURABLE PARAMETERS SECTION ----------  */
  26. /*BEGIN  ---  (this line is used by the EDITSREF.CMD SRE-Filter utility)*/
  27.  
  28. /* where to store .cnt files. 
  29.   0 means "use documents own directory"
  30.   Otherwise: Be Sure To Use Single Quotes Around The Name 
  31.              i.e; counter_dir='D:\GOSERVE'
  32.  */
  33. counter_dir=0
  34.  
  35. /* Set directory (relative to the GoServe data directory)
  36.   that contains the "digit images".
  37.   More precisely: the counter_image_dir should be set to a "URL"
  38.   that points to the root of the image directories.  
  39.   Each of the various sets of digit-gifs should
  40.   be in it's own sub directory (under the counter_image_dir).
  41.   To suppress-- set to 0  
  42.   Otherwise: Be Sure To Use Single Quotes Around The Name 
  43.             i.e; counter_image_dir='/DIGITS'
  44. */
  45. counter_image_dir ='/digits'  
  46.  
  47. /* 1=create a .cnt file if none exists, 0=do not
  48.    if the counter file (passed to counter.rxx) does not exist,
  49.    and create_file=0, counter.rxx will exit without doing anything*/
  50. create_file=1
  51.  
  52. /* 1 = do NOT allow line breaks in strings of  "graphical digits". 
  53.    0 = Allow line breaks within the string of "graphical digits"
  54.      Note: if =1, the <NOBR>  element is used -- but note that webex 
  55.             and other html 2.0  browsers ignore <NOBR>.*/
  56. digits_nobr=1
  57.  
  58. /* store info on each request. 0=no, 1=yes. Can be overridden
  59.    by a LOGUSERS option */
  60. write_users=0
  61.  
  62. /* 1 = Supress the "log users" option (a logusers option will override write_users)
  63.    0= do not suppress  */
  64. suppress_logusers=0
  65.  
  66.  
  67. /* suppress inrementing if request is from a same client with
  68.    suppress_recent minutes. If 0, or if write_users=0, this is ignored */
  69. suppress_recent=0
  70.  
  71. /* suppress incrementing if request is fron an OWNER 
  72.   1=yes, 0=no */
  73. suppress_owners=1             
  74.  
  75. /* record using the common-log format  
  76.   1=use common log format, 0 = use the save_xxx parameters below */
  77. common_log_format=1   
  78.  
  79. /* Note: the various SAVE_ parameters are used only if write_users=1 
  80.   and common_log_format=0 
  81.   -------------------------
  82.   1=save ip name, 0=do not save ip name     */
  83. save_ipname=1  
  84.  
  85. /* 1=save username (if avaialble),0=do not   */
  86. save_username=1        
  87.  
  88. /* 1= save time (10:01:33), 0= do not        */
  89. save_time=1             
  90.  
  91. /* 1=Save date (10 Feb 1996), 0=do not       */
  92. save_date=1             
  93.  
  94. /* 1=save "request selector",0=do not          */
  95. save_docname=1          
  96.  
  97. /* 1=save "referer", 0=do not                */
  98. save_referer=1          
  99.  
  100. /* 1= save the "user-agent", 0=do not         */
  101. save_browser=1          
  102.  
  103. /* 1 = save # of bytes sent & file size (or approximations thereof */
  104. save_bytes = 1          
  105.  
  106.  
  107. /*END  ---  (this line is used by the EDITSREF.CMD utility)*/
  108.  
  109. /* note that client's IP address, and "julian" time are always saved */
  110.  
  111. /* END of user-configurable parameters ***********************************/
  112.  
  113. if counter_dir=' ' then counter_dir=0
  114.  
  115. sspcall=0
  116.  
  117. if write_users<>1 then suppress_recent=0
  118. if datatype(suppress_recent)<>'NUM' then suppress_recent=0
  119.  
  120.  
  121. parse upper arg optlist , noaugment,usedfile2,docname2,bsent,bsize,isfail
  122. theverb=bsent
  123.  
  124. if upper(theverb)="GET" | upper(theverb)="POST" then do
  125.   sspcall=1
  126.   noaugment=0 ; usedfile2=' '; docname2=' '
  127.   parse arg  ddir, tempfile, reqstrg,optlist,verb ,uri,user, ,
  128.           basedir ,workdir,privset,enmadd,transaction,verbose, ,
  129.          servername,host_nickname,homedir
  130.   docname=uri
  131.   usedfile=translate(ddir,'\','/')
  132. end
  133.  
  134.  
  135. optlist=translate(optlist,' ','+&')
  136.  
  137. if usedfile2<>' ' then usedfile=usedfile2
  138. if docname2<>' ' then docname=docname2
  139.  
  140. if counter_dir=0 then do
  141.    t1=filespec('d',usedfile)
  142.    t2=filespec('p',usedfile)
  143.    counter_dir=t1||t2
  144. end
  145. counter_dir=strip(counter_dir,'t','\')||'\'
  146.  
  147. if sspcall=0 then do
  148.   t3=filespec('n',usedfile)
  149.   foo=lastpos('.',t3)
  150.   if foo=0 then
  151.     cfile=t3
  152.   else
  153.     cfile=delstr(t3,foo)
  154. end
  155. else do
  156.   cfile='DEFAULT'
  157. end
  158.  
  159. cfile=counter_dir||cfile
  160. issilent=0 ; nocommas=0; maxval=21740000 ; ndigits=0 ; minval=0
  161. rollover=0 ; doith=0 ; incit=1 ; dographic=0 ; writesel=' ' ; duration=0
  162. align_type=0 ; suppress_logusers=0
  163. do until optlist=""
  164.   parse var optlist anarg optlist
  165.  
  166.   if pos('=',anarg)=0 then do
  167.       avar='FILE' ; aval=strip(upper(anarg)) 
  168.   end
  169.   else do
  170.      parse var anarg avar '=' aval ;                             
  171.      avar=strip(upper(avar)); aval=strip(strip(aval),,'"')       
  172.   end
  173.  
  174.   select
  175.      when avar="FILE" then do
  176.           foo=lastpos('.',aval) ;
  177.           if foo=0 then
  178.              cfile=counter_dir||aval
  179.           else
  180.              cfile=counter_dir||delstr(aval,foo)
  181.      end
  182.      when avar="SILENT" then issilent=1
  183.      when avar="NOCOMMAS" then nocommas=1
  184.      when avar="MAX" then
  185.         if datatype(aval)='NUM' then maxval=aval
  186.      when avar="WIDTH" then
  187.         if datatype(aval)='NUM' then ndigits=aval
  188.      when avar="MIN" then
  189.         if datatype(aval)='NUM' then minval=aval
  190.      when avar="ROLLOVER" then rollover=1
  191.      when avar="DURATION" then do
  192.         if datatype(aval)='NUM' then duration=aval
  193.      end
  194.      when avar="ITH" then  doith=1
  195.      when avar="SEL" then writesel=strip(aval)
  196.      when avar="IMGALIGN" then align_type=strip(aval)
  197.  
  198.      when avar="LOGUSERS" & suppress_logusers<>1 then do
  199.          select
  200.            when wordpos(upper(aval),'Y YES 1')>0 then write_users = 1
  201.            when wordpos(upper(aval),'N NO 0')>0 then write_users = 0
  202.            otherwise nop
  203.          end
  204.      end
  205.  
  206.  
  207.      when abbrev(avar,"GRAPHIC")=1 then do
  208.         select
  209.           when wordpos(upper(aval),'N NO 0')>0 then dographic=0
  210.           when abbrev(upper(aval),'NORMAL')=1 then dographic=1
  211.           when abbrev(upper(aval),'NOTINV')=1 then dographic=1
  212.           otherwise     dographic=2
  213.         end
  214.      end
  215.  
  216.  /* Checkfor IMGTYPE option and append  passed name to counter_image_dir */
  217.      when abbrev(avar,"IMGTYPE")=1 then do
  218.         if counter_image_dir<>0 then  do
  219.            counter_image_dir = strip(counter_image_dir,'t','/')||'/'||strip(aval,,'/')
  220.            dographic=9 
  221.         end
  222.      end
  223.  
  224.      when avar="INCREMENT" then do
  225.         if datatype(aval)="NUM" then incit=aval
  226.      end
  227.      otherwise nop
  228.    end
  229. end
  230.  
  231. if dographic>0 then do
  232.    nocommas=0 ;
  233.    doith=0 ;
  234. end
  235.  
  236. if  ndigits>0 then nocommas=1
  237.  
  238. if pos('.',cfile)=0 then cfile=cfile||'.cnt'
  239.  
  240. /* if create_file=1, then check for existence of cfile, and create
  241. if missing */
  242. if create_file=1 then do
  243.   if stream(cfile,'c','query exists')=' ' then do
  244.      foo=charout(cfile,'0  ',1)
  245.      if foo>0 then do
  246.          if verbose>1 then say " Error creating counter file: " cfile
  247.          return ' '
  248.      end
  249.      foo=stream(cfile,'c','close')
  250.   end
  251. end
  252.  
  253. /* read it in */
  254. crlf = '0d0a'x
  255. ause=sref_open_read(cfile,30,'BOTH')
  256. if ause<0 then  do                /* couldn't get it */
  257.  
  258.   if verbose>1 then say " Error opening counter file: " cfile
  259.   return ' '
  260. end
  261.  
  262. lily=chars(cfile)
  263. ause=strip(charin(cfile,1,lily),'t','1a'x)
  264.  
  265. /* got a file, let's parse it */
  266. filelins.0=0
  267. iz=0
  268. do until ause=""
  269.       parse  var ause eeo (crlf) ause
  270.      iz=iz+1
  271.      filelins.iz=strip(eeo)
  272. end
  273. if iz=0 then do
  274.    iz=1
  275.    filelins.1=0
  276. end
  277. filelins.0=iz
  278. opstat=iz
  279.  
  280.  
  281. /* find count */
  282. ctval=0
  283. do ip=1 to opstat
  284.   aline0=translate(filelins.ip,' ','00090d0a'x)
  285.   select
  286.      when aline0=' ' then iterate
  287.      when  abbrev(aline0,';') then iterate
  288.      when datatype(aline0)='NUM' then do
  289.           ctval0=aline0
  290.           ctval=ctval0+INCIT
  291.           CTVAL=Max(CTVAL,MINVAL) ;
  292.           IF ROLLOVER=1 & CTVAL>MAXVAL THEN CTVAL=MINVAL
  293.           CTVAL=Min(CTVAL,MAXVAL)
  294.    /*       filelins.ip=ctval */
  295.           ct_line=ip
  296.           leave
  297.      end
  298.      otherwise iterate
  299.    end
  300. end
  301. if ctval=0 then do
  302.      ctval=minval+incit
  303.      ctval0=ctval
  304.      itmp=filelins.0+1
  305. /*     filelins.itmp=ctval */
  306.      filelins.0=itmp
  307.      ct_line=itmp
  308. end
  309.  
  310. numeric digits 12
  311. d1=date('b')
  312. t1=time('m')/(24*60)
  313. nowtime=d1+t1
  314. anaddr=extract('clientaddr')
  315. nowrite=0
  316.  
  317.  
  318. /* no augment? */
  319. if noaugment=1 then do
  320.   nowrite=1 ; write_users=0
  321.   ctval=ctval0
  322. end
  323.  
  324. /* suppress owners? */
  325. if nowrite=0 & suppress_owners=1 then do
  326.    daport=extract('serverport')
  327.    owners=value('SREF_'||daport||'_OWNERS')
  328.    if pos(anaddr,owners)>0 then do
  329.         write_users=0 ; nowrite=1 ;ctval=ctval0 /* no write, don't check */
  330.    end
  331. end
  332.  
  333. /* if suppress_recent, check before incrementing */
  334. if suppress_recent>0 & write_users=1 then do
  335.   chktime=nowtime-(suppress_recent/(24*60))
  336.   do iy=filelins.0 to ct_line+1 by -1
  337.      aline00=filelins.iy
  338.      if aline00=' ' then iterate
  339.      if abbrev(aline00,';') then iterate
  340.      parse var aline00 anip ',' ajulian ',' .
  341.      ajulian=strip(ajulian)
  342.      if datatype(ajulian)<>"NUM" then iterate
  343.      if ajulian < chktime then leave
  344.      if strip(anip)=anaddr then do
  345.          nowrite=1 ; ctval=ctval0; leave
  346.      end
  347.   end
  348. end
  349.  
  350. if incit=0 then nowrite=1   /* increment=0 is a "no augment" signal */
  351.  
  352. filelins.ct_line=ctval          /* record "augmented?" count */
  353.  
  354. /* if "duration" is <> 0, then check entries (this is used to report
  355. "hits in last week" */
  356.  
  357. if duration>0  then do
  358.   if write_users<>1 then do
  359.       ctval="000"
  360.    end
  361.    else do
  362.      ctval=0
  363.      chkdate=trunc(1+nowtime-duration)
  364.      do iy=filelins.0 to ct_line+1 by -1
  365.          aline00=filelins.iy
  366.          if aline00=' ' then iterate
  367.          if abbrev(aline00,';') then iterate
  368.          parse var aline00 anip ',' ajulian ',' poop
  369.          ajulian=trunc(strip(ajulian))
  370.          if datatype(ajulian)<>"NUM" then iterate
  371.          if ajulian < chkdate then leave
  372.          ctval=ctval+1
  373.       end
  374.   end   /* write_users */
  375. end  /* duration>0 */
  376.  
  377. aline=anaddr||', '||nowtime
  378. noss=0
  379. if write_users=0 then noss=1
  380.  
  381. /* write out an entry */
  382. IF nowrite=0 & write_users=1  & common_log_format=1 then do
  383.   itmp=filelins.0+1
  384.   if writesel<> ' ' then
  385.       thereq=writesel
  386.   else
  387.      thereq=docname
  388.  
  389. /* fake routine starts here --------------------- */
  390. thereq='/'||strip(thereq,'l','/')
  391.  
  392. mkme=extract('clientmethod')
  393.  
  394.  d1=space(strip(date('n'))); d1=translate(d1,'/',' ')
  395.  t1=time('n')
  396.  d1t1=d1||':'||t1
  397.  
  398.  agmt=gmtoffset()
  399.  if datatype(agmt)='NUM' then do
  400.          agmt=agmt/36
  401.          if abs(agmt)<1000 then do
  402.              if agmt>0 then
  403.                  agmt='0'||agmt
  404.              else
  405.                  agmt='-0'||abs(agmt)
  406.          end
  407.  end
  408.  d1t1=d1t1||' '||agmt
  409.  
  410.   mkme=mkme||' '||thereq
  411.   mkme=mkme||' '||extract('clientprotocol')
  412.   d1t1='['||d1t1||']'
  413.   clientname0=clientname()
  414.   record2='- '||extract('bytessent')
  415.  
  416.   username='-'
  417.   goo=reqfield('AUTHORIZATION:')
  418.   if goo<>' ' then do
  419.           parse var goo . m64 .              /* get the encoded cookie */
  420.           dec=pack64(m64)                       /* and decode it */
  421.           parse upper var dec username ':' pwd      /* split to userid and pwd*/
  422.   end
  423.  
  424.   aline2=clientname0||' - '||username||' '||d1t1||' "'||mkme||'" '||record2
  425.   noss=1
  426. /* fake routine ends here --------------- */
  427.  
  428.  
  429.  
  430.   filelins.itmp=aline||', '||aline2
  431.   filelins.0=itmp
  432. end
  433.  
  434.  itmp=filelins.0+1
  435.  
  436. /* check various conditions: username ipname time date docname referer
  437. */
  438. if noss=0 then do
  439.   if save_username=1 then do
  440.       goo=reqfield('AUTHORIZATION:')
  441.       if goo=' ' then do
  442.           username=' '
  443.       end
  444.       else do
  445.           parse var goo . m64 .              /* get the encoded cookie */
  446.           dec=pack64(m64)                       /* and decode it */
  447.           parse upper var dec username ':' pwd      /* split to userid and pwd*/
  448.       end
  449.       aline=aline||', '||strip(username)
  450.   end
  451.  
  452.   if save_ipname=1 then do
  453.         aline=aline||', '||clientname()
  454.   end
  455.   if save_time=1 then do
  456.          aline=aline||', '||time('n')
  457.   end
  458.   if save_date=1 then do
  459.         aline=aline||', '||date('n')
  460.   end
  461.   if save_docname=1 then do
  462.      if writesel<>' ' then
  463.         aline=aline||', '||writesel
  464.      else
  465.         aline=aline||', '||docname
  466.   end
  467.  
  468.   if save_bytes=1 then do
  469.       if bsent="" then bsent=extract('bytessent')
  470.       if bsize="" then do
  471.          bsize=0
  472.          if  usedfile2 <>  " " then
  473.               bsize=dosdir(usedfile2,'S')
  474.       end
  475.       aline=aline||', '||bsent' 'bsize
  476.   end
  477.  
  478.   if save_referer=1 then do
  479.         aline=aline||', '||reqfield('referer')
  480.   end
  481.   if save_browser=1 then do
  482.         aline=aline||', '||reqfield('user-agent')
  483.   end
  484.   filelins.itmp=aline
  485.   filelins.0=itmp
  486. end
  487.  
  488. /* write out stuff */
  489. if nowrite=0 | isfail=1 then do
  490.   stuff=filelins.1
  491.   do mm=2 to filelins.0
  492.      stuff=stuff||crlf||filelins.mm
  493.   end
  494.   stuff=stuff||'             '
  495.   wow=charout(cfile,stuff,1)
  496.   if wow>0 & verbose>0 then say " Warning: problem writing .CNT file: " wow
  497. end
  498. foo=stream(cfile,'c','close')
  499.  
  500. if issilent=1 then return ' '   /* just record, do not display */
  501.  
  502.  
  503. /* format ctval */
  504. ctval=strip(ctval)
  505. ctlen=length(ctval)
  506.  
  507.  
  508. if ndigits>0 then do
  509.     if ctlen<ndigits then do
  510.         ctval=copies('0',ndigits-ctlen)||ctval
  511.     end
  512. end
  513.  
  514.  
  515. if nocommas=0 then do
  516.   il=length(ctval)
  517.   if il>3 then do
  518.       oop=""
  519.       do mm=il to 3 by -3
  520.          tt=substr(ctval,mm-2,3)
  521.          if mm=il then
  522.             oop=tt
  523.          else
  524.             oop=tt||','||oop
  525.       end /* do */
  526.       if mm<>0 then oop=substr(ctval,1,mm)||','||oop
  527.       ctval=oop
  528.   end
  529. end
  530.  
  531.  
  532. if doith=1 then do
  533.   lval2=right(strip(ctval),2)
  534.   if lval2>10 & lval2<20 then
  535.         ctval=ctval||'th'
  536.   else do
  537.      lval=right(strip(ctval),1)
  538.      select
  539.        when lval=0 then  ctval=ctval||'th'
  540.        when lval=1 then ctval=ctval||'st'
  541.        when lval=2 then ctval=ctval||'nd'
  542.        when lval=3 then ctval=ctval||'rd'
  543.        otherwise ctval=ctval||'th'
  544.      end
  545.   end
  546. end
  547.  
  548.  
  549. if dographic=0 then return ctval
  550.  
  551.  
  552. /*  Ship image tags to the browser ?    */
  553. if dographic=9 then do
  554.    minlen = 5
  555.    totalreads = ctval
  556.    len = Length(totalreads)
  557.    if ndigits > 0 then minlen = ndigits
  558.    if len < minLen Then len = minlen
  559.    formattedcount = right(totalreads, len, '0')
  560.    todo=''
  561.    if digits_nobr=1 then todo='<NOBR>'
  562.    do x = 1 to len
  563.       digit = substr(formattedCount,x,1)
  564.       if datatype(digit)='NUM' then do
  565.         if wordpos(upper(align_type),"TOP BOTTOM MIDDLE")=0 then align_type='MIDDLE'
  566.         todo=todo||'<img src="'counter_image_dir'/'digit'.gif" alt="'digit'" align="'align_type'">'
  567.       end
  568.    end
  569.    if digits_Nobr=1 then todo=todo||' </nobr>'
  570.    return todo
  571. end
  572.  
  573. /* return as an xbm file (using d meyer's xcount code)? */
  574.  
  575. bytes = '';
  576. bytecount = 0;
  577.  
  578. env = "OS2ENVIRONMENT"
  579. minLen = 7;           /* minimum number of digits in bitmap */
  580. if ndigits>0 then minlen=ndigits
  581. isHigh = 1;           /* if 1, digits are 16 pixels high, to allow room for border */
  582. isInverse = 1;        /* if 1, digits are white on black */
  583. if dographic=1 then isinverse=0
  584.  
  585.    /* bitmap for each digit
  586.       Each digit is 8 pixels wide, 10 high
  587.       invdigits.x are white on black, digits.x black on white */
  588.    invdigits.0 = "c3 99 99 99 99 99 99 99 99 c3";   /* 0 */
  589.    invdigits.1 = "cf c7 cf cf cf cf cf cf cf c7";   /* 1 */
  590.    invdigits.2 = "c3 99 9f 9f cf e7 f3 f9 f9 81";   /* 2 */
  591.    invdigits.3 = "c3 99 9f 9f c7 9f 9f 9f 99 c3";   /* 3 */
  592.    invdigits.4 = "cf cf c7 c7 cb cb cd 81 cf 87";   /* 4 */
  593.    invdigits.5 = "81 f9 f9 f9 c1 9f 9f 9f 99 c3";   /* 5 */
  594.    invdigits.6 = "c7 f3 f9 f9 c1 99 99 99 99 c3";   /* 6 */
  595.    invdigits.7 = "81 99 9f 9f cf cf e7 e7 f3 f3";   /* 7 */
  596.    invdigits.8 = "c3 99 99 99 c3 99 99 99 99 c3";   /* 8 */
  597.    invdigits.9 = "c3 99 99 99 99 83 9f 9f cf e3";   /* 9 */
  598.  
  599.  
  600.       digits.0 = "3c 66 66 66 66 66 66 66 66 3c";   /* 0 */
  601.       digits.1 = "30 38 30 30 30 30 30 30 30 30";   /* 1 */
  602.       digits.2 = "3c 66 60 60 30 18 0c 06 06 7e";   /* 2 */
  603.       digits.3 = "3c 66 60 60 38 60 60 60 66 3c";   /* 3 */
  604.       digits.4 = "30 30 38 38 34 34 32 7e 30 78";   /* 4 */
  605.       digits.5 = "7e 06 06 06 3e 60 60 60 66 3c";   /* 5 */
  606.       digits.6 = "38 0c 06 06 3e 66 66 66 66 3c";   /* 6 */
  607.       digits.7 = "7e 66 60 60 30 30 18 18 0c 0c";   /* 7 */
  608.       digits.8 = "3c 66 66 66 3c 66 66 66 66 3c";   /* 8 */
  609.       digits.9 = "3c 66 66 66 66 7c 60 60 30 1c";   /* 9 */
  610.  
  611. totalreads = ctval
  612. bytecount=0
  613. /* now generate the Bitmap
  614.                     minLen contains minimum number of digits to display
  615.                     isHigh is one for 16 bit high numbers (else 10)
  616.                     isInverse is one for reverse video (white on black) */
  617. /* Stuff 0 to length of counter */
  618. len = Length(totalreads);
  619. crlf = '0a'x            /* image/x-xbitmap format depends on only having a LF char... */
  620. if len < minLen Then len = minlen;
  621.   formattedcount = right(totalreads, len, '0');
  622.  
  623. if isHigh then do
  624.    do i = 0 to len * 3 - 1
  625.       if isInverse then
  626.          bytes = bytes"0xff";       /* add three blank rows to each digit */
  627.       else
  628.          bytes = bytes"0x00";
  629.       bytecount = bytecount + 1;
  630.       if bytecount//len <> 0
  631.       then bytes=bytes','
  632.       else bytes=bytes',' || crlf
  633.    end
  634. end
  635.  
  636. /* make the digits */
  637. do y = 0 to 9
  638.    do x = 1 to len
  639.       digit = substr(formattedCount,x,1);
  640.       if isInverse then               /* $inv = 1 for inverted text */
  641.          byte = substr(invdigits.digit, y*3+1,2);
  642.        else
  643.          byte = substr(digits.digit,y*3+1,2);
  644.          bytes = bytes'0x'byte;
  645.       bytecount = bytecount + 1;
  646.       if bytecount//len <> 0
  647.       then bytes=bytes','
  648.       else bytes=bytes',' || crlf
  649.    end
  650. end
  651. if isHigh then do
  652.    do i = 0 to len*3 - 1
  653.       if isInverse then
  654.          bytes = bytes"0xff";       /* add three blank rows to each digit */
  655.       else
  656.          bytes = bytes"0x00";
  657.       bytecount = bytecount + 1;
  658.       if bytecount//len <> 0
  659.       then bytes=bytes','
  660.       else bytes=bytes',' || crlf
  661.    end
  662. end
  663. out_text = "#define count_width "len*8 || crlf
  664. if isHigh then
  665.    out_text = out_text || "#define count_height 16" || crlf
  666. else
  667.    out_text = out_text || "#define count_height 10" || crlf
  668. out_text = out_text || "static char count_bits[] = {" || crlf
  669. out_text = out_text || reverse(substr(reverse(bytes), (2 + length(crlf))))'};' || crlf
  670. 'HEADER NOAUTO'
  671. 'RESPONSE HTTP/1.0 200 OK '     /* Set HTTP response line */
  672. aserv=server()
  673. 'header add Server: ' ||aserv
  674. adate=sref_new_gmt()||'|| GMT '
  675. 'header add Date: '|| adate
  676. 'header add Content-Type: image/x-xbitmap '
  677. llen = Chars(tempfile)
  678. 'header add Content-Length: '||llen
  679. 'header add Content-Transfer-Encoding: binary '
  680. 'header add Expires: ' ||adate
  681.  
  682. /*wow=dosrename(tempfile,'g:\goserv\temp\me.xbm')*/
  683. 'VAR TYPE image/x-xbitmap name out_text '
  684.  
  685. return 'COUNTER: X-BITMAP sent ' length(out_Text)
  686.  
  687.