func process()

in cmd/pinpi/main.go [55:100]


func process(ctx context.Context, task *task, logger *zap.SugaredLogger, client obj.Client) error {
	logger.Infof("processing task, start = %d, n = %v", task.start, task.n)

	rrd := index.Decimal.NewReader(ctx, client.Bucket(index.BucketName))
	defer rrd.Close()
	urd := unpack.NewReader(ctx, rrd)
	if _, err := urd.Seek(task.start, io.SeekStart); err != nil {
		return err
	}
	buf := make([]byte, task.n)
	n, err := io.ReadFull(urd, buf)
	if n < MIN_MATCH {
		return err
	}
	buf = buf[:n]
	off := 0
	for len(buf) >= MIN_MATCH {
		i := bytes.Index(buf, []byte(SEQUENCE[:MIN_MATCH]))
		if i < 0 {
			break
		}
		match := buf[i:]
		if len(match) < len(SEQUENCE) {
			p := make([]byte, len(SEQUENCE)-len(match))
			if n, err := io.ReadFull(urd, p); n == 0 {
				return err
			}
			match = append(match, p...)
		}
		l := 0
		for ; l < len(SEQUENCE)-MIN_MATCH; l++ {
			if match[MIN_MATCH+l] != SEQUENCE[MIN_MATCH+l] {
				break
			}
		}
		matchLen := MIN_MATCH + l
		fmt.Printf("%v, %v, %s\n",
			task.start+int64(off+i+1), matchLen, string(match[:matchLen]))
		buf = buf[i+matchLen:]
		off += i + matchLen
	}

	logger.Infof("digits processed: %d + %d digits",
		task.start, task.n)
	return nil
}