/* Draws a (x1,y1) to (x2,y2) within the clip limits */

#include "plplot.h"

#define betw(ix,ia,ib) ((ix<=ia && ix>=ib) || (ix>=ia && ix<=ib))
#define inside(ix,iy) (betw(ix,clpxmi,clpxma) && betw(iy,clpymi,clpyma))
#define ixcut(iy) round((float)((x2-x1)*(iy-y1)+x1*(y2-y1))/(float)(y2-y1))
#define iycut(ix) round((float)((y2-y1)*(ix-x1)+y1*(x2-x1))/(float)(x2-x1))

void pllclp(x1,y1,x2,y2)
int x1,y1,x2,y2;
{
      int xt[2],yt[2];
      int it, k;
      int clpxmi,clpxma,clpymi,clpyma;

      gclp(&clpxmi,&clpxma,&clpymi,&clpyma);
      k=0;
      if (inside(x1,y1)) {
        xt[k]=x1;
        yt[k]=y1;
        k=k+1;
      }
      if (inside(x2,y2)) {
        xt[k]=x2;
        yt[k]=y2;
        k=k+1;
      }
      if (k == 2) goto draw;
      if (y1 != y2) {
        it=ixcut(clpymi);
        if (inside(it,clpymi) && betw(clpymi,y1,y2)) {
          xt[k]=it;
          yt[k]=clpymi;
          k=k+1;
        }
        if (k == 2) goto draw;
        it=ixcut(clpyma);
        if (inside(it,clpyma) && betw(clpyma,y1,y2)) {
          xt[k]=it;
          yt[k]=clpyma;
          k=k+1;
        }
        if (k == 2) goto draw;
      }
      if (x1 != x2) {
        it=iycut(clpxmi);
        if (inside(clpxmi,it) && betw(clpxmi,x1,x2)) {
          xt[k]=clpxmi;
          yt[k]=it;
          k=k+1;
        }
        if (k == 2) goto draw;
        it=iycut(clpxma);
        if (inside(clpxma,it) && betw(clpxma,x1,x2)) {
          xt[k]=clpxma;
          yt[k]=it;
          k=k+1;
        }
        if (k == 2) goto draw;
      }
draw:
      if (k == 2) genlin(xt[0],yt[0],xt[1],yt[1]);
      scurr(x2,y2);
} 
