Annotation of 43BSD/contrib/X/xfax/xfax.clu, revision 1.1.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.