Annotation of 43BSD/contrib/X/xfax/xfax.clu, revision 1.1

1.1     ! root        1: powers = sequence[int]$[2 ** 1 - 1,
        !             2:                        2 ** 2 - 1,
        !             3:                        2 ** 3 - 1,
        !             4:                        2 ** 4 - 1,
        !             5:                        2 ** 5 - 1,
        !             6:                        2 ** 6 - 1,
        !             7:                        2 ** 7 - 1]
        !             8: 
        !             9: state = oneof[_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10: null]
        !            10: 
        !            11: s0 = state$make__0(nil)
        !            12: s1 = state$make__1(nil)
        !            13: s2 = state$make__2(nil)
        !            14: s3 = state$make__3(nil)
        !            15: s4 = state$make__4(nil)
        !            16: s5 = state$make__5(nil)
        !            17: s6 = state$make__6(nil)
        !            18: s7 = state$make__7(nil)
        !            19: s8 = state$make__8(nil)
        !            20: s9 = state$make__9(nil)
        !            21: s10 = state$make__10(nil)
        !            22: 
        !            23: as = array[state]
        !            24: ab = array[_bytevec]
        !            25: qs = sequence[string]
        !            26: 
        !            27: start_up = proc ()
        !            28:     prog: string := _get_xjname()
        !            29:     args: qs := get_argv()
        !            30:     cbdr: string := x_default(prog, "Border")
        !            31:        except when not_found: cbdr := "" end
        !            32:     cfore: string := x_default(prog, "Foreground")
        !            33:        except when not_found: cfore := "" end
        !            34:     cback: string := x_default(prog, "Background")
        !            35:        except when not_found: cback := "" end
        !            36:     cmous: string := x_default(prog, "Mouse")
        !            37:        except when not_found: cmous := "" end
        !            38:     spec: string := ""
        !            39:     fax: string := ""
        !            40:     host: string := ""
        !            41:     for opt: string in qs$elements(args) do
        !            42:        if string$indexs("-bd=", opt) = 1
        !            43:           then cbdr := string$rest(opt, 5)
        !            44:         elseif string$indexs("-fg=", opt) = 1
        !            45:           then cfore := string$rest(opt, 5)
        !            46:         elseif string$indexs("-bg=", opt) = 1
        !            47:           then cback := string$rest(opt, 5)
        !            48:         elseif string$indexs("-ms=", opt) = 1
        !            49:           then cmous := string$rest(opt, 5)
        !            50:         elseif opt[1] = '='
        !            51:           then spec := opt
        !            52:         elseif string$indexc(':', opt) ~= 0
        !            53:           then host := opt
        !            54:         else fax := opt end
        !            55:        end
        !            56:     if string$empty(fax)
        !            57:        then _chan$puts(_chan$error_output(),
        !            58:                       "usage: xfax [options] [=<geometry>] [host:vs] file\r\n",
        !            59:                       false)
        !            60:            _chan$puts(_chan$error_output(),
        !            61:                       "options: -fg=<color> -bg=<color> -bd=<color> -ms=<color>\r\n",
        !            62:                       false)
        !            63:            return
        !            64:        end
        !            65:     if string$indexc('.', fax) = 0  cand  string$indexc('/', fax) = 0
        !            66:        then fax := fax || ".fax" end
        !            67:     fn: file_name := file_name$parse(fax)
        !            68:     if ~file_exists(fn)
        !            69:        then _chan$puts(_chan$error_output(), "file not found\r\n", false)
        !            70:            return
        !            71:        end
        !            72:     x_display$init(host)
        !            73:        except when error (why: string):
        !            74:                   _chan$puts(_chan$error_output(), why || "\r\n", false)
        !            75:                   return
        !            76:              end
        !            77:     bwidth: int := int$parse(x_default(prog, "BorderWidth"))
        !            78:        except when not_found, overflow, bad_format: bwidth := 2 end
        !            79:     forep: int := BlackPixel
        !            80:     backp: int := WhitePixel
        !            81:     mousep: int := BlackPixel
        !            82:     back: x_pixmap := x_display$white()
        !            83:     bdr: x_pixmap := x_display$black()
        !            84:     if x_display$cells() > 2
        !            85:        then if ~string$empty(cbdr)
        !            86:               then r, g, b: int := x_parse_color(cbdr)
        !            87:                    bdr := x_pixmap$tile(x_display$alloc_color(r, g, b))
        !            88:               end
        !            89:            if ~string$empty(cfore)
        !            90:               then r, g, b: int := x_parse_color(cfore)
        !            91:                    forep := x_display$alloc_color(r, g, b)
        !            92:                    mousep := forep
        !            93:               end
        !            94:            if ~string$empty(cback)
        !            95:               then r, g, b: int := x_parse_color(cback)
        !            96:                    backp := x_display$alloc_color(r, g, b)
        !            97:                    back := x_pixmap$tile(backp)
        !            98:               end
        !            99:            if ~string$empty(cmous)
        !           100:               then r, g, b: int := x_parse_color(cmous)
        !           101:                    mousep := x_display$alloc_color(r, g, b)
        !           102:               end
        !           103:        end
        !           104:     defspec: string := "=" || int$unparse(x_display$width() - 2 * bwidth - 2) ||
        !           105:                       "x" || int$unparse(x_display$height() - 2 * bwidth - 2) ||
        !           106:                       "+1+1"
        !           107:                        
        !           108:     w: x_window, w0, h0: int := x_cons(prog, back, bdr, spec, defspec,
        !           109:                                       40, 40, bwidth)
        !           110:     x_window$map(w)
        !           111:     w.name := fn.name
        !           112:     cr: x_cursor := x_cursor$scons(arrow_width, arrow_height,
        !           113:                                   arrow, arrow_mask,
        !           114:                                   backp, mousep,
        !           115:                                   arrow_x, arrow_y, GXcopy)
        !           116:     w.cursor := cr
        !           117:     w.input := ButtonPressed + ButtonReleased + ExposeRegion + ExposeCopy
        !           118:     x_flush()
        !           119:     lines: ab := defax(fax)
        !           120:     xidx: int := 1
        !           121:     yidx: int := 1
        !           122:     x0: int := 0
        !           123:     y0: int := 0
        !           124:     display(w, lines, xidx, yidx, 0, 0, 1726, 1726, forep, backp)
        !           125:     ev: event := x_input$empty_event()
        !           126:     while true do
        !           127:        x_input$deq(ev)
        !           128:        if ev.kind = ExposeWindow  cor  ev.kind = ExposeRegion
        !           129:           then display(w, lines, xidx, yidx, ev.x, ev.y, ev.x0, ev.y0,
        !           130:                        forep, backp)
        !           131:         elseif ev.kind = ButtonPressed
        !           132:           then x0 := ev.x
        !           133:                y0 := ev.y
        !           134:         elseif ev.kind = ButtonReleased
        !           135:           then sx, sy, wd, ht, bw, ms, wk: int, iw: x_window :=
        !           136:                    x_window$query(w)
        !           137:                x0 := int$min(int$max(xidx + ((x0 - ev.x) / 16) * 2, 1),
        !           138:                              int$max(217 - (wd / 16) * 2, 1))
        !           139:                y0 := int$min(int$max(yidx + y0 - ev.y, 1),
        !           140:                              int$max(ab$size(lines) - ht + 1, 1))
        !           141:                x: int := (xidx - x0) * 8
        !           142:                y: int := yidx - y0
        !           143:                x_window$move_area(w, 0, 0, wd, ht, x,  y)
        !           144:                if x >= 0  cand  y >= 0
        !           145:                   then display(w, lines, x0, y0, 0, 0, wd, y, forep, backp)
        !           146:                        display(w, lines, x0, y0, 0, y, x, ht, forep, backp)
        !           147:                 elseif x >= 0  cand  y < 0
        !           148:                   then display(w, lines, x0, y0, 0, 0, x, ht, forep, backp)
        !           149:                        display(w, lines, x0, y0, x, ht + y, wd, -y,
        !           150:                                forep, backp)
        !           151:                 elseif y >= 0
        !           152:                   then display(w, lines, x0, y0, 0, 0, wd, y, forep, backp)
        !           153:                        display(w, lines, x0, y0, wd + x, y, -x, ht - y,
        !           154:                                forep, backp)
        !           155:                 else display(w, lines, x0, y0, 0, ht + y, wd, -y,
        !           156:                              forep, backp)
        !           157:                      display(w, lines, x0, y0, wd + x, 0, -x, ht + y,
        !           158:                              forep, backp)
        !           159:                 end
        !           160:                xidx := x0
        !           161:                yidx := y0
        !           162:                x0 := (xidx - 1) * 8
        !           163:                y0 := yidx - 1
        !           164:                while true do
        !           165:                    x_input$mdeq(ExposeWindow + ExposeRegion + ExposeCopy, ev)
        !           166:                    if ev.kind = ExposeCopy
        !           167:                       then break end
        !           168:                    display(w, lines, xidx, yidx, ev.x, ev.y, ev.x0, ev.y0,
        !           169:                            forep, backp)
        !           170:                    end
        !           171:         end
        !           172:        end except when done: end
        !           173:     x_window$destroy(w)
        !           174:     end start_up
        !           175: 
        !           176: display = proc (w: x_window, lines: ab,
        !           177:                xidx, yidx, x, y, width, height, forep, backp: int)
        !           178:            signals (done)
        !           179:     own rast: _bytevec := _bytevec$create(2048)
        !           180:     if width <= 0  cor  height <= 0
        !           181:        then return end
        !           182:     sx, sy, wd, ht, bw, ms, wk: int, iw: x_window := x_window$query(w)
        !           183:     if ht <= 30  cor wd <= 30
        !           184:        then signal done end
        !           185:     xi: int := xidx + (x / 16) * 2
        !           186:     if xi > 216
        !           187:        then x_window$pix_set(w, backp, (217 - xidx) * 8, 0, wd, ht)
        !           188:            return
        !           189:        end
        !           190:     xj: int := xidx + (int$min(x + width, wd) / 16) * 2
        !           191:     if xj > 216
        !           192:        then x_window$pix_set(w, backp, (217 - xidx) * 8, 0, wd, ht)
        !           193:            xj := 216
        !           194:        end
        !           195:     x := (x / 16) * 16
        !           196:     cnt: int := xj - xi + 1
        !           197:     if cnt // 2 ~= 0
        !           198:        then cnt := cnt + 1
        !           199:            xj := xj + 1
        !           200:        end
        !           201:     wd := cnt * 8
        !           202:     ridx: int := 1
        !           203:     j: int := 0
        !           204:     yi: int := yidx + y
        !           205:     yj: int := yidx + int$min(y + height, ht) - 1
        !           206:     if yj > ab$size(lines)
        !           207:        then x_window$pix_set(w, backp, x, ab$size(lines) - yidx + 1,
        !           208:                             wd, ht)
        !           209:            yj := ab$size(lines)
        !           210:        end
        !           211:     ht := 2048 / cnt
        !           212:     nobit: x_bitmap := x_bitmap$none()
        !           213:     for i: int in int$from_to(yi, yj) do
        !           214:        _bytevec$move_lr(lines[i], xi, rast, ridx, cnt)
        !           215:        ridx := ridx + cnt
        !           216:        if xj = 217
        !           217:           then rast[ridx - 1] := '\000' end
        !           218:        j := j + 1
        !           219:        if j < ht  cand  i < yj
        !           220:           then continue end
        !           221:        x_window$bitmap_bitsput(w, wd, j, _cvt[_bytevec, _wordvec](rast),
        !           222:                                forep, backp, nobit,
        !           223:                                x, i - yidx - j + 1, GXcopy, -1)
        !           224:        j := 0
        !           225:        ridx := 1
        !           226:        end
        !           227:     end display
        !           228: 
        !           229: defax = proc (fs: string) returns (ab)
        !           230:     bufsiz = 76 * 256
        !           231:     states: as := as$[0: s0, s1, s2, s3]
        !           232:     c: _chan := _chan$open(file_name$parse(fs), "read", 0)
        !           233:     cbuf: _bytevec := _bytevec$create(bufsiz)
        !           234:     cbidx: int := 1
        !           235:     cbmax: int := 0
        !           236:     b: _bytevec := _bytevec$create(76)
        !           237:     lines: ab := ab$predict(1, 2300)
        !           238:     line1: _bytevec := _bytevec$create(216)
        !           239:     line2: _bytevec := _bytevec$create(216)
        !           240:     block: int := 0
        !           241:     xpos: int := 0
        !           242:     while true do
        !           243:        if cbidx > cbmax
        !           244:           then cbmax := _chan$getb(c, cbuf)
        !           245:                cbidx := 1
        !           246:           end
        !           247:        _bytevec$move_lr(cbuf, cbidx, b, 1, 76)
        !           248:        cbidx := cbidx + 76
        !           249:        if b[2] ~= '\071'
        !           250:           then continue end
        !           251:        block := block + 1
        !           252:        comp(b)
        !           253:        max: int := getn(b, 47, 10)
        !           254:        if max = 0
        !           255:           then continue end
        !           256:        max := max + 77
        !           257:        xpos := getn(b, 57, 12)
        !           258:        if block = 2
        !           259:           then xpos := 1725 end
        !           260:        n1: int := getn(b, 69, 3)
        !           261:        n1pow: int := powers[n1]
        !           262:        n1max: int := n1pow / 4
        !           263:        n0: int := getn(b, 72, 3)
        !           264:        n0pow: int := powers[n0]
        !           265:        n0max: int := n0pow / 4
        !           266:        s: state := states[getn(b, 75, 2)]
        !           267:        tagcase s
        !           268:           tag _0, _3:
        !           269:               xpos := xpos + 1
        !           270:               if xpos = 1726
        !           271:                  then xpos := 0 end
        !           272:           others:
        !           273:           end
        !           274:        pos: int := 77
        !           275:        while pos < max do
        !           276:            tagcase s
        !           277:               tag _0:
        !           278:                   first: bool := true
        !           279:                   xpos := xpos + 1
        !           280:                   while pos < max do
        !           281:                       i: int := getn(b, pos, n0)
        !           282:                       xpos := xpos + i
        !           283:                       pos := pos + n0
        !           284:                       if i = n0pow
        !           285:                          then first := false
        !           286:                               if n0 < 7
        !           287:                                  then n0 := n0 + 1
        !           288:                                       n0pow := powers[n0]
        !           289:                                       n0max := n0pow / 4
        !           290:                                  end
        !           291:                               continue
        !           292:                          end
        !           293:                       if first
        !           294:                          then if n0 = 3  cand  i <= 3
        !           295:                                  then n0 := 2
        !           296:                                       n0pow := 3
        !           297:                                       n0max := 0
        !           298:                                elseif n0 > 3  cand i <= n0max
        !           299:                                  then n0 := n0 - 1
        !           300:                                       n0pow := n0pow / 2
        !           301:                                       n0max := n0pow / 4
        !           302:                                end
        !           303:                          end
        !           304:                       break
        !           305:                       end
        !           306:                   while xpos >= 1726 do
        !           307:                       ab$addh(lines, line1)
        !           308:                       ab$addh(lines, line2)
        !           309:                       line1 := _bytevec$create(216)
        !           310:                       line2 := _bytevec$create(216)
        !           311:                       xpos := xpos - 1726
        !           312:                       end
        !           313:                   if pos >= max
        !           314:                      then if pos > max
        !           315:                              then error() end
        !           316:                           break
        !           317:                      end
        !           318:                   if getb(b, pos)
        !           319:                      then s := s4
        !           320:                      else s := s3
        !           321:                      end
        !           322:               tag _1:
        !           323:                   k: int := 0
        !           324:                   while pos < max do
        !           325:                       k := k + 1
        !           326:                       if ~getb(b, pos)
        !           327:                          then pos := pos + 1
        !           328:                               continue
        !           329:                          end
        !           330:                       break
        !           331:                       end
        !           332:                   while k > 0 do
        !           333:                       i: int := int$min(int$min(k, 32), 1726 - xpos)
        !           334:                       setn(line1, xpos, i)
        !           335:                       xpos := xpos + i
        !           336:                       k := k - i
        !           337:                       if xpos = 1726
        !           338:                          then ab$addh(lines, line1)
        !           339:                               ab$addh(lines, line2)
        !           340:                               line1 := _bytevec$create(216)
        !           341:                               line2 := _bytevec$create(216)
        !           342:                               xpos := 0
        !           343:                          end
        !           344:                       end
        !           345:                   s := s5
        !           346:               tag _2:
        !           347:                   k: int := 0
        !           348:                   while pos < max do
        !           349:                       k := k + 1
        !           350:                       if getb(b, pos)
        !           351:                          then pos := pos + 1
        !           352:                               continue
        !           353:                          end
        !           354:                       break
        !           355:                       end
        !           356:                   while k > 0 do
        !           357:                       i: int := int$min(int$min(k, 32), 1726 - xpos)
        !           358:                       setn(line2, xpos, i)
        !           359:                       xpos := xpos + i
        !           360:                       k := k - i
        !           361:                       if xpos = 1726
        !           362:                          then ab$addh(lines, line1)
        !           363:                               ab$addh(lines, line2)
        !           364:                               line1 := _bytevec$create(216)
        !           365:                               line2 := _bytevec$create(216)
        !           366:                               xpos := 0
        !           367:                          end
        !           368:                       end
        !           369:                   s := s8
        !           370:               tag _3:
        !           371:                   first: bool := true
        !           372:                   k: int := 1
        !           373:                   while pos < max do
        !           374:                       i: int := getn(b, pos, n1)
        !           375:                       k := k + i
        !           376:                       pos := pos + n1
        !           377:                       if i = n1pow
        !           378:                          then first := false
        !           379:                               if n1 < 7
        !           380:                                  then n1 := n1 + 1
        !           381:                                       n1pow := powers[n1]
        !           382:                                       n1max := n1pow / 4
        !           383:                                  end
        !           384:                               continue
        !           385:                          end
        !           386:                       if first
        !           387:                          then if n1 = 3  cand  i <= 3
        !           388:                                  then n1 := 2
        !           389:                                       n1pow := 3
        !           390:                                       n1max := 0
        !           391:                                elseif n1 > 3  cand i <= n1max
        !           392:                                  then n1 := n1 - 1
        !           393:                                       n1pow := n1pow / 2
        !           394:                                       n1max := n1pow / 4
        !           395:                                end
        !           396:                          end
        !           397:                       break
        !           398:                       end
        !           399:                   while k > 0 do
        !           400:                       i: int := int$min(int$min(k, 32), 1726 - xpos)
        !           401:                       setn(line1, xpos, i)
        !           402:                       setn(line2, xpos, i)
        !           403:                       xpos := xpos + i
        !           404:                       k := k - i
        !           405:                       if xpos = 1726
        !           406:                          then ab$addh(lines, line1)
        !           407:                               ab$addh(lines, line2)
        !           408:                               line1 := _bytevec$create(216)
        !           409:                               line2 := _bytevec$create(216)
        !           410:                               xpos := 0
        !           411:                          end
        !           412:                       end
        !           413:                   if pos >= max
        !           414:                      then if pos > max
        !           415:                              then error() end
        !           416:                           break
        !           417:                      end
        !           418:                   if getb(b, pos)
        !           419:                      then s := s4
        !           420:                      else s := s0
        !           421:                      end
        !           422:               tag _4:
        !           423:                   if getb(b, pos)
        !           424:                      then s := s2
        !           425:                      else s := s1
        !           426:                      end
        !           427:               tag _5:
        !           428:                   if getb(b, pos)
        !           429:                      then s := s7
        !           430:                      else s := s6
        !           431:                      end
        !           432:               tag _6:
        !           433:                   if getb(b, pos)
        !           434:                      then s := s2
        !           435:                      else s := s0
        !           436:                      end
        !           437:               tag _7:
        !           438:                   if getb(b, pos)
        !           439:                      then s := s3
        !           440:                      else error()
        !           441:                           break
        !           442:                      end
        !           443:               tag _8:
        !           444:                   if getb(b, pos)
        !           445:                      then s := s9
        !           446:                      else s := s10
        !           447:                      end
        !           448:               tag _9:
        !           449:                   if getb(b, pos)
        !           450:                      then s := s3
        !           451:                      else s := s1
        !           452:                      end
        !           453:               tag _10:
        !           454:                   if getb(b, pos)
        !           455:                      then error()
        !           456:                           break
        !           457:                      else s := s0
        !           458:                      end
        !           459:               end
        !           460:            pos := pos + 1
        !           461:            end
        !           462:        end except when end_of_file: end
        !           463:     if xpos > 0
        !           464:        then ab$addh(lines, line1)
        !           465:            ab$addh(lines, line2)
        !           466:        end
        !           467:     _chan$close(c)
        !           468:     return(lines)
        !           469:     end defax
        !           470: 
        !           471: error = proc ()
        !           472:     _chan$puts(_chan$error_output(), "decoding error\r\n", false)
        !           473:     end error
        !           474: 
        !           475: _cleanup_ = proc ()
        !           476:     end _cleanup_

unix.superglobalmegacorp.com

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