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

📄 iptcutil.c

📁 tiff格式传真源码例子
💻 C
📖 第 1 页 / 共 2 页
字号:
        recnum = 0,        dataset = 0;      int        inputlen = BUFFER_SZ;      line = (char *) malloc(inputlen);           token = (char *)NULL;      while((line = super_fgets(line,&inputlen,ifile))!=NULL)      {        state=0;        next=0;        token = (char *) malloc(inputlen);             newstr = (char *) malloc(inputlen);             while(tokenizer(0, token, inputlen, line, "", "=", "\"", 0,          &brkused,&next,&quoted)==0)        {          if (state == 0)            {                                int                state,                next;              char                brkused,                quoted;              state=0;              next=0;              while(tokenizer(0, newstr, inputlen, token, "", "#", "", 0,                &brkused, &next, &quoted)==0)              {                if (state == 0)                  dataset = (unsigned char) atoi(newstr);                else                   if (state == 1)                     recnum = (unsigned char) atoi(newstr);                state++;              }            }          else            if (state == 1)              {                int                  next;                unsigned long                  len;                char                  brkused,                  quoted;                next=0;                len = strlen(token);                while(tokenizer(0, newstr, inputlen, token, "", "&", "", 0,                  &brkused, &next, &quoted)==0)                {                  if (brkused && next > 0)                    {                      char                        *s = &token[next-1];                      len -= convertHTMLcodes(s, strlen(s));                    }                }                fputc(0x1c, ofile);                fputc(dataset, ofile);                fputc(recnum, ofile);                if (len < 0x10000)                  {                    fputc((len >> 8) & 255, ofile);                    fputc(len & 255, ofile);                  }                else                  {                    fputc(((len >> 24) & 255) | 0x80, ofile);                    fputc((len >> 16) & 255, ofile);                    fputc((len >> 8) & 255, ofile);                    fputc(len & 255, ofile);                  }                next=0;                while (len--)                  fputc(token[next++], ofile);              }          state++;        }        free(token);        token = (char *)NULL;        free(newstr);        newstr = (char *)NULL;      }      free(line);      fclose( ifile );      fclose( ofile );    }  return 0;}/*	This routine is a generalized, finite state token parser. It allows    you extract tokens one at a time from a string of characters.  The    characters used for white space, for break characters, and for quotes    can be specified. Also, characters in the string can be preceded by    a specifiable escape character which removes any special meaning the    character may have.	There are a lot of formal parameters in this subroutine call, but	once you get familiar with them, this routine is fairly easy to use.	"#define" macros can be used to generate simpler looking calls for	commonly used applications of this routine.	First, some terminology:	token:		used here, a single unit of information in				the form of a group of characters.	white space:	space that gets ignored (except within quotes				or when escaped), like blanks and tabs.  in				addition, white space terminates a non-quoted				token.	break character: a character that separates non-quoted tokens.				commas are a common break character.  the				usage of break characters to signal the end				of a token is the same as that of white space,				except multiple break characters with nothing				or only white space between generate a null				token for each two break characters together.				for example, if blank is set to be the white				space and comma is set to be the break				character, the line ...				A, B, C ,  , DEF				... consists of 5 tokens:				1)	"A"				2)	"B"				3)	"C"				4)	""      (the null string)				5)	"DEF"	quote character: 	a character that, when surrounding a group				of other characters, causes the group of				characters to be treated as a single token,				no matter how many white spaces or break				characters exist in the group.	also, a				token always terminates after the closing				quote.	for example, if ' is the quote				character, blank is white space, and comma				is the break character, the following				string ...				A, ' B, CD'EF GHI				... consists of 4 tokens:				1)	"A"				2)	" B, CD" (note the blanks & comma)				3)	"EF"				4)	"GHI"				the quote characters themselves do				not appear in the resultant tokens.  the				double quotes are delimiters i use here for				documentation purposes only.	escape character:	a character which itself is ignored but				which causes the next character to be				used as is.  ^ and \ are often used as				escape characters.  an escape in the last				position of the string gets treated as a				"normal" (i.e., non-quote, non-white,				non-break, and non-escape) character.				for example, assume white space, break				character, and quote are the same as in the				above examples, and further, assume that				^ is the escape character.  then, in the				string ...				ABC, ' DEF ^' GH' I ^ J K^ L ^				... there are 7 tokens:				1)	"ABC"				2)	" DEF ' GH"				3)	"I"				4)	" "     (a lone blank)				5)	"J"				6)	"K L"				7)	"^"     (passed as is at end of line)	OK, now that you have this background, here's how to call "tokenizer":	result=tokenizer(flag,token,maxtok,string,white,break,quote,escape,		      brkused,next,quoted)	result: 	0 if we haven't reached EOS (end of string), and			1 if we have (this is an "int").	flag:		right now, only the low order 3 bits are used.			1 => convert non-quoted tokens to upper case			2 => convert non-quoted tokens to lower case			0 => do not convert non-quoted tokens			(this is a "char").	token:		a character string containing the returned next token			(this is a "char[]").	maxtok: 	the maximum size of "token".  characters beyond			"maxtok" are truncated (this is an "int").	string: 	the string to be parsed (this is a "char[]").	white:		a string of the valid white spaces.  example:			char whitesp[]={" \t"};			blank and tab will be valid white space (this is			a "char[]").	break:		a string of the valid break characters.  example:			char breakch[]={";,"};			semicolon and comma will be valid break characters			(this is a "char[]").			IMPORTANT:  do not use the name "break" as a C			variable, as this is a reserved word in C.	quote:		a string of the valid quote characters.  an example			would be			char whitesp[]={"'\"");			(this causes single and double quotes to be valid)			note that a token starting with one of these characters			needs the same quote character to terminate it.			for example,			"ABC '			is unterminated, but			"DEF" and 'GHI'			are properly terminated.  note that different quote			characters can appear on the same line; only for			a given token do the quote characters have to be			the same (this is a "char[]").	escape: 	the escape character (NOT a string ... only one			allowed).  use zero if none is desired (this is			a "char").	brkused:	the break character used to terminate the current			token.	if the token was quoted, this will be the			quote used.  if the token is the last one on the			line, this will be zero (this is a pointer to a			"char").	next:		this variable points to the first character of the			next token.  it gets reset by "tokenizer" as it steps			through the string.  set it to 0 upon initialization,			and leave it alone after that.	you can change it			if you want to jump around in the string or re-parse			from the beginning, but be careful (this is a			pointer to an "int").	quoted: 	set to 1 (true) if the token was quoted and 0 (false)			if not.  you may need this information (for example:			in C, a string with quotes around it is a character			string, while one without is an identifier).			(this is a pointer to a "char").*//* states */#define IN_WHITE 0#define IN_TOKEN 1#define IN_QUOTE 2#define IN_OZONE 3int _p_state;	   /* current state	 */unsigned _p_flag;  /* option flag	 */char _p_curquote;  /* current quote char */int _p_tokpos;	   /* current token pos  *//* routine to find character in string ... used only by "tokenizer" */int sindex(char ch,char *string){  char *cp;  for(cp=string;*cp;++cp)    if(ch==*cp)      return (int)(cp-string);	/* return postion of character */  return -1;			/* eol ... no match found */}/* routine to store a character in a string ... used only by "tokenizer" */void chstore(char *string,int max,char ch){  char c;  if(_p_tokpos>=0&&_p_tokpos<max-1)  {    if(_p_state==IN_QUOTE)      c=ch;    else      switch(_p_flag&3)      {	    case 1: 	    /* convert to upper */	      c=toupper(ch);	      break;	    case 2: 	    /* convert to lower */	      c=tolower(ch);	      break;	    default:	    /* use as is */	      c=ch;	      break;      }    string[_p_tokpos++]=c;  }  return;}int tokenizer(unsigned inflag,char *token,int tokmax,char *line,  char *white,char *brkchar,char *quote,char eschar,char *brkused,    int *next,char *quoted){  int qp;  char c,nc;  *brkused=0;		/* initialize to null */  *quoted=0;		/* assume not quoted  */  if(!line[*next])	/* if we're at end of line, indicate such */    return 1;  _p_state=IN_WHITE;   /* initialize state */  _p_curquote=0;	   /* initialize previous quote char */  _p_flag=inflag;	   /* set option flag */  for(_p_tokpos=0;(c=line[*next]);++(*next))	/* main loop */  {    if((qp=sindex(c,brkchar))>=0)  /* break */    {      switch(_p_state)      {	    case IN_WHITE:		/* these are the same here ...	*/	    case IN_TOKEN:		/* ... just get out		*/	    case IN_OZONE:		/* ditto			*/	      ++(*next);	      *brkused=brkchar[qp];	      goto byebye;	    case IN_QUOTE:		 /* just keep going */	      chstore(token,tokmax,c);	      break;      }    }    else if((qp=sindex(c,quote))>=0)  /* quote */    {      switch(_p_state)      {	    case IN_WHITE:	 /* these are identical, */	      _p_state=IN_QUOTE; /* change states   */	      _p_curquote=quote[qp]; /* save quote char */	      *quoted=1;	/* set to true as long as something is in quotes */	      break;	    case IN_QUOTE:	      if(quote[qp]==_p_curquote) /* same as the beginning quote? */	      {	        _p_state=IN_OZONE;	        _p_curquote=0;	      }	      else	        chstore(token,tokmax,c); /* treat as regular char */	      break;	    case IN_TOKEN:	    case IN_OZONE:	      *brkused=c; /* uses quote as break char */	      goto byebye;      }    }    else if((qp=sindex(c,white))>=0) /* white */    {      switch(_p_state)      {	    case IN_WHITE:	    case IN_OZONE:	      break;		/* keep going */	    case IN_TOKEN:	      _p_state=IN_OZONE;	      break;	    case IN_QUOTE:	      chstore(token,tokmax,c); /* it's valid here */	      break;      }    }    else if(c==eschar)  /* escape */    {      nc=line[(*next)+1];      if(nc==0) 		/* end of line */      {	    *brkused=0;	    chstore(token,tokmax,c);	    ++(*next);	    goto byebye;      }      switch(_p_state)      {	    case IN_WHITE:	      --(*next);	      _p_state=IN_TOKEN;	      break;	    case IN_TOKEN:	    case IN_QUOTE:	      ++(*next);	      chstore(token,tokmax,nc);	      break;	    case IN_OZONE:	      goto byebye;      }    }    else	/* anything else is just a real character */    {      switch(_p_state)      {	    case IN_WHITE:	      _p_state=IN_TOKEN; /* switch states */	    case IN_TOKEN:		 /* these 2 are     */	    case IN_QUOTE:		 /*  identical here */	      chstore(token,tokmax,c);	      break;	    case IN_OZONE:	      goto byebye;      }    }  }		/* end of main loop */byebye:  token[_p_tokpos]=0;	/* make sure token ends with EOS */  return 0;}

⌨️ 快捷键说明

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