コード例 #1
0
ファイル: xsh_date.c プロジェクト: 36Chambers/xinu-arm
/**
 * Shell command (date).
 * @param nargs  number of arguments in args array
 * @param args   array of arguments
 * @return OK for success, SYSERR for syntax error
 */
shellcmd xsh_date(int nargs, char *args[])
{


    /* Output help, if '--help' argument was supplied */
    if (nargs == 2 && strncmp(args[1], "--help", 7) == 0)
    {
        printf("Usage: %s\n\n", args[0]);
        printf("Description:\n");
        printf("\tDisplays current time\n");
        printf("Options:\n");
        printf("\t--help\tdisplay this help and exit\n");
        return OK;
    }

    /* Check for correct number of arguments */
    if (nargs > 1)
    {
        fprintf(stderr, "%s: too many arguments\n", args[0]);
        fprintf(stderr, "Try '%s --help' for more information\n",
                args[0]);
        return SYSERR;
    }
    if (nargs < 1)
    {
        fprintf(stderr, "%s: too few arguments\n", args[0]);
        fprintf(stderr, "Try '%s --help' for more information\n",
                args[0]);
        return SYSERR;
    }

    printDate(get_datetime());

    return OK;
}
コード例 #2
0
void
tcpobserver::exiting_socket(pid_t pid)
{
    int fd;

    fd = ptrace(PTRACE_PEEKUSER, pid, RAX * 8, NULL);

    if ((m_proc[pid].m_domain == AF_INET || m_proc[pid].m_domain == AF_INET6) &&
        m_proc[pid].m_type == SOCK_STREAM &&
        (m_proc[pid].m_protocol == IPPROTO_TCP ||
         m_proc[pid].m_protocol == 0) && fd != -1) {
        double datetime;
        std::string domain;

        if (m_proc[pid].m_domain == AF_INET)
            domain = "IPv4";
        else
            domain = "IPv6";

        m_fd_set.insert(fd);

        datetime = get_datetime();

        std::cerr << std::setprecision(19)
                  << "datetime@" << datetime
                  << " op@socket"
                  << " fd@" << fd
                  << " protocol@" << domain
                  << " pid@" << pid
                  << std::endl;
    }
}
コード例 #3
0
char * s_systemdt()
{
    get_datetime();

    sprintf(naji_buffer, "%s", asctime(date_time));

    return naji_buffer;
}
コード例 #4
0
char * s_ayinkaci()
{

    get_datetime();

    sprintf(naji_buffer, "%i", date_time->tm_mday);

    return naji_buffer;
}
コード例 #5
0
char * s_yil()
{

    get_datetime();

    sprintf(naji_buffer, "%i", ( (1900) + (date_time->tm_year) ) );

    return naji_buffer;
}
コード例 #6
0
void telltime()
{
    get_datetime();

    printf("%02i", date_time->tm_hour);
    putchar(':');
    printf("%02i", date_time->tm_min);
    putchar(':');
    printf("%02i", date_time->tm_sec);

}
コード例 #7
0
char * s_today()
{
    int i;

    get_datetime();

    for (i=0; i<=6; i++)
        if (date_time->tm_wday == i)
            return (days[i]);

    return ("(DAY ERROR)");
}
コード例 #8
0
char * s_bugun()
{
    int i;

    get_datetime();

    for (i=0; i<=6; i++)
        if (date_time->tm_wday == i)
            return (gunler[i]);

    return ("(GUN HATA)");
}
コード例 #9
0
char * s_ay()
{
    int i;

    get_datetime();

    for (i=0; i<=11; i++)
        if (date_time->tm_mon == i)
            return (aylar[i]);

    return ("(AY HATA)");
}
コード例 #10
0
char * s_month()
{
    int i;

    get_datetime();

    for (i=0; i<=11; i++)
        if (date_time->tm_mon == i)
            return (months[i]);

    return ("(MONTH ERROR)");
}
コード例 #11
0
void saat()
{
    get_datetime();

    printf("%02i", date_time->tm_hour);  /* saat   */

    putchar(':');

    printf("%02i", date_time->tm_min);   /* dakika */

    putchar(':');

    printf("%02i", date_time->tm_sec);   /* saniye */

}
コード例 #12
0
ファイル: TinyGPS.cpp プロジェクト: Lemures/TinyGPS_SparkCore
void TinyGPS::crack_datetime(int *year, byte *month, byte *day, 
  byte *hour, byte *minute, byte *second, byte *hundredths, unsigned long *age)
{
  unsigned long date, time;
  get_datetime(&date, &time, age);
  if (year) 
  {
    *year = date % 100;
    *year += *year > 80 ? 1900 : 2000;
  }
  if (month) *month = (date / 100) % 100;
  if (day) *day = date / 10000;
  if (hour) *hour = time / 1000000;
  if (minute) *minute = (time / 10000) % 100;
  if (second) *second = (time / 100) % 100;
  if (hundredths) *hundredths = time % 100;
}
コード例 #13
0
void
tcpobserver::exiting_close(pid_t pid)
{
    if (m_proc[pid].m_sockfd < 0)
        return;


    double datetime;

    datetime = get_datetime();

    std::cerr << std::setprecision(19)
              << "datetime@" << datetime
              << " op@close"
              << " fd@" << m_proc[pid].m_sockfd
              << " pid@" << pid
              << std::endl;

    m_fd_set.erase(m_proc[pid].m_sockfd);
}
コード例 #14
0
ファイル: dwmstatus.c プロジェクト: dunz0r/configs
int main(void) {
	char *status;
	char *datetime;
	char *battery_status;
	int bat0;

	char hostname[16];
	//hostname[15] = '\0';
	gethostname(hostname, 15);
	int is_laptop;
	is_laptop = strcmp(hostname, "miku");


	if (!(dpy = XOpenDisplay(NULL))) {
		fprintf(stderr, "Cannot open display.\n");
		return 1;
	}

	if((status = malloc(200)) == NULL)
		exit(1);
	for(;;sleep(10)) {
		datetime = get_datetime();
		if(!is_laptop) {
			battery_status = get_battery_status();
			bat0 = get_battery();
			snprintf(status, 200, "%s%d%% | %s",
				battery_status, bat0, datetime);
		} else {
			snprintf(status, 200, "%s", datetime);
		}

		setstatus(status);
	}
	free(datetime);
	free(status);
	XCloseDisplay(dpy);
	return 0;
}
コード例 #15
0
void
tcpobserver::exiting_listen(pid_t pid)
{
    int result;

    result = ptrace(PTRACE_PEEKUSER, pid, RAX * 8, NULL);

    if (result < 0)
        return;


    double datetime;

    datetime = get_datetime();

    m_fd_set.insert(m_proc[pid].m_sockfd);

    std::cerr << std::setprecision(19)
              << "datetime@" << datetime
              << " op@listen"
              << " fd@" << m_proc[pid].m_sockfd
              << " pid@" << pid
              << std::endl;
}
コード例 #16
0
ファイル: Gps.cpp プロジェクト: ovenystas/ardumower
void Gps::crack_datetime(int *year, byte *month, byte *day, byte *hour,
                         byte *minute, byte *second, byte *hundredths,
                         unsigned long *age)
{
  unsigned long date, time;
  get_datetime(&date, &time, age);
  if (year)
  {
    *year = (int)(date % 100);
    *year += *year > 80 ? 1900 : 2000;
  }
  if (month)
  {
    *month = (byte)((date / 100) % 100);
  }
  if (day)
  {
    *day = (byte)(date / 10000);
  }
  if (hour)
  {
    *hour = (byte)(time / 1000000);
  }
  if (minute)
  {
    *minute = (byte)((time / 10000) % 100);
  }
  if (second)
  {
    *second = (byte)((time / 100) % 100);
  }
  if (hundredths)
  {
    *hundredths = (byte)(time % 100);
  }
}
コード例 #17
0
void bimp_start_batch(gpointer parent_dialog)
{
    bimp_set_busy(TRUE);

    // initialization
    g_print("\nBIMP - Batch Manipulation Plugin\nStart batch processing...\n");
    processed_count = 0;
    success_count = 0;
    total_images = g_slist_length(bimp_input_filenames);
    bimp_progress_bar_set(0.0, "");
    
    bimp_init_batch();
    
    current_datetime = get_datetime();
    common_folder_path = NULL;

    if (bimp_opt_keepfolderhierarchy){
        int i, j;
        gboolean need_hierarchy = FALSE;
        char * path = NULL;
        char ** common_folder;
        char ** current_folder;
        size_t common_folder_size, current_folder_size;
        
        path = comp_get_filefolder(g_slist_nth(bimp_input_filenames,0)->data);
        
        common_folder = get_path_folders(path);
        common_folder_size = 0;
        for (common_folder_size = 0; common_folder[common_folder_size] != NULL; ++common_folder_size);

        for (i=1; i < total_images ; i++)
        {
            path = comp_get_filefolder(g_slist_nth(bimp_input_filenames,i)->data);
            current_folder = get_path_folders (path);
            for (current_folder_size = 0; current_folder[current_folder_size] != NULL; ++current_folder_size);

            // The common path is at most as long as the shortest path
            while (common_folder_size > current_folder_size)
            {
                need_hierarchy = TRUE;
                g_free(common_folder[common_folder_size-1]);
                common_folder[common_folder_size-1] = NULL;
                common_folder_size--;
            }
            
            for (j=0; j < common_folder_size; ++j)
            {
                if (strcmp(common_folder[j], current_folder[j]) != 0) {
                    need_hierarchy = TRUE;
                    while (common_folder_size > j)
                    {
                        g_free(common_folder[common_folder_size-1]);
                        common_folder[common_folder_size-1] = NULL;
                        common_folder_size--;
                    }
                    break;
                }
            }

            g_strfreev(current_folder);
        }

        if (need_hierarchy) 
            common_folder_path = g_strjoinv(FILE_SEPARATOR_STR, common_folder);
        
        g_strfreev(common_folder);
    }
    
    // start on a new thread
    guint batch_idle_tag = g_idle_add((GSourceFunc)process_image, parent_dialog);
}
コード例 #18
0
ファイル: d_deser.c プロジェクト: hackshields/antivirus
static AVP_dword DATA_PARAM ReadPropertyItem( Serialize* sz, AVP_byte type, void* val ) {
	AVP_word size;
	AVP_byte tmp;
	AVP_Bin_Item* v;

	switch( type ) {
		case avpt_nothing : return 1;

		// Byte-sized types
		case avpt_char    :
		case avpt_byte    :
		case avpt_group   : return get_byte(sz, (AVP_byte *) val);

		case avpt_bool    : 
			size = (AVP_word)get_byte( sz, &tmp);
			*(AVP_bool *)val = tmp;
			return size;

		// Word-sized types            
		case avpt_wchar   :
		case avpt_short   :
		case avpt_word    : return get_word(sz, (AVP_word *) val);

		// Dword-sized types      
		case avpt_long    :
		case avpt_dword   :
		case avpt_int     :
		case avpt_uint    : return get_dword( sz, (AVP_dword*)val );

		// QWord-sized types
		case avpt_qword   :
		case avpt_longlong: return get_qword( sz, (AVP_qword*)val );

		// size_t-sized types
		case avpt_size_t  : return get_size_t( sz, (AVP_size_t*)val );

		// Custom structures
		case avpt_date    : return get_date(sz, (AVP_date *)val);
		case avpt_time    : return get_time(sz, (AVP_time *)val);
		case avpt_datetime: return get_datetime(sz, (AVP_datetime *) val);

		// String
		case avpt_str :                           
			if ( get_word( sz, &size) == sizeof(size) ) {
				if ( size != USHRT_MAX ) {
					AVP_char * ptr = allocator( size + sizeof(AVP_char) );
					_ASSERT( ptr );
					*(AVP_char **)val = ptr;

					if ( get_bytes(sz,ptr,size) == size ) {
						ptr[size] = 0;
						return sizeof(size) + size;
					}
					else {
						ptr[0] = 0;
						return 0;
					}
				}
				else
					return sizeof(size);
			}
			else
				return 0;

		// Windows unicode string
		case avpt_wstr :
			if ( get_word( sz, &size) == sizeof(size) ) {
				if ( size != USHRT_MAX ) {
					AVP_wchar * ptr = allocator( size + sizeof(AVP_wchar) );
					_ASSERT( ptr );
					*(AVP_wchar **)val = ptr;

					if ( get_bytes(sz,ptr,size) == size ) {
						ptr[size/sizeof(AVP_wchar)] = 0;
						convert_wchar_string ((wchar_t*) ptr);
						return sizeof(size) + size;
					}
					else {
						ptr[0] = 0;
						return 0;
					}
				}
				else
					return sizeof(size);
			}
			else
				return 0;

		case avpt_bin :
			v = val;
			v->size = 0;
			if ( get_word( sz, &size) == sizeof(size) )
			{
				v->size = size;
				if ( v->size ) {
					v->data = allocator( v->size );
					_ASSERT( v->data );
				}
				else
					v->data = 0;
				if ( !v->size || (get_bytes(sz,v->data,v->size) == v->size) ) 
					return sizeof(v->size) + v->size;
				else 
					return 0;
			}
			else
				return 0;

		default :
			_RPT0( _CRT_ASSERT, "Bad property type" );
			return 0;
	}

	return size ? size + sizeof(AVP_Property) : 0;
}
コード例 #19
0
void
tcpobserver::exiting_connect(pid_t pid)
{
    int result;

    result = ptrace(PTRACE_PEEKUSER, pid, RAX * 8, NULL);

    if (result < 0)
        return;

    if (m_proc[pid].m_addrlen < sizeof(long))
        return;


    sockaddr_storage saddr;
    std::string      domain;
    double           datetime;
    uint16_t         port;
    char             addr[64];

    read_data(pid, &saddr, m_proc[pid].m_addr, sizeof(long));

    switch (saddr.ss_family) {
    case AF_INET:
    {
        sockaddr_in *saddr_in;

        if (m_proc[pid].m_addrlen < sizeof(sockaddr_in))
            return;

        read_data(pid, &saddr, m_proc[pid].m_addr, sizeof(sockaddr_in));

        saddr_in = (sockaddr_in*)&saddr;

        inet_ntop(AF_INET, &saddr_in->sin_addr, addr, sizeof(addr));
        port   = ntohs(saddr_in->sin_port);
        domain = "IPv4";

        break;
    }
    case AF_INET6:
    {
        sockaddr_in6 *saddr_in6;

        if (m_proc[pid].m_addrlen < sizeof(sockaddr_in6))
            return;

        read_data(pid, &saddr, m_proc[pid].m_addr, sizeof(sockaddr_in6));

        saddr_in6 = (sockaddr_in6*)&saddr;

        inet_ntop(AF_INET6, &saddr_in6->sin6_addr, addr, sizeof(addr));
        port   = ntohs(saddr_in6->sin6_port);
        domain = "IPv6";

        break;
    }
    default:
        return;
    }

    datetime = get_datetime();

    m_fd_set.insert(result);

    std::cerr << std::setprecision(19)
              << "datetime@" << datetime
              << " op@connect"
              << " fd@" << result
              << " protocol@" << domain
              << " addr@" << addr
              << " port@" << port
              << " pid@" << pid
              << std::endl;
}
コード例 #20
0
ファイル: screener.c プロジェクト: rapzo/monitor
/**
 * Método que executa a procura de uma palavra numa entidade que contém
 * informação sobre o ficheiro a procurar entre outros parametros. Escreve o
 * resultado da execução na pipe referida como último argumento e retorna o
 * ńúmero de bytes escritos na pipe.
 * @param  entity Entidade a usar
 * @param  word   Palavra a procurar
 * @param  pipe   Pipe de escrita
 * @return        Número de bytes escritos na pipe. -1 em caso de erro.
 */
int lookup_word(scrnr *entity, char *word, int duration) {
  int process_pd[2], command_pd[2], n = 0, status, i = 0;
  char buffer[MAXBUFFER], *result;
  time_t t;
  pid_t pid;
  struct sigaction actusr;

  actusr.sa_handler = catch_sigusr;
  actusr.sa_flags = 0;
  if (
    (sigemptyset(&actusr.sa_mask)) == -1 ||
    (sigaction(SIGUSR1, &actusr, NULL) == -1)
  ) {
    perror("Failed to catch SIGUSR1.");
    return -1;
  }

  if (pipe(process_pd) == -1 || pipe(command_pd) == -1) {
    perror("Pipe creation error.\n");
    return -1;
  }

  for (i = 0; i < 2; i++) {
    if ((pid = fork()) <= 0)
      break;
  }

  if (pid == -1) {

    perror("Creating control fork.");
    return -1;

  } else if (pid == 0) {
    if (i == 0) {

      setpgid(0, entity->pid);
      if (run_tail(entity, command_pd[1]) == -1) {
        return -1;
      }

    } else if (i == 1) {

      setpgid(0, entity->pid);
      if (run_grep(entity, word, command_pd[0], process_pd[1]) == -1) {
        return -1;
      }

    }
  } else if (pid > 0) {

    while (!stop) {
      n = read(process_pd[0], buffer, MAXBUFFER);

      if (n > 0) {
        // Tempo da leitura
        // ok, pode ser ums milésimos de segundo diferentes da escrita no 
        // ficheiro, mas pouco
        t = time(NULL);

        // Remove o último '\n' comum das linhas de execuções como o tail e o 
        // grep
        buffer[n - 1] = '\0';
        result = malloc(sizeof(char) * n);
        strcpy(result, buffer);

        // É melhor não montar altas strings quando o output pode ser feito aqui
        //sprintf(result, "%s - %s - \"%s\"", get_datetime(&t), entity->name, tmp);

        printf("%s - %s - \"%s\"\n", get_datetime(&t), entity->name, result);
        free(result);
      }

    }
    // Comentar isto porque está a deixar processos defuncts :-\
    // wait(&status);
  }

  return 0;
}
コード例 #21
0
ファイル: xml.c プロジェクト: MigNov/pvr
char *xml_query_by_id(char *xmlFile, char *xPath, int id) {
	xmlDocPtr doc;
	xmlParserCtxtPtr pctxt;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr op;
	xmlNodeSetPtr nodeset;
	char *data = NULL;
	int num;

	if ((xmlFile == NULL) || (strlen(xmlFile) < 1))
		return NULL;

	if (xmlFile[0] != '<') {
		if (access(xmlFile, R_OK) != 0) {
			fprintf(stderr, "Error: File %s doesn't exist or is not accessible for reading.\n", xmlFile);
			return NULL;
		}

		doc = xmlParseFile(xmlFile);
	}
	else {
		pctxt = xmlCreateDocParserCtxt((xmlChar *)xmlFile);
		doc = xmlCtxtReadDoc(pctxt, (xmlChar *)xmlFile, NULL, NULL, XML_PARSE_NOWARNING | XML_PARSE_NOERROR);

		/* A little hack, but working */
		do { char tmp[1024] = { 0 }; char *dtmp = get_datetime(); snprintf(tmp, sizeof(tmp), "[%s ", dtmp); free(dtmp); dtmp=NULL; } while (0);
	}

	context = xmlXPathNewContext(doc);
	if (context == NULL) {
		DPRINTF("Error in xmlXPathNewContext\n");
		return NULL;
	}

	DPRINTF("Trying to access xPath node %s (pos %d)\n", xPath, id);
	op = xmlXPathEvalExpression( (xmlChar *)xPath, context);
	xmlXPathFreeContext(context);
	if (op == NULL) {
		DPRINTF("Error in xmlXPathEvalExpression\n");
		return NULL;
	}

	if(xmlXPathNodeSetIsEmpty(op->nodesetval)){
		xmlXPathFreeObject(op);
		DPRINTF("No result\n");
		return NULL;
	}

	nodeset = op->nodesetval;
	num = nodeset->nodeNr;

#if 0
	for (i = 0; i < num; i++) {
		data = (char *)xmlNodeListGetString(doc, (nodeset->nodeTab[i])->xmlChildrenNode, 1);
		DPRINTF("%d. >>> %s\n", i, data);
	}
#endif

	DPRINTF("Current num value is %d, id value is %d\n", num, id);
	if (num > id) {
		char *tmp = (char *)xmlNodeListGetString(doc, (nodeset->nodeTab[id])->xmlChildrenNode, 1);

		data = strdup(tmp);
		DPRINTF("Got data element of '%s'\n", tmp);
	}
	else
		DPRINTF("Trying to access element out of bounds (id > num)\n");

	xmlXPathFreeObject(op);

	xmlFreeDoc(doc);
	xmlCleanupParser();

	return data;
}
コード例 #22
0
ファイル: translate.c プロジェクト: jlunz/AVR-Webserver
/**
 *	\ingroup allgfunktionen
 *	Zeile nach Parameter durchsuchen und ersetzen
 *
 *	Mögliche Variable haben ein Prozentzeichen (\%) vorangestellt und sind:
 *	\li \b DATE	Tagesdatum
 *	\li \b USDATE	Tagesdatum im Internet kompatiblen Format
 *	\li	\b WDAY	Wochentag, abgekürzt auf 3 Buchstaben
 *	\li \b TIME	aktuelle Zeit
 *	\li \b VA\@nn	analoger Wert nn
 *	\li \b OW\@nn	nn = 00 bis MAXSENSORS-1 gibt 1-Wire Temperaturwerte in 1/10 °C aus
 *	\li \b OW\@mm	mm = 20 bis MAXSENSORS-1+20 gibt 1-Wire Temperaturwerte in °C mit einer Nachkommastelle aus<br>
 *	d.h. OW\@nn für Balkenbreite verwenden und OW\@mm für Celsius-Anzeige
 *	\li \b PORTnm	Status des Ausgangs Pin m (0, 1, ...) an Port n (A, B, C, ...)
 *	\li \b PINnm	Status des Eingangs Pin m (0, 1, ...) an Port n (A, B, C, ...)<br>
 *		 dargestellt durch eine jpg-Datei ledon.jpg / ledoff.jpg
 *
 *	\param[in] buffer String mit eingebetteten Parametern
 *	\param[in,out] ptr Speicherplatz des konvertierten Strings
 *	\param[out] nbytes Anzahl verarbeiteter Bytes
 *	\returns Anzahl der Bytes im konvertierten String
*/
uint16_t translate(char *buffer, char **ptr, uint16_t *nbytes )
{
	uint16_t len = 0;
	char *src = buffer;
	char *dest = *ptr;

	while (*src) {
		
		if (*src != '%') {
			*dest++ = *src++;
			++len;
		}
		else {
			++src;

			if (strncasecmp_P(src,PSTR("TIME"),4)==0) {
				uint16_t year;
				uint8_t month, day, hour, min, sec;
				FUNCS_DEBUG(" - Zeit");
				get_datetime(&year, &month, &day, &hour, &min, &sec);
				sprintf_P(dest,PSTR("%2.2d:%2.2d:%2.2d"),hour,min,sec);
				src += 4;
			}

			else if (strncasecmp_P(src,PSTR("DATE"),4)==0) {
				uint16_t year;
				uint8_t month, day, hour, min, sec;
				FUNCS_DEBUG(" - Datum");
				get_datetime(&year, &month, &day, &hour, &min, &sec);
				sprintf_P(dest,PSTR("%2.2d.%2.2d.%4d"),day,month,year);
				src += 4;
			}

			else if (strncasecmp_P(src,PSTR("USDATE"),6)==0) {
				FUNCS_DEBUG(" - USDatum");
				GetUSdate(dest);
				src += 6;
			}

			else if (strncasecmp_P(src,PSTR("WDAY"),4)==0) {
				FUNCS_DEBUG(" - Wochentag");
				memcpy_P(dest,&Tagesnamen[TM_DOW*3],3);
				dest += 3;
				*dest = '\0';
				src += 4;
			}

			#if USE_ADC
			else if (strncasecmp_P(src,PSTR("VA@"),3)==0) {	
				FUNCS_DEBUG(" - Analogwert");
				uint8_t i = (*(src+3)-48)*10 + (*(src+4)-48);
				itoa (var_array[i],dest,10);
				src += 5;
			}
			#endif

			#if 0
			//
			// KTY0D gibt Differenzmessung in dezimalen Grad aus
			// KTY0x gibt Wert in 1/10 Grad aus
			// entsprechend KTY1D/KTY1x für 2. Differenzmessung
			//
			else if (strncasecmp_P(src,PSTR("KTY"),3)==0) {	
				FUNCS_DEBUG(" - KTY-Wert");
				b = (*(src+3)=='0')? KTY_SENS1 : KTY_SENS2;	// Speicherplätze der Differenzmessungen

				int16_t T = (int16_t) (var_array[b] * -0.62 + 224.3);

				if (*(src+4)=='D') {
					int8_t j = (int8_t)(T / 10);
					itoa (j,dest,10);

					while (*dest++)			// neues Ende finden
						++len;
					--dest;

					*dest++ = ',';
					++len;

					j = T % 10;				// Nachkommastelle
					itoa (j,dest,10);
				} else if (T < 0) {
					T = -T;					// Vorzeichen abschneiden
					itoa (T,dest,10);

					while (*dest++)			// neues Ende finden
						++len;
					--dest;

					// "style rechtsbündig" anhängen
					strcpy_P(dest,PSTR("\" style=\"float: right"));
				}
				else {
					itoa (T,dest,10);
				}
				src += 5;
			}
			#endif
			
#if USE_OW
			/*
			*	1-Wire Temperatursensoren
			*	-------------------------
			*	OW@nn	nn = 00 bis MAXSENSORS-1 gibt Werte in 1/10 °C aus
			*	OW@mm	mm = 20 bis MAXSENSORS-1+20 gibt Werte in °C mit einer Nachkommastelle aus
			*	d.h. OW@nn für Balkenbreite verwenden und OW@mm für Celsius-Anzeige
			*/
			else if (strncasecmp_P(src,PSTR("OW@"),3)==0) {	
				FUNCS_DEBUG(" - 1-wire");
				uint8_t i = (*(src+3)-48)*10 + (*(src+4)-48);
				if (i >= 20) {	// Offset bei Sensor# abziehen und Wert als Dezimalzahl ausgeben
					i -= 20;
					dtostrf(ow_array[i] / 10.0,3,1,dest);
				} else {
					itoa (ow_array[i],dest,10);
				}
				src += 5;
			}
#endif

			//Einsetzen des Port Status %PORTxy durch "checked" wenn Portx.Piny = 1
			//x: A..G  y: 0..7 
			else if (strncasecmp_P(src,PSTR("PORT"),4)==0) {
				FUNCS_DEBUG(" - Portstatus");
				uint8_t pin  = (*(src+5)-48);	
				uint8_t b = 0;
				switch(*(src+4)) {
					case 'A':
						b = (PORTA & (1<<pin));
						break;
					case 'B':
						b = (PORTB & (1<<pin));
						break;
					case 'C':
						b = (PORTC & (1<<pin));
						break;
					case 'D':
						b = (PORTD & (1<<pin));
						break; 
				}
				
				if(b) {
					//strcpy_P(dest, PSTR("checked"));
					strcpy_P(dest, PSTR("ledon.gif"));
				}
				else {
					//strcpy_P(dest, PSTR("unchecked"));
					strcpy_P(dest, PSTR("ledoff.gif"));
				}

				src += 6;
			}
			
			//Einsetzen des Pin Status %PI@xy bis %PI@xy durch "ledon" oder "ledoff"
			//x = 0 : PINA / x = 1 : PINB / x = 2 : PINC / x = 3 : PIND
			else if (strncasecmp_P(src,PSTR("PIN"),3)==0) {
				FUNCS_DEBUG(" - Eingangswert");
				uint8_t pin  = (*(src+4)-48);	
				uint8_t b = 0;
				switch(*(src+3)) {
					case 'A':
						b = (PINA & (1<<pin));
						break;
					case 'B':
						b = (PINB & (1<<pin));
						break;
					case 'C':
						b = (PINC & (1<<pin));
						break;
					case 'D':
						b = (PIND & (1<<pin));
						break;    
				}
				
				if(b) {	// gesetztes bit bedeutet: nix dran, da Pullup Widerstand
					strcpy_P(dest, PSTR("ledoff.gif"));
				} else {
					strcpy_P(dest, PSTR("ledon.gif"));	// Schalter auf Masse geschlossen
				}

				src += 5;
			}
			else {	// nix gefunden -> '%' speichern
				*dest++ = '%';
				*dest = 0;
				++len;
			}

			while (*dest++)	// neues Ende finden
				++len;
			--dest;
		}

	}
	*ptr = dest;
	*nbytes = (uint16_t)(src - buffer);
	return len;
}