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

📄 utils.c

📁 eCos操作系统源码
💻 C
字号:
//==========================================================================////      utils.c////      Monitor utilities.////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    // Contributors: gthomas, dmoseley// Date:         1999-10-20// Purpose:      Monitor utilities.// Description:  //               ////####DESCRIPTIONEND####////=========================================================================#include <limits.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#ifdef HAVE_BSP#include <bsp/bsp.h>#include <bsp/cpu.h>#include <bsp/hex-utils.h>#endif#include "monitor.h"#include "tservice.h"#if USE_CYGMON_PROTOTYPES/* Use common prototypes *//* Some of the composed board.h files compose these   prototypes redundently, but if they dont,   these are the common definitions */#include "fmt_util.h"   /* Interface to string formatting utilities */#include "generic-stub.h" /* from libstub */#endif /* USE_CYGMON_PROTOTYPES */volatile int switch_to_stub_flag = 0;/* Input routine for the line editor. */intinput_char (void){  int i;  /* We have to drop the '+' characters on the floor     because gdb will send a '+' as the first character     when connecting to the target. If we waste time     echoing that, slow hw might get a uart overrun. */  while ((i = xgetchar ()) == '+');  if (i == '$')    {      xungetchar ('$');      switch_to_stub_flag = 1;      i = '\n';    }  return i;}static char tohex_array[16] = {'0', '1', '2', '3', '4', '5', '6', '7',			       '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};#define tohex(X) (tohex_array[(X) & 15])#ifdef HAVE_BSP#define fromhex __hex#elsestatic intfromhex (a){  int number = -1;  if (a >= '0' && a <= '9')    number = a - '0';  else if (a >= 'a' && a <= 'f')    number = a - 'a' + 10;  else if (a >= 'A' && a <= 'F')    number = a - 'A' + 10;  else     xprintf ("Invalid hex digit %c", a);  return number;}#endifstatic unsigned long longstr2ull (char *str, int base){  unsigned long long l = 0;  if (str[0] == '0' && str[1] == 'x')    {      str += 2 ;      base = 16 ;    }  while (*str != '\0')    {      if (*str == '.')	str++;      else	l = (l * base) + fromhex(*str++);    }  return l;}/* Converts a string to a long, base is the assumed base of the string */target_register_tstr2int (char *str, int base){  return str2ull(str, base);}/* Converts a string to a double, input is a raw integer string * of the given assumed base. */#if HAVE_DOUBLE_REGSstatic doublestr2double (char *str, int base){  double d;  switch (sizeof(double))    {      case sizeof(unsigned int):	*((unsigned int *)&d) = str2ull(str, base);	break;#if __LONG_MAX__ != __INT_MAX__      case sizeof(unsigned long):	*((unsigned long *)&d) = str2ull(str, base);	break;#endif#if __LONG_LONG_MAX__ != __LONG_MAX__      case sizeof(unsigned long long):	*((unsigned long long *)&d) = str2ull(str, base);	break;#endif      default:	d = 0.0;	break;    }  return d;}#endiftarget_register_tstr2intlen (char *str, int base, int len){  target_register_t number = 0;  while ((len--) > 0 && *str != '\0')    number = number * base + fromhex (*(str++));  return number;}inthex2bytes (char *str, char *dest, int maxsize){  int i;  char *ptr;  for (i = 0; i < maxsize; i++)    dest[i] = 0;  maxsize--;  // Don't try and convert 0x prefix  if ((str[0] == '0') && (str[1] == 'x'))      str += 2;  ptr = str + strlen(str) - 1;  while (maxsize >= 0 && ptr >= str)    {      dest [maxsize] = fromhex(*ptr);      ptr--;      if (ptr >= str)	{	  dest [maxsize--] |= fromhex(*ptr) * 16;	  ptr--;	}    }  return 0;}/* Converts an unsigned long long to an ASCII string, adding leading   zeroes to pad space up to numdigs. */static int use_dots = 1;#define MAX_NUM_DIGS 51static char *ull2str (unsigned long long number, int base, int numdigs){  static char string[MAX_NUM_DIGS+1];  int dots, i;  char *ptr = string + MAX_NUM_DIGS;  dots = (use_dots && base == 16);  *(ptr--) = '\0';  *(ptr--) = tohex (number % base);  i = 1;  number = number / base;  while (number != 0)    {      if (dots && (i % 4) == 0)	*(ptr--) = '.';      *(ptr--) = tohex (number % base);      i++;      number = number / base;    }  if (numdigs == 0)    {      numdigs = i;    }  else    {      while(i < numdigs)	{	  if (dots && (i % 4) == 0)	    *(ptr--) = '.';	  *(ptr--) = '0';	  i++;	}    }  return ptr + 1;}char *int2str (target_register_t number, int base, int numdigs){  return ull2str((unsigned long long)number, base, numdigs);}#if HAVE_DOUBLE_REGSstatic char *double2str(double d){  switch(sizeof(double))    {      case sizeof(unsigned int):	return ull2str(*((unsigned int *)&d), 16, sizeof(double) * 2);	break;#if __LONG_MAX__ != __INT_MAX__      case sizeof(unsigned long):	return ull2str(*((unsigned long *)&d), 16, sizeof(double) * 2);	break;#endif#if __LONG_LONG_MAX__ != __LONG_MAX__      case sizeof(unsigned long long):	return ull2str(*((unsigned long long *)&d), 16, sizeof(double) * 2);	break;#endif    }  return "....fixme...";}#endif#ifndef NO_MALLOCchar *strdup(const char *str){  char *x = malloc (strlen (str) + 1);  if (x != NULL)    strcpy (x, str);  return x;}#endiftarget_register_tget_pc(void){    return get_register(REG_PC);}#if defined(HAVE_BSP) && !defined(__ECOS__)static intget_register_type(regnames_t which){    int i;    for (i = 0; regtab[i].registername != NULL; i++)      if (regtab[i].registernumber == which)	return regtab[i].registertype;    return REGTYPE_INT;}#endifchar *get_register_str (regnames_t which, int detail, int valid){#ifdef SPECIAL_REG_OUTPUT  char *res;  if ((res = SPECIAL_REG_OUTPUT (which, detail)) != NULL)    {      return res;    }#endif  if (valid == 0)    {      switch (sizeof (target_register_t))        {        case 1:  return "...";        case 2:  return ".....";        case 4:  return ".........";        case 8:  return ".................";        default: return ".........";        }    }  else    {      return int2str (get_register (which), 16, sizeof (target_register_t) * 2);    }}voidstore_register (regnames_t which, char *string){#ifdef SPECIAL_REG_STORE  if (SPECIAL_REG_STORE(which, string))    return;#endif  put_register (which, str2int (string, 16));}

⌨️ 快捷键说明

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