⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pch.c

📁 minix软件源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
boolanother_hunk(){    Reg1 char *s;    Reg8 char *ret;    Reg2 int context = 0;    while (p_end >= 0) {	if (p_end == p_efake)	    p_end = p_bfake;		/* don't free twice */#ifndef SMALL	else	    free(p_line[p_end]);#endif	p_end--;    }    assert(p_end == -1);    p_efake = -1;#ifdef SMALL    if (sfp != Nullfp)	Fclose(sfp);    sfp = fopen(TMPSTRNAME, "w");    if (sfp == Nullfp)	fatal2("patch: can't create %s.\n", TMPSTRNAME);#endif    p_max = hunkmax;			/* gets reduced when --- found */    if (diff_type == CONTEXT_DIFF || diff_type == NEW_CONTEXT_DIFF) {	long line_beginning = ftell(pfp);					/* file pos of the current line */	LINENUM repl_beginning = 0;	/* index of --- line */	Reg4 LINENUM fillcnt = 0;	/* #lines of missing ptrn or repl */	Reg5 LINENUM fillsrc;		/* index of first line to copy */	Reg6 LINENUM filldst;		/* index of first missing line */	bool ptrn_spaces_eaten = FALSE;	/* ptrn was slightly misformed */	Reg9 bool repl_could_be_missing = TRUE;					/* no + or ! lines in this hunk */	bool repl_missing = FALSE;	/* we are now backtracking */	long repl_backtrack_position = 0;					/* file pos of first repl line */	LINENUM repl_patch_line;	/* input line number for same */	Reg7 LINENUM ptrn_copiable = 0;					/* # of copiable lines in ptrn */	ret = pgets(buf, sizeof buf, pfp);	p_input_line++;	if (ret == Nullch || strnNE(buf, "********", 8)) {	    next_intuit_at(line_beginning,p_input_line);	    return FALSE;	}	p_context = 100;	p_hunk_beg = p_input_line + 1;	while (p_end < p_max) {	    line_beginning = ftell(pfp);	    ret = pgets(buf, sizeof buf, pfp);	    p_input_line++;	    if (ret == Nullch) {		if (p_max - p_end < 4)		    Strcpy(buf, "  \n");  /* assume blank lines got chopped */		else {		    if (repl_beginning && repl_could_be_missing) {			repl_missing = TRUE;			goto hunk_done;		    }		    fatal1("Unexpected end of file in patch.\n");		}	    }	    p_end++;	    assert(p_end < hunkmax);	    p_char[p_end] = *buf;#ifdef zilog	    p_line[(short)p_end] = Nullch;#else#ifdef SMALL	    p_line[p_end] = -1L;	    p_len[p_end] = 0;#else	    p_line[p_end] = Nullch;#endif#endif	    switch (*buf) {	    case '*':		if (strnEQ(buf, "********", 8)) {		    if (repl_beginning && repl_could_be_missing) {			repl_missing = TRUE;			goto hunk_done;		    }		    else			fatal2("Unexpected end of hunk at line %ld.\n",			    p_input_line);		}		if (p_end != 0) {		    if (repl_beginning && repl_could_be_missing) {			repl_missing = TRUE;			goto hunk_done;		    }		    fatal3("Unexpected *** at line %ld: %s", p_input_line, buf);		}		context = 0;#ifdef SMALL		p_line[p_end] = saveStr(buf, p_len+p_end);#else		p_line[p_end] = savestr(buf);		if (out_of_mem) {		    p_end--;		    return FALSE;		}#endif		for (s=buf; *s && !isdigit(*s); s++) ;		if (!*s)		    goto malformed;		if (strnEQ(s,"0,0",3))		    strcpy(s,s+2);		p_first = (LINENUM) atol(s);		while (isdigit(*s)) s++;		if (*s == ',') {		    for (; *s && !isdigit(*s); s++) ;		    if (!*s)			goto malformed;		    p_ptrn_lines = ((LINENUM)atol(s)) - p_first + 1;		}		else if (p_first)		    p_ptrn_lines = 1;		else {		    p_ptrn_lines = 0;		    p_first = 1;		}		p_max = p_ptrn_lines + 6;	/* we need this much at least */		while (p_max >= hunkmax)		    grow_hunkmax();		p_max = hunkmax;		break;	    case '-':		if (buf[1] == '-') {		    if (repl_beginning ||			(p_end != p_ptrn_lines + 1 + (p_char[p_end-1] == '\n')))		    {			if (p_end == 1) {			    /* `old' lines were omitted - set up to fill */			    /* them in from 'new' context lines. */			    p_end = p_ptrn_lines + 1;			    fillsrc = p_end + 1;			    filldst = 1;			    fillcnt = p_ptrn_lines;			}			else {			    if (repl_beginning) {				if (repl_could_be_missing){				    repl_missing = TRUE;				    goto hunk_done;				}				fatal3("Duplicate \"---\" at line %ld--check line numbers at line %ld.\n",				    p_input_line, p_hunk_beg + repl_beginning);			    }			    else {				fatal4("%s \"---\" at line %ld--check line numbers at line %ld.\n",				    (p_end <= p_ptrn_lines					? "Premature"					: "Overdue" ),				    p_input_line, p_hunk_beg);			    }			}		    }		    repl_beginning = p_end;		    repl_backtrack_position = ftell(pfp);		    repl_patch_line = p_input_line;#ifdef SMALL		    p_line[p_end] = saveStr(buf, p_len+p_end);#else		    p_line[p_end] = savestr(buf);		    if (out_of_mem) {			p_end--;			return FALSE;		    }#endif		    p_char[p_end] = '=';		    for (s=buf; *s && !isdigit(*s); s++) ;		    if (!*s)			goto malformed;		    p_newfirst = (LINENUM) atol(s);		    while (isdigit(*s)) s++;		    if (*s == ',') {			for (; *s && !isdigit(*s); s++) ;			if (!*s)			    goto malformed;			p_repl_lines = ((LINENUM)atol(s)) - p_newfirst + 1;		    }		    else if (p_newfirst)			p_repl_lines = 1;		    else {			p_repl_lines = 0;			p_newfirst = 1;		    }		    p_max = p_repl_lines + p_end;		    if (p_max > MAXHUNKSIZE)			fatal4("Hunk too large (%ld lines) at line %ld: %s",			      p_max, p_input_line, buf);		    while (p_max >= hunkmax)			grow_hunkmax();		    if (p_repl_lines != ptrn_copiable)			repl_could_be_missing = FALSE;		    break;		}		goto change_line;	    case '+':  case '!':		repl_could_be_missing = FALSE;	      change_line:		if (buf[1] == '\n' && canonicalize)		    strcpy(buf+1," \n");		if (!isspace(buf[1]) && buf[1] != '>' && buf[1] != '<' &&		  repl_beginning && repl_could_be_missing) {		    repl_missing = TRUE;		    goto hunk_done;		}		if (context > 0) {		    if (context < p_context)			p_context = context;		    context = -1000;		}#ifdef SMALL		p_line[p_end] = saveStr(buf+2, p_len+p_end);#else		p_line[p_end] = savestr(buf+2);		if (out_of_mem) {		    p_end--;		    return FALSE;		}#endif		break;	    case '\t': case '\n':	/* assume the 2 spaces got eaten */		if (repl_beginning && repl_could_be_missing &&		  (!ptrn_spaces_eaten || diff_type == NEW_CONTEXT_DIFF) ) {		    repl_missing = TRUE;		    goto hunk_done;		}#ifdef SMALL		p_line[p_end] = saveStr(buf, p_len+p_end);#else		p_line[p_end] = savestr(buf);		if (out_of_mem) {		    p_end--;		    return FALSE;		}#endif		if (p_end != p_ptrn_lines + 1) {		    ptrn_spaces_eaten |= (repl_beginning != 0);		    context++;		    if (!repl_beginning)			ptrn_copiable++;		    p_char[p_end] = ' ';		}		break;	    case ' ':		if (!isspace(buf[1]) &&		  repl_beginning && repl_could_be_missing) {		    repl_missing = TRUE;		    goto hunk_done;		}		context++;		if (!repl_beginning)		    ptrn_copiable++;#ifdef SMALL		p_line[p_end] = saveStr(buf+2, p_len+p_end);#else		p_line[p_end] = savestr(buf+2);		if (out_of_mem) {		    p_end--;		    return FALSE;		}#endif		break;	    default:		if (repl_beginning && repl_could_be_missing) {		    repl_missing = TRUE;		    goto hunk_done;		}		goto malformed;	    }	    /* set up p_len for strncmp() so we don't have to */	    /* assume null termination */#ifndef SMALL	    if (p_line[p_end])		p_len[p_end] = strlen(p_line[p_end]);	    else		p_len[p_end] = 0;#endif	}	    hunk_done:	if (p_end >=0 && !repl_beginning)	    fatal2("No --- found in patch at line %ld\n", pch_hunk_beg());	if (repl_missing) {	    	    /* reset state back to just after --- */	    p_input_line = repl_patch_line;#ifndef SMALL	    for (p_end--; p_end > repl_beginning; p_end--)		free(p_line[p_end]);#endif	    Fseek(pfp, repl_backtrack_position, 0);	    	    /* redundant 'new' context lines were omitted - set */	    /* up to fill them in from the old file context */	    fillsrc = 1;	    filldst = repl_beginning+1;	    fillcnt = p_repl_lines;	    p_end = p_max;	}	if (diff_type == CONTEXT_DIFF &&	  (fillcnt || (p_first > 1 && ptrn_copiable > 2*p_context)) ) {	    if (verbose)		say4("%s\n%s\n%s\n","(Fascinating--this is really a new-style context diff but without","the telltale extra asterisks on the *** line that usually indicate","the new style...)");	    diff_type = NEW_CONTEXT_DIFF;	}		/* if there were omitted context lines, fill them in now */	if (fillcnt) {	    p_bfake = filldst;		/* remember where not to free() */	    p_efake = filldst + fillcnt - 1;	    while (fillcnt-- > 0) {		while (fillsrc <= p_end && p_char[fillsrc] != ' ')		    fillsrc++;		if (fillsrc > p_end)		    fatal2("Replacement text or line numbers mangled in hunk at line %ld\n",			p_hunk_beg);		p_line[filldst] = p_line[fillsrc];		p_char[filldst] = p_char[fillsrc];		p_len[filldst] = p_len[fillsrc];		fillsrc++; filldst++;	    }	    while (fillsrc <= p_end && fillsrc != repl_beginning &&	      p_char[fillsrc] != ' ')		fillsrc++;#ifdef DEBUGGING	    if (debug & 64)		printf("fillsrc %ld, filldst %ld, rb %ld, e+1 %ld\n",		    fillsrc,filldst,repl_beginning,p_end+1);#endif	    assert(fillsrc==p_end+1 || fillsrc==repl_beginning);	    assert(filldst==p_end+1 || filldst==repl_beginning);	}    }    else {				/* normal diff--fake it up */	char hunk_type;	Reg3 int i;	LINENUM min, max;	long line_beginning = ftell(pfp);	p_context = 0;	ret = pgets(buf, sizeof buf, pfp);	p_input_line++;	if (ret == Nullch || !isdigit(*buf)) {	    next_intuit_at(line_beginning,p_input_line);	    return FALSE;	}	p_first = (LINENUM)atol(buf);	for (s=buf; isdigit(*s); s++) ;	if (*s == ',') {	    p_ptrn_lines = (LINENUM)atol(++s) - p_first + 1;	    while (isdigit(*s)) s++;	}	else	    p_ptrn_lines = (*s != 'a');	hunk_type = *s;	if (hunk_type == 'a')	    p_first++;			/* do append rather than insert */	min = (LINENUM)atol(++s);	for (; isdigit(*s); s++) ;	if (*s == ',')	    max = (LINENUM)atol(++s);	else	    max = min;	if (hunk_type == 'd')	    min++;	p_end = p_ptrn_lines + 1 + max - min + 1;	if (p_end > MAXHUNKSIZE)	    fatal4("Hunk too large (%ld lines) at line %ld: %s",		  p_end, p_input_line, buf);	while (p_end >= hunkmax)	    grow_hunkmax();	p_newfirst = min;	p_repl_lines = max - min + 1;	Sprintf(buf, "*** %ld,%ld\n", p_first, p_first + p_ptrn_lines - 1);#ifdef SMALL	p_line[0] = saveStr(buf, p_len);#else	p_line[0] = savestr(buf);	if (out_of_mem) {	    p_end = -1;	    return FALSE;	}#endif	p_char[0] = '*';	for (i=1; i<=p_ptrn_lines; i++) {	    ret = pgets(buf, sizeof buf, pfp);	    p_input_line++;	    if (ret == Nullch)		fatal2("Unexpected end of file in patch at line %ld.\n",		  p_input_line);	    if (*buf != '<')		fatal2("< expected at line %ld of patch.\n", p_input_line);#ifdef SMALL	    p_line[i] = saveStr(buf+2, p_len+i);#else	    p_line[i] = savestr(buf+2);	    if (out_of_mem) {		p_end = i-1;		return FALSE;	    }#endif#ifndef SMALL	    p_len[i] = strlen(p_line[i]);#endif	    p_char[i] = '-';	}	if (hunk_type == 'c') {	    ret = pgets(buf, sizeof buf, pfp);	    p_input_line++;	    if (ret == Nullch)		fatal2("Unexpected end of file in patch at line %ld.\n",		    p_input_line);	    if (*buf != '-')		fatal2("--- expected at line %ld of patch.\n", p_input_line);	}	Sprintf(buf, "--- %ld,%ld\n", min, max);#ifdef SMALL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -