This file is indexed.

/usr/include/osl/move_classifier/pawnDropCheckmate.h is in libosl-dev 0.8.0-1.4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* pawnDropCheckmate.h
 */
#ifndef OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H
#define OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H

#include "osl/numEffectState.h"
#include "osl/bits/king8Info.h"

namespace osl
{
  namespace move_classifier
  {
    /**
     * 打歩詰の判定.
     * @param P 指手(攻撃)側
     */
    template <Player P>
    struct PawnDropCheckmate
    {
      /**
       * kingSquare に居る alt(P)の玉が dir 方向に逃げられるか.
       */
      static bool canEscape(const NumEffectState& state, Square kingSquare, 
			    Direction dir, Square dropAt);
      /** 王が前以外に移動可能か */
      static bool escape7(const NumEffectState& state, 
			  Square kingSquare, Square to);
      static bool isMember(const NumEffectState& state, 
			   Ptype ptype,Square from,Square to)
      {
	// 打歩
	if (! from.isPieceStand())
	  return false;
	if (ptype != PAWN)
	  return false;
	const Player Opponent = alt(P);
	const Piece king = state.template kingPiece<Opponent>();
	const Square king_position = king.square();
	// DirectionPlayerTraits?
	// 玉頭
        if (king_position != (to + DirectionPlayerTraits<U,P>::offset()))
	  return false;
	// 玉で取れない
	if (! state.hasEffectAt(P, to))
	  return false;
	if (King8Info(state.Iking8Info(Opponent)).liberty() != 0)
	  return false;
	// 玉以外の駒で取れない
	if (state.safeCaptureNotByKing<Opponent>(to, king)
	    != Piece::EMPTY())
	  return false;
	// どこにも逃げられない
	return escape7(state, king_position, to);
      }
    };
  } // namespace move_classifier
} // namespace osl

template <osl::Player P>
bool
#ifdef __GNUC__
	__attribute__ ((pure))
#endif
 osl::move_classifier::PawnDropCheckmate<P>::
canEscape(const NumEffectState& state, Square kingSquare, 
	  Direction dir, Square dropAt) 
{
  const Player Opponent = alt(P);
  const Square target 
    = kingSquare + Board_Table.getOffset(Opponent, dir);
  const Piece p = state.pieceAt(target);
  if (p.isOnBoardByOwner<Opponent>())
    return false;		// 自分の駒がいたら移動不能
  if (target.isEdge())
    return false;
  Piece attacker;
  if (! state.template hasEffectAt<P>(target, attacker))
    return true;		// 利きがない
  if (attacker == Piece::EMPTY())
    return false;		// 攻撃側に複数の利き
  assert(attacker.owner() == P);
  // drop によりふさがれた利きなら逃げられる
  //    -OU
  // XXX+FU+HI
  // の場合のXXXなど.
  const Offset shortOffset
    = Board_Table.getShortOffsetNotKnight(Offset32(target,dropAt));
  if (shortOffset.zero())
    return false;
  const Square attackFrom = attacker.square();
  return shortOffset
    == Board_Table.getShortOffsetNotKnight(Offset32(dropAt,attackFrom));
}

template <osl::Player P>
bool
#ifdef __GNUC__
	__attribute__ ((pure))
#endif
 osl::move_classifier::PawnDropCheckmate<P>::
escape7(const NumEffectState& state, Square king_position, Square to)
{
  // U は歩
  if (canEscape(state, king_position, UL, to))
    return false;
  if (canEscape(state, king_position, UR, to))
    return false;
  if (canEscape(state, king_position, L, to))
    return false;
  if (canEscape(state, king_position, R, to))
    return false;
  if (canEscape(state, king_position, DL, to))
    return false;
  if (canEscape(state, king_position, D, to))
    return false;
  if (canEscape(state, king_position, DR, to))
    return false;
  return true;
}
      

#endif /* OSL_MOVE_CLASSIFIER_PAWNDROPCHECKMATE_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End: