code: private MarkMode mark(byte[] bs, int[] fails) throws IOException {
          RingItem ri = item;
          int re;
          while ((re = ri.mark(bs, fails)) >= 0 && ri.isDone4Mark()) {
              // 结尾匹配 bs 的开始，看不出这是否是一个结束，所以暂时当作
              // 结束标记，并看看下一个节点。如果不是结束，则需要将 r 置到 max
              if (re > 0) {
                  // 下一个节点没有加载，加载一下
                  if (!ri.next.isLoaded) {
                      ri.next.load(ins);
                      readed += ri.next.max;
                  }
                  // 如果当前的环节点的 next指向最初节点，说明整个当前的环已经被读满了，
                  // 因此所以不能判断这个位置是不是边界
                  // 因此做一下记录，下次加载时，本节点应该为头部
                  else if (ri.next == this.item) {
                      ri.nextmark = ri.r;
                      return MarkMode.NOT_FOUND;
                  }
                  // 匹配头部
                  if (ri.next.matchHeadingWithRemain(bs, re)) {
                      return MarkMode.FOUND;
                  }
                  // 没有匹配上，重置当前节点
                  else {
                      ri.r = ri.max;
                      ri.nextmark = ri.max;
                  }
              }
              if (ri.isStreamEnd)
                  break;
              // 指向下一个节点
              ri = ri.next;
              // 保证该节点已经加载了
              if (!ri.isLoaded) {
                  ri.load(ins);
                  readed += ri.max;
              }
              // 如果已经循环了一圈，退出
              if (ri == item)
                  break;
          }
          if (re == -1)
              return MarkMode.FOUND;
  
          return ri.isStreamEnd ? MarkMode.STREAM_END : MarkMode.NOT_FOUND;
      }
docs: 根据给定的字节数组，在环中作标记，以便 dump
  
  @param bs
  数组
  @return 标记模式
  @throws IOException