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

📄 skeleton.c

📁 Newlib 嵌入式 C库 标准实现代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			  if (__builtin_expect (outerr != outbuf, 0))			    {			      /* We have a problem.  Undo the conversion.  */			      outbuf = outstart;			      /* Restore the state.  */# ifdef SAVE_RESET_STATE			      SAVE_RESET_STATE (0);# endif			    }			  /* Change the status.  */			  status = result;			}		    }		  if (status == __GCONV_OK)		    /* Now flush the remaining steps.  */		    status = DL_CALL_FCT (fct, (next_step, next_data, NULL,						NULL, NULL, irreversible, 1,						consume_incomplete));		}	    }	}      else#endif	{	  /* Clear the state object.  There might be bytes in there from	     previous calls with CONSUME_INCOMPLETE == 1.  But don't emit	     escape sequences.  */	  memset (data->__statep, '\0', sizeof (*data->__statep));	  if (! (data->__flags & __GCONV_IS_LAST))	    /* Now flush the remaining steps.  */	    status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,					NULL, irreversible, do_flush,					consume_incomplete));	}    }  else    {      /* We preserve the initial values of the pointer variables.  */      const unsigned char *inptr = *inptrp;      unsigned char *outbuf = (__builtin_expect (outbufstart == NULL, 1)			       ? data->__outbuf : *outbufstart);      unsigned char *outend = data->__outbufend;      unsigned char *outstart;      /* This variable is used to count the number of characters we	 actually converted.  */      size_t lirreversible = 0;      size_t *lirreversiblep = irreversible ? &lirreversible : NULL;#if defined _STRING_ARCH_unaligned \    || MIN_NEEDED_FROM == 1 || MAX_NEEDED_FROM % MIN_NEEDED_FROM != 0 \    || MIN_NEEDED_TO == 1 || MAX_NEEDED_TO % MIN_NEEDED_TO != 0# define unaligned 0#else      int unaligned;# define GEN_unaligned(name) GEN_unaligned2 (name)# define GEN_unaligned2(name) name##_unaligned#endif#ifdef PREPARE_LOOP      PREPARE_LOOP#endif#if MAX_NEEDED_FROM > 1 || MAX_NEEDED_TO > 1      /* If the function is used to implement the mb*towc*() or wc*tomb*()	 functions we must test whether any bytes from the last call are	 stored in the `state' object.  */      if (((MAX_NEEDED_FROM > 1 && MAX_NEEDED_TO > 1)	   || (MAX_NEEDED_FROM > 1 && FROM_DIRECTION)	   || (MAX_NEEDED_TO > 1 && !FROM_DIRECTION))	  && consume_incomplete && (data->__statep->__count & 7) != 0)	{	  /* Yep, we have some bytes left over.  Process them now.             But this must not happen while we are called from an             error handler.  */	  assert (outbufstart == NULL);# if MAX_NEEDED_FROM > 1	  if (MAX_NEEDED_TO == 1 || FROM_DIRECTION)	    status = SINGLE(FROM_LOOP) (step, data, inptrp, inend, &outbuf,					outend, lirreversiblep					EXTRA_LOOP_ARGS);# endif# if MAX_NEEDED_FROM > 1 && MAX_NEEDED_TO > 1 && !ONE_DIRECTION	  else# endif# if MAX_NEEDED_TO > 1 && !ONE_DIRECTION	    status = SINGLE(TO_LOOP) (step, data, inptrp, inend, &outbuf,				      outend, lirreversiblep EXTRA_LOOP_ARGS);# endif	  if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)	    return status;	}#endif#if !defined _STRING_ARCH_unaligned \    && MIN_NEEDED_FROM != 1 && MAX_NEEDED_FROM % MIN_NEEDED_FROM == 0 \    && MIN_NEEDED_TO != 1 && MAX_NEEDED_TO % MIN_NEEDED_TO == 0      /* The following assumes that encodings, which have a variable length	 what might unalign a buffer even though it is a aligned in the	 beginning, either don't have the minimal number of bytes as a divisor	 of the maximum length or have a minimum length of 1.  This is true	 for all known and supported encodings.  */      unaligned = ((FROM_DIRECTION		    && ((uintptr_t) inptr % MIN_NEEDED_FROM != 0			|| ((data->__flags & __GCONV_IS_LAST)			    && (uintptr_t) outbuf % MIN_NEEDED_TO != 0)))		   || (!FROM_DIRECTION		       && (((data->__flags & __GCONV_IS_LAST)			    && (uintptr_t) outbuf % MIN_NEEDED_FROM != 0)			   || (uintptr_t) inptr % MIN_NEEDED_TO != 0)));#endif      while (1)	{	  struct __gconv_trans_data *trans;	  /* Remember the start value for this round.  */	  inptr = *inptrp;	  /* The outbuf buffer is empty.  */	  outstart = outbuf;#ifdef SAVE_RESET_STATE	  SAVE_RESET_STATE (1);#endif	  if (__builtin_expect (!unaligned, 1))	    {	      if (FROM_DIRECTION)		/* Run the conversion loop.  */		status = FROM_LOOP (step, data, inptrp, inend, &outbuf, outend,				    lirreversiblep EXTRA_LOOP_ARGS);	      else		/* Run the conversion loop.  */		status = TO_LOOP (step, data, inptrp, inend, &outbuf, outend,				  lirreversiblep EXTRA_LOOP_ARGS);	    }#if !defined _STRING_ARCH_unaligned \    && MIN_NEEDED_FROM != 1 && MAX_NEEDED_FROM % MIN_NEEDED_FROM == 0 \    && MIN_NEEDED_TO != 1 && MAX_NEEDED_TO % MIN_NEEDED_TO == 0	  else	    {	      if (FROM_DIRECTION)		/* Run the conversion loop.  */		status = GEN_unaligned (FROM_LOOP) (step, data, inptrp, inend,						    &outbuf, outend,						    lirreversiblep						    EXTRA_LOOP_ARGS);	      else		/* Run the conversion loop.  */		status = GEN_unaligned (TO_LOOP) (step, data, inptrp, inend,						  &outbuf, outend,						  lirreversiblep						  EXTRA_LOOP_ARGS);	    }#endif	  /* If we were called as part of an error handling module we	     don't do anything else here.  */	  if (__builtin_expect (outbufstart != NULL, 0))	    {	      *outbufstart = outbuf;	      return status;	    }	  /* Give the transliteration module the chance to store the	     original text and the result in case it needs a context.  */	  for (trans = data->__trans; trans != NULL; trans = trans->__next)	    if (trans->__trans_context_fct != NULL)	      DL_CALL_FCT (trans->__trans_context_fct,			   (trans->__data, inptr, *inptrp, outstart, outbuf));	  /* We finished one use of the loops.  */	  ++data->__invocation_counter;	  /* If this is the last step leave the loop, there is nothing             we can do.  */	  if (__builtin_expect (data->__flags & __GCONV_IS_LAST, 0))	    {	      /* Store information about how many bytes are available.  */	      data->__outbuf = outbuf;	      /* Remember how many non-identical characters we                 converted in a irreversible way.  */	      *irreversible += lirreversible;	      break;	    }	  /* Write out all output which was produced.  */	  if (__builtin_expect (outbuf > outstart, 1))	    {	      const unsigned char *outerr = data->__outbuf;	      int result;	      result = DL_CALL_FCT (fct, (next_step, next_data, &outerr,					  outbuf, NULL, irreversible, 0,					  consume_incomplete));	      if (result != __GCONV_EMPTY_INPUT)		{		  if (__builtin_expect (outerr != outbuf, 0))		    {#ifdef RESET_INPUT_BUFFER		      RESET_INPUT_BUFFER;#else		      /* We have a problem with the in on of the functions			 below.  Undo the conversion upto the error point.  */		      size_t nstatus;		      /* Reload the pointers.  */		      *inptrp = inptr;		      outbuf = outstart;		      /* Restore the state.  */# ifdef SAVE_RESET_STATE		      SAVE_RESET_STATE (0);# endif		      if (__builtin_expect (!unaligned, 1))			{			  if (FROM_DIRECTION)			    /* Run the conversion loop.  */			    nstatus = FROM_LOOP (step, data, inptrp, inend,						 &outbuf, outerr,						 lirreversiblep						 EXTRA_LOOP_ARGS);			  else			    /* Run the conversion loop.  */			    nstatus = TO_LOOP (step, data, inptrp, inend,					       &outbuf, outerr,					       lirreversiblep					       EXTRA_LOOP_ARGS);			}# if !defined _STRING_ARCH_unaligned \     && MIN_NEEDED_FROM != 1 && MAX_NEEDED_FROM % MIN_NEEDED_FROM == 0 \     && MIN_NEEDED_TO != 1 && MAX_NEEDED_TO % MIN_NEEDED_TO == 0		      else			{			  if (FROM_DIRECTION)			    /* Run the conversion loop.  */			    nstatus = GEN_unaligned (FROM_LOOP) (step, data,								 inptrp, inend,								 &outbuf,								 outerr,								 lirreversiblep								 EXTRA_LOOP_ARGS);			  else			    /* Run the conversion loop.  */			    nstatus = GEN_unaligned (TO_LOOP) (step, data,							       inptrp, inend,							       &outbuf, outerr,							       lirreversiblep							       EXTRA_LOOP_ARGS);			}# endif		      /* We must run out of output buffer space in this			 rerun.  */		      assert (outbuf == outerr);		      assert (nstatus == __GCONV_FULL_OUTPUT);		      /* If we haven't consumed a single byte decrement			 the invocation counter.  */		      if (__builtin_expect (outbuf == outstart, 0))			--data->__invocation_counter;#endif	/* reset input buffer */		    }		  /* Change the status.  */		  status = result;		}	      else		/* All the output is consumed, we can make another run		   if everything was ok.  */		if (status == __GCONV_FULL_OUTPUT)		  {		    status = __GCONV_OK;		    outbuf = data->__outbuf;		  }	    }	  if (status != __GCONV_OK)	    break;	  /* Reset the output buffer pointer for the next round.  */	  outbuf = data->__outbuf;	}#ifdef END_LOOP      END_LOOP#endif      /* If we are supposed to consume all character store now all of the	 remaining characters in the `state' object.  */#if MAX_NEEDED_FROM > 1 || MAX_NEEDED_TO > 1      if (((MAX_NEEDED_FROM > 1 && MAX_NEEDED_TO > 1)	   || (MAX_NEEDED_FROM > 1 && FROM_DIRECTION)	   || (MAX_NEEDED_TO > 1 && !FROM_DIRECTION))	  && __builtin_expect (consume_incomplete, 0)	  && status == __GCONV_INCOMPLETE_INPUT)	{# ifdef STORE_REST	  mbstate_t *state = data->__statep;	  STORE_REST# else	  size_t cnt;	  /* Make sure the remaining bytes fit into the state objects             buffer.  */	  assert (inend - *inptrp < 4);	  for (cnt = 0; *inptrp < inend; ++cnt)	    data->__statep->__value.__wchb[cnt] = *(*inptrp)++;	  data->__statep->__count &= ~7;	  data->__statep->__count |= cnt;# endif	}#endif    }  return status;}#undef DEFINE_INIT#undef CHARSET_NAME#undef DEFINE_FINI#undef MIN_NEEDED_FROM#undef MIN_NEEDED_TO#undef MAX_NEEDED_FROM#undef MAX_NEEDED_TO#undef DEFINE_DIRECTION_OBJECTS#undef FROM_DIRECTION#undef EMIT_SHIFT_TO_INIT#undef FROM_LOOP#undef TO_LOOP#undef SAVE_RESET_STATE#undef RESET_INPUT_BUFFER#undef FUNCTION_NAME#undef PREPARE_LOOP#undef END_LOOP#undef ONE_DIRECTION#undef STORE_REST

⌨️ 快捷键说明

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