makedoc.c

来自「cygwin, 著名的在win32下模拟unix操作系统的东东」· C语言 代码 · 共 1,470 行 · 第 1/2 页

C
1,470
字号
	    && at(tos, idx+1) == '<'	    && (!isspace(at(tos,idx + 2)) || at(tos,idx+3) == '>')) 	{	    /* This qualifies as a << startup */	    idx +=2;	    cattext(&out,"@code{");	  }		else 	if (at(tos, idx) == '<' 	    && at(tos, idx+1) == '['	    && !isspace(at(tos,idx + 2))) 	{	    /* This qualifies as a <[ startup */	    idx +=2;	    cattext(&out,"@var{");	  }	else if (at(tos, idx) == '>' 		 && at(tos,idx+1) =='>') 	{	  	    cattext(&out,"}");	    idx+=2;	}	else if (at(tos, idx) == ']' 		 && at(tos,idx+1) =='>') 	{	    cattext(&out,"}");	    idx+=2;	}	else 	{	    catchar(&out, at(tos, idx));	    idx++;	}    }    delete_string(tos);    *tos = out;    pc++;    }/* A command is all upper case,and alone on a line */static int DEFUN( iscommand,(ptr, idx),      string_type *ptr AND      unsigned int idx){    unsigned int len = 0;    while (at(ptr,idx)) {	    if (isupper(at(ptr,idx)) || at(ptr,idx) == ' ' ||		at(ptr,idx) == '_') 	    {	     len++;	     idx++;	 }	    else if(at(ptr,idx) == '\n')	    {		if (len >4) return 1;		return 0;	    }	    else return 0;	}    return 0;}DEFUN(copy_past_newline,(ptr, idx, dst),      string_type *ptr AND      unsigned int idx AND      string_type *dst){    while (at(ptr, idx) && at(ptr, idx) != '\n')     {	catchar(dst, at(ptr, idx));	idx++;	    }        catchar(dst, at(ptr, idx));    idx++;    return idx;}WORD(icopy_past_newline){    tos++;    init_string(tos);    idx = copy_past_newline(ptr, idx, tos);    pc++;	}/* indent   Take the string at the top of the stack, do some prettying */WORD(kill_bogus_lines){    int sl ;        int nl = 0;    int idx = 0;    int c;    int dot = 0    ;        string_type out;        init_string(&out);    /* Drop leading nl */    while (at(tos,idx) == '\n')    {	idx++;    }    c = idx;        /* Find the last char */    while (at(tos,idx))    {	idx++;    }        /* find the last non white before the nl */    idx--;        while (idx && isspace(at(tos,idx)))     idx--;    idx++;        /* Copy buffer upto last char, but blank lines before and after       dots don't count */    sl = 1;    while (c < idx)    {	if (at(tos,c) == '\n' 	    && at(tos,c+1) == '\n'	    && at(tos,c+2) == '.') 	{	    /* Ignore two linelines before  a dot*/	    c++;	}	else if (at(tos,c) == '.' && sl)	{	    /* remember that this line started with a dot */	    dot=2;	}	else if (at(tos,c) == '\n' 		 && at(tos,c+1) == '\n'		 && dot)	{	    c++;	    /* Ignore two newlines when last line was dot */	}	catchar(&out, at(tos,c));	if (at(tos,c) == '\n')	{	    sl = 1;	    	    if (dot == 2)dot=1;else dot = 0;	}		c++;	    }        /* Append nl*/    catchar(&out, '\n');    pc++;    delete_string(tos);    *tos = out;        }WORD(indent){    string_type out;    int tab = 0;    int idx = 0;    int ol =0;    init_string(&out);    while (at(tos,idx)) {	    switch (at(tos,idx)) 	    {	      case '\n':		cattext(&out,"\n");		idx++;		if (tab) 		{		    cattext(&out,"    ");		}		ol = 0;		break;	      case '(':		tab++;		if (ol == 0)		    cattext(&out,"   ");		idx++;		cattext(&out,"(");		ol = 1;		break;	      case ')':		tab--;		cattext(&out,")");		idx++;		ol=1;				break;	      default:		catchar(&out,at(tos,idx));		ol=1;				idx++;		break;	    }	}	    pc++;    delete_string(tos);    *tos = out;}/* Change the TOS so that all that is left is the stuff inside the first <<foo>> .*/WORD(get_stuff_in_angle){  unsigned int idx = 0;  string_type out;  init_string(&out);      while (at(tos, idx))     {      if (at(tos,idx) == '<' && at(tos,idx+1) =='<') 	{	  idx+=2;	  	  while (!(at(tos,idx) == '>' && at(tos,idx+1) == '>'))	    {	      catchar(&out, at(tos, idx));	      idx++;	    }	  break;	}      idx++;    }  catchar(&out,'\n');    overwrite_string(tos, &out);  pc++;}WORD(get_stuff_in_command){  tos++;  init_string(tos);  while (at(ptr, idx)) {    if (iscommand(ptr, idx))  break;    idx =   copy_past_newline(ptr, idx, tos);  }  pc++;    }WORD(swap){    string_type t;        t = tos[0];    tos[0] = tos[-1];    tos[-1] =t;     pc++;    }WORD(dup){    tos++;    init_string(tos);    catstr(tos, tos-1);    pc++;    }WORD(icatstr){    catstr(tos-1, tos);    delete_string(tos);    tos--;    pc++;    }WORD(skip_past_newline){    while (at(ptr,idx) 	   && at(ptr,idx) != '\n')     idx++;    idx++;    pc++;}WORD(internalmode){    internal_mode = *(isp);    isp--;    pc++;}WORD(maybecatstr){    if (internal_wanted == internal_mode)     {	catstr(tos-1, tos);    }    delete_string(tos);    tos--;    pc++;    }char *DEFUN(nextword,(string, word),      char *string AND      char **word){  char *word_start;  int idx;  char *dst;  char *src;      int length = 0;      while (isspace(*string) || *string == '-') {      if (*string == '-')       {	while (*string && *string != '\n') 	 string++;		      }      else {	  string++;	}    }  if (!*string) return 0;      word_start = string;    	  if (*string == '"')   {    string++;    length++;	    while (*string != '"')     {      string++;      length++;    }  }  else       {	    while (!isspace(*string))     {      string++;      length++;    }  }      *word = malloc(length + 1);  dst = *word;  src = word_start;  for (idx= 0; idx < length; idx++)   {        if (src[idx] == '\\' && src[idx+1] == 'n')     {      *dst++ = '\n';      idx++;        }    else *dst++ = src[idx];  }  *dst++ = 0;  if(*string)       return string + 1;  else    return 0;    }dict_type *root;dict_type *DEFUN(lookup_word,(word),      char *word){    dict_type *ptr = root;    while (ptr) {	    if (strcmp(ptr->word, word) == 0) return ptr;	    ptr = ptr->next;	    	 }    fprintf(stderr,"Can't find %s\n",word);    return 0;        }static void DEFUN_VOID(perform){    tos = stack;        while (at(ptr, idx)) {	    /* It's worth looking through the command list */	    if (iscommand(ptr, idx))	    {		unsigned int i;		int found = 0;		char *next;		dict_type *word ;				(void)		nextword(addr(ptr, idx), &next);		word = lookup_word(next);				if (word) 		{		    exec(word);		}		else		{		    fprintf(stderr,"warning, %s is not recognised\n",  next);		    skip_past_newline();		}			    }	    else skip_past_newline();	}}dict_type *DEFUN(newentry,(word),      char *word){    dict_type *new = (dict_type *)malloc(sizeof(dict_type));    new->word = word;    new->next = root;    root = new;    new->code = (stinst_type *)malloc(sizeof(stinst_type ));    new->code_length = 1;    new->code_end = 0;    return new;    }unsigned intDEFUN(add_to_definition,(entry, word),       dict_type *entry AND      stinst_type word){    if (entry->code_end == entry->code_length)     {	entry->code_length += 2;	entry->code =	 (stinst_type *) realloc((char *)(entry->code),			       entry->code_length *sizeof(word_type));    }    entry->code[entry->code_end] = word;    return     entry->code_end++;  }voidDEFUN(add_intrinsic,(name, func),      char *name AND      void (*func)()){    dict_type *new = newentry(name);    add_to_definition(new, func);    add_to_definition(new, 0);}WORD(push_addr){    }voidDEFUN(add_var,(name),      char *name){    dict_type *new = newentry(name);    add_to_definition(new, push_number);    add_to_definition(new, (stinst_type)(&(new->var)));    add_to_definition(new,0);    }      void DEFUN(compile, (string),       char *string){    int jstack[STACK];    int *jptr = jstack;    /* add words to the dictionary */    char *word;    string = nextword(string, &word);    while (string && *string && word[0])     {	if (strcmp(word,"var")==0) 	{ string=nextword(string, &word);	  	  add_var(word); string=nextword(string, &word);	}else		    	if (word[0] == ':')	{	    dict_type *ptr;	    /* Compile a word and add to dictionary */	    string = nextword(string, &word);	    	    ptr = newentry(word);	    string = nextword(string, &word);	    while (word[0] != ';' ) 	    {		 switch (word[0]) 		 {		    		    		   case '"':		     /* got a string, embed magic push string			function */		     add_to_definition(ptr, push_text);		     add_to_definition(ptr, (stinst_type)(word+1));		     break;		   case '0':		   case '1':		   case '2':		   case '3':		   case '4':		   case '5':		   case '6':		   case '7':		   case '8':		   case '9':		     /* Got a number, embedd the magic push number			function */		     add_to_definition(ptr, push_number);		     add_to_definition(ptr, atol(word));		     break;		   default:		     add_to_definition(ptr, call);		     add_to_definition(ptr, lookup_word(word));		 }		string = nextword(string, &word);		     	    }	    add_to_definition(ptr,0);	    string = nextword(string, &word);	}	else 	{	    fprintf(stderr,"syntax error at %s\n",string-1);	}	        }} static void DEFUN_VOID(bang){*(int *)((isp[0])) = isp[-1];isp-=2;pc++;}WORD(atsign){    isp[0] = *(int *)(isp[0]);    pc++;}WORD(hello){        printf("hello\n");    pc++;    }static void DEFUN(read_in, (str, file), 	   string_type *str AND		  FILE *file){    char buff[10000];        unsigned int r;    do     {	r = fread(buff, 1, sizeof(buff), file);	catbuf(str, buff, r);    }    while (r);    buff[0] = 0;        catbuf(str, buff,1);    }static void DEFUN_VOID(usage){    fprintf(stderr,"usage: -[d|i|g] <file >file\n");    exit(33);    }int DEFUN(main,(ac,av),int ac ANDchar *av[]){    unsigned int i;        string_type buffer;    string_type pptr;        init_string(&buffer);    init_string(&pptr);    init_string(stack+0);    tos=stack+1;    ptr = &pptr;        add_intrinsic("push_text", push_text);    add_intrinsic("!", bang);    add_intrinsic("@", atsign);    add_intrinsic("hello",hello);        add_intrinsic("skip_past_newline", skip_past_newline );    add_intrinsic("catstr", icatstr );    add_intrinsic("copy_past_newline", icopy_past_newline );    add_intrinsic("dup", dup );    add_intrinsic("remchar", remchar );    add_intrinsic("get_stuff_in_command", get_stuff_in_command );    add_intrinsic("get_stuff_in_angle", get_stuff_in_angle );    add_intrinsic("do_fancy_stuff", do_fancy_stuff );    add_intrinsic("bulletize", bulletize );    add_intrinsic("courierize", courierize );    add_intrinsic("swap", swap );    add_intrinsic("outputdots", outputdots );    add_intrinsic("exfunstuff", exfunstuff );    add_intrinsic("maybecatstr", maybecatstr );    add_intrinsic("translatecomments", translatecomments );    add_intrinsic("kill_bogus_lines", kill_bogus_lines);    add_intrinsic("indent", indent);    add_intrinsic("quickref", quickref);    add_intrinsic("internalmode", internalmode);        /* Put a nl at the start */    catchar(&buffer,'\n');    read_in(&buffer, stdin);     remove_noncomments(&buffer, ptr);    for (i= 1; i < ac; i++)     {	if (av[i][0] == '-')	{	    if (av[i][1] == 'f')	    {		string_type b;		FILE *f;		init_string(&b);		f  = fopen(av[i+1],"r");		if (!f) 		{		  fprintf(stderr,"Can't open the input file %s\n",av[i+1]);		  return 33;		}				  		read_in(&b, f);		compile(b.ptr);		perform();		    }	    else    if (av[i][1] == 'i') 	    {		internal_wanted = 1;	    }	}    }          write_buffer(stack+0);    return 0;}

⌨️ 快捷键说明

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