『Cプログラミング診断室』目次次(第11章 奇っ怪な条件 酷似関数)

第11章 奇っ怪な条件

プログラムの紹介


今回も、前回と同じソフトウェアからの抜粋です。ただし、前回とは違う人のプログラムなので、 また違う「味わい」があります。

数人での共同開発プログラムが、全体にほぼ万遍なく汚いのですが、人により汚さの方向が異な ります。だから、慣れてくると、そのプログラムを見るだけで、汚さの方向ベクトルの向きから、 「この部分はあの人だ」と断言できるようになります。

今回のプログラムは、Xウィンド、より正確にはX-Viewでのイベントハンドラと呼ばれるもので す。汚さを理解するには、Xについての知識は全く必要ありません。 プログラムは、リスト11−1にあります。もちろん今回も、「あれれ?」と思う個所がありま す。まず、リストを鑑賞してください。

リスト11−1 オリジナルプログラム

     1  void    mac_up_event( xwin, event )
     2  Xv_Window   xwin;
     3  Event       *event;
     4  {
     5  int         x;
     6  int         y;
     7  RECT        rectdisp;
     8  RECT        rectbase;
     9  POINT       point1;
    10  POINT       point2;
    11  Display     *dpy;
    12  Window      win_disp;
    13  Xv_Window   xwin_disp;
    14  
    15  if ( !event_is_ascii( event ) )
    16      {
    17      if ( event_is_down( event ) &&
    18           ( event_action( event ) == ACTION_SELECT ||
    19             event_action( event ) == MS_LEFT ||
    20             event_action( event ) == ACTION_ADJUST ||
    21             event_action( event ) == MS_MIDDLE ||
    22             event_action( event ) == ACTION_MENU ||
    23             event_action( event ) == MS_RIGHT ) )
    24          {
    25          mac_y -= (int)((DOUBLE)mac_height / mac_mag) / 2;
    26          if ( mac_y < 0 )
    27              mac_y = 0;
    28          mac_posx = mac_x + (int)((DOUBLE)mac_width/mac_mag) / 2;
    29          mac_posy = mac_y + (int)((DOUBLE)mac_height/mac_mag) / 2;
    30          rectdisp.x = 0;
    31          rectdisp.y = 0;
    32          rectdisp.size_x = mac_width;
    33          rectdisp.size_y = mac_height;
    34          rectbase.x = mac_x;
    35          rectbase.y = mac_y;
    36          xwin_disp = (Xv_Window)canvas_paint_window( mac_canvas );
    37          dpy = (Display *)xv_get( base_frame, XV_DISPLAY );
    38          win_disp = (Window)xv_get( xwin_disp, XV_XID );
    39          mac_cur = OFF;
    40          disp_data( (PRECT)&rectdisp, (PRECT)&rectbase,
    41                         mac_mag, (PPOINT)&mac_point,
    42                         mac_image_ad, mac_image -> bytes_per_line,
    43                         ON );
    44          XPutImage( dpy, win_disp, mac_paint_gc, mac_image,
    45                     rectdisp.x, rectdisp.y,
    46                     rectdisp.x, rectdisp.y,
    47                     rectdisp.size_x, rectdisp.size_y );
    48          }
    49      }
    50  }
    51  
    52  void    mac_down_event( xwin, event )
    53  Xv_Window   xwin;
    54  Event       *event;
    55  {
    56  int         x;
    57  int         y;
    58  RECT        rectdisp;
    59  RECT        rectbase;
    60  POINT       point1;
    61  POINT       point2;
    62  Display     *dpy;
    63  Window      win_disp;
    64  Xv_Window   xwin_disp;
    65  
    66  if ( !event_is_ascii( event ) )
    67      {
    68      if ( event_is_down( event ) &&
    69           ( event_action( event ) == ACTION_SELECT ||
    70             event_action( event ) == MS_LEFT ||
    71             event_action( event ) == ACTION_ADJUST ||
    72             event_action( event ) == MS_MIDDLE ||
    73             event_action( event ) == ACTION_MENU ||
    74             event_action( event ) == MS_RIGHT ) )
    75          {
    76          mac_y += (int)((DOUBLE)mac_height / mac_mag) / 2;
    77          if ( mac_y > ydot - (int)((DOUBLE)mac_height / mac_mag ) )
    78              {
    79              mac_y = ydot - (int)((DOUBLE)mac_height / mac_mag );
    80              if ( mac_y < 0 )
    81                  mac_y = 0;
    82              }
    83          mac_posx = mac_x + (int)((DOUBLE)mac_width/mac_mag) / 2;
    84          mac_posy = mac_y + (int)((DOUBLE)mac_height/mac_mag) / 2;
    85          rectdisp.x = 0;
    86          rectdisp.y = 0;
    87          rectdisp.size_x = mac_width;
    88          rectdisp.size_y = mac_height;
    89          rectbase.x = mac_x;
    90          rectbase.y = mac_y;
    91          xwin_disp = (Xv_Window)canvas_paint_window( mac_canvas );
    92          dpy = (Display *)xv_get( base_frame, XV_DISPLAY );
    93          win_disp = (Window)xv_get( xwin_disp, XV_XID );
    94          mac_cur = OFF;
    95          disp_data( (PRECT)&rectdisp, (PRECT)&rectbase,
    96                         mac_mag, (PPOINT)&mac_point,
    97                         mac_image_ad, mac_image -> bytes_per_line,
    98                         ON );
    99          XPutImage( dpy, win_disp, mac_paint_gc, mac_image,
   100                     rectdisp.x, rectdisp.y,
   101                     rectdisp.x, rectdisp.y,
   102                     rectdisp.size_x, rectdisp.size_y );
   103          }
   104      }
   105  }
   106  
   107  void    mac_left_event( xwin, event )
   108  Xv_Window   xwin;
   109  Event       *event;
   110  {
   111  int         x;
   112  int         y;
   113  RECT        rectdisp;
   114  RECT        rectbase;
   115  POINT       point1;
   116  POINT       point2;
   117  Display     *dpy;
   118  Window      win_disp;
   119  Xv_Window   xwin_disp;
   120  
   121  if ( !event_is_ascii( event ) )
   122      {
   123      if ( event_is_down( event ) &&
   124           ( event_action( event ) == ACTION_SELECT ||
   125             event_action( event ) == MS_LEFT ||
   126             event_action( event ) == ACTION_ADJUST ||
   127             event_action( event ) == MS_MIDDLE ||
   128             event_action( event ) == ACTION_MENU ||
   129             event_action( event ) == MS_RIGHT ) )
   130          {
   131          mac_x -= (int)((DOUBLE)mac_width / mac_mag) / 2;
   132          if ( mac_x < 0 )
   133              mac_x = 0;
   134          mac_posx = mac_x + (int)((DOUBLE)mac_width/mac_mag) / 2;
   135          mac_posy = mac_y + (int)((DOUBLE)mac_height/mac_mag) / 2;
   136          rectdisp.x = 0;
   137          rectdisp.y = 0;
   138          rectdisp.size_x = mac_width;
   139          rectdisp.size_y = mac_height;
   140          rectbase.x = mac_x;
   141          rectbase.y = mac_y;
   142          xwin_disp = (Xv_Window)canvas_paint_window( mac_canvas );
   143          dpy = (Display *)xv_get( base_frame, XV_DISPLAY );
   144          win_disp = (Window)xv_get( xwin_disp, XV_XID );
   145          mac_cur = OFF;
   146          disp_data( (PRECT)&rectdisp, (PRECT)&rectbase,
   147                         mac_mag, (PPOINT)&mac_point,
   148                         mac_image_ad, mac_image -> bytes_per_line,
   149                         ON );
   150          XPutImage( dpy, win_disp, mac_paint_gc, mac_image,
   151                     rectdisp.x, rectdisp.y,
   152                     rectdisp.x, rectdisp.y,
   153                     rectdisp.size_x, rectdisp.size_y );
   154          }
   155      }
   156  }
   157  
   158  void    mac_right_event( xwin, event )
   159  Xv_Window   xwin;
   160  Event       *event;
   161  {
   162  int         x;
   163  int         y;
   164  RECT        rectdisp;
   165  RECT        rectbase;
   166  POINT       point1;
   167  POINT       point2;
   168  Display     *dpy;
   169  Window      win_disp;
   170  Xv_Window   xwin_disp;
   171  
   172  if ( !event_is_ascii( event ) )
   173      {
   174      if ( event_is_down( event ) &&
   175           ( event_action( event ) == ACTION_SELECT ||
   176             event_action( event ) == MS_LEFT ||
   177             event_action( event ) == ACTION_ADJUST ||
   178             event_action( event ) == MS_MIDDLE ||
   179             event_action( event ) == ACTION_MENU ||
   180             event_action( event ) == MS_RIGHT ) )
   181          {
   182          mac_x += (int)((DOUBLE)mac_width / mac_mag ) / 2;
   183          if ( mac_x > xdot - (int)((DOUBLE)mac_width / mac_mag ) )
   184              {
   185              mac_x = xdot - (int)((DOUBLE)mac_width / mac_mag );
   186              if ( mac_x < 0 )
   187                  mac_x = 0;
   188              }
   189          mac_posx = mac_x + (int)((DOUBLE)mac_width/mac_mag) / 2;
   190          mac_posy = mac_y + (int)((DOUBLE)mac_height/mac_mag) / 2;
   191          rectdisp.x = 0;
   192          rectdisp.y = 0;
   193          rectdisp.size_x = mac_width;
   194          rectdisp.size_y = mac_height;
   195          rectbase.x = mac_x;
   196          rectbase.y = mac_y;
   197          xwin_disp = (Xv_Window)canvas_paint_window( mac_canvas );
   198          dpy = (Display *)xv_get( base_frame, XV_DISPLAY );
   199          win_disp = (Window)xv_get( xwin_disp, XV_XID );
   200          mac_cur = OFF;
   201          disp_data( (PRECT)&rectdisp, (PRECT)&rectbase,
   202                         mac_mag, (PPOINT)&mac_point,
   203                         mac_image_ad, mac_image -> bytes_per_line,
   204                         ON );
   205          XPutImage( dpy, win_disp, mac_paint_gc, mac_image,
   206                     rectdisp.x, rectdisp.y,
   207                     rectdisp.x, rectdisp.y,
   208                     rectdisp.size_x, rectdisp.size_y );
   209          }
   210      }
   211  }


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第11章 奇っ怪な条件 酷似関数)