#include <bits/stdc++.h>
using namespace std;
const int dx[]={0,1,0,-1,1,-1,-1,1};
const int dy[]={-1,0,1,0,1,1,-1,-1};
const int INF = 1<<30;
const double EPS = 1e-15;
#define PB push_back
#define mk make_pair
#define fi first
#define se second
#define ll long long
#define reps(i,j,k) for(int i = (j); i < (k); i++)
#define rep(i,j) reps(i,0,j)
#define MOD 1000000007
typedef pair<int,int> Pii;
typedef pair<int,Pii> P;
typedef vector<int> vi;
typedef vector<vi> vvi;
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x = _x;
        y = _y;
    }
    Point operator + (Point p){
        return Point(x+p.x,y+p.y);
    }
  
    Point operator - (Point p){
        return Point(x-p.x,y-p.y);
    }
  
    Point operator * (double k){
        return Point(k*x,k*y);
    }
  
    Point operator / (double k){
        return Point(x/k,y/k);
    }
 
    bool operator<(const Point &p)const{
        return x!=p.x?x<p.x:y<p.y;
    }
  
};
double dot(Point p, Point q){
    return p.x*q.x+p.y*q.y;
}
  
double cross(Point p,Point q){
    return p.x*q.y-q.x*p.y;
}
  
double norm(Point p){
    return p.x*p.x+p.y*p.y;
}
  
double pabs(Point p){
    return sqrt(norm(p));
}
typedef vector<Point> Polygon;
struct Line : Polygon{
    Line(){}
    Line(Point p,Point q){
        PB(p);
        PB(q);  
    }
};
struct Circle{
    Point p; //中心点
    double r; //半径
    Circle(){}
    Circle(Point _p,double _r){
        p = _p;
        r = _r;
    }
};
int ccw(Point a,Point b,Point c){
    b = b-a;
    c = c-a;
    if(cross(b,c) > 0)return +1; //a→b で反時計に折れてc ccw
    if(cross(b,c) < 0)return -1; //a→b で時計に折れてc ccw
    if(dot(b,c) < 0)return +2; // c--a--b;
    if(pabs(b)<pabs(c))return -2; //a--b--c
    return 0; //a--c--b
}
bool intersectSS(Line l,Line m){
    //lとmが交差してるかどうか
    return (ccw(l[0],l[1],m[0])*ccw(l[0],l[1],m[1])<=0)&&
            (ccw(m[0],m[1],l[0])*ccw(m[0],m[1],l[1])<=0);
}

bool intersectLL(Line l,Line m){
	return fabs(cross(l[1]-l[0],m[1]-m[0])) > EPS || //平行でない
			fabs(cross(l[1]-l[0],m[0]-l[0])) < EPS; //同一の線
}


double TriangleArea(Point a,Point b,Point c){
    b = b - a;
    c = c - a;
    return cross(b,c)*0.5; //負になることもあるので注意
}
 
double VertexArea(Polygon v){
    double subArea = 0.0;
    rep(i,v.size()-1){
        subArea += TriangleArea(v[0],v[i],v[i+1]);
    }
    return subArea; //負になることもあるので注意
}

Point crosspoint(Line l,Line m){
    if(intersectSS(l,m) == false)return Point(INF,INF);
    return m[0]+(m[1]-m[0])*cross(l[1]-l[0],l[1]-m[0])/cross(l[1]-l[0],m[1]-m[0]);
}
 
Polygon ConvexHull(Polygon v){
	int n = v.size();
	int k = 0;
	sort(v.begin(),v.end());
	Polygon e(2*n);
	for(int i=0;i<n;e[k++]=v[i++])
		while(k>=2&&ccw(e[k-2],e[k-1],v[i])<=0)k--;
	for(int i=n-2,t=k+1;i>=0;e[k++]=v[i--])
		while(k>=t&&ccw(e[k-2],e[k-1],v[i])<=0)k--;
	e.resize(k-1);
	return e;
}

int main(){
	int N;
	while(scanf("%d",&N),N){
		vector < Line > L;
		vector < Line > flame;
		double sx[] = {-100,100,100,-100,-100};
		double sy[] = {-100,-100,100,100,-100};
		rep(i,4){
			Line l;
			l.PB(Point(sx[i],sy[i]));
			l.PB(Point(sx[i+1],sy[i+1]));
			flame.PB(l);
		}
		int ans = 1;
		rep(i,N){
			double x1,y1,x2,y2;
			Line l;
			scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
			l.PB(Point(x1,y1));
			l.PB(Point(x2,y2));

			int cnt = 0;
			set<Point> memo;
			rep(j,L.size()){
				if(intersectSS(L[j],l)){
					bool f = false;
					Point p = crosspoint(L[j],l);
					rep(k,4){
						if(ccw(flame[k][0],flame[k][1],p) == 0){
							f = true;
							//puts("HOGE");
							break;
						}
					}
					if(memo.find(p) != memo.end() || f)continue;
					memo.insert(p);
					cnt++;
				}
			}
			ans += (cnt+1);
			L.PB(l);
		}
		printf("%d\n",ans);
	}
    return 0;
}

Measured memory_bytes: 1252