Forum: Compiler & IDEs Umgeschriebene Funktion funktioniert nicht


von Sam .. (sam1994)


Lesenswert?

Hi

Ich möchte meinen Webserver beschränkt PHP - Fähig machen. D.h. ich 
möchte ihm die Gebräuchlichsten Befehle beibringen. Nun fangen aber die 
Probleme an: Mein umgestellter code bringt Firefox dazu irgendetwas 
internes anzuzeigen.
Unter Chrome siehts nicht besser aus. Außerdem füllt die Seite nicht 
mehr den ganze Bildschirm aus, d.h. es werden Zeichen entfernt, die 
nicht entfernt werden sollten.
1
NTP-Zeit: 18:21:43 wird durch das Makro %:2.0.1) Gecko/20100101 Firefox/4.0.1 Accept: image/png,image/*;q=0.8,*/*;q=0.5 Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 DNT: 1 Connection: keep-alive Referer: http://xxxx.dyndns.org/format.css Cache-Control: max-age=0 cTIME angezeigt.
Dazu der Seitenquelltext
1
<div class="box3">
2
3
<h3 class="boxheader">Zeit</h3>
4
NTP-Zeit: 18:21:43 wird durch das Makro %:2.0.1) Gecko/20100101 Firefox/4.0.1
5
Accept: image/png,image/*;q=0.8,*/*;q=0.5
6
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
7
Accept-Encoding: gzip, deflate
8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
9
Keep-Alive: 115
10
DNT: 1
11
Connection: keep-alive
12
Referer: http://xxxx.dyndns.org/format.css
13
Cache-Control: max-age=0
14
15
cTIME angezeigt.
16
17
</div>
Ürsprünglich in Html:
1
NTP-Zeit: %TIME wird durch das Makro %%TIME angezeigt.
Das ist der ursprüngliche Code. Er funktioniert ersetzt aber %%TIME 
nicht.
1
uint16_t translate(char *buffer, char **ptr, uint16_t *nbytes )
2
{
3
  uint16_t len = 0;
4
  char *src = buffer;
5
  char *dest = *ptr;
6
7
  while (*src) {
8
    
9
    if (*src != '%') {
10
      *dest++ = *src++;
11
      ++len;
12
    }
13
    else {
14
      ++src;
15
16
      if(strncasecmp_P(src,PSTR("TIME"),4)==0) 
17
      {
18
        sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second);
19
        src += 4;
20
      }
21
      else {  // nix gefunden -> '%' speichern
22
        *dest++ = '%';
23
        *dest = 0;
24
        ++len;
25
      }
26
27
      while (*dest++)  // neues Ende finden
28
        ++len;
29
      --dest;
30
    }
31
32
  }
33
  *ptr = dest;
34
  *nbytes = (uint16_t)(src - buffer);
35
  return len;
36
}

Diser hier funktioniert nicht:
1
uint8_t checkString(char* src, char* dest)
2
{
3
  if(strncasecmp_P(src,PSTR("TIME"),4)==0) 
4
  {
5
    sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second);
6
    return 4;
7
  }
8
  else if(*src == '%')
9
  {
10
    *dest = '%';
11
    return 1;
12
  }
13
  return 0;
14
}//Gibt die übersprungenen Zeichen (src) zurück
15
uint16_t translate(char *buffer, char **ptr, uint16_t *nbytes )
16
{
17
  uint16_t len = 0;
18
  char *src = buffer;
19
  char *dest = *ptr;
20
21
  while (*src) 
22
  {
23
    if(*src != '%')
24
    {
25
      if(*src != '<')
26
      {
27
        copy:
28
          *dest++ = *src++;
29
          len++;
30
      }
31
      else if(strncasecmp_P(src,PSTR("<?php"),5)==0)
32
      {
33
        src += 5;
34
        //PHP Interpreter
35
      }
36
      else
37
        goto copy;
38
    }
39
    else
40
    {//*src==%
41
      ++src;
42
      uint8_t ins = checkString(src, dest);
43
      if(ins != 0)
44
      {
45
        src += ins;
46
        while (*dest++)  // neues Ende finden
47
          ++len;
48
        --dest;
49
      }
50
      else
51
      {
52
        *dest++ = '%';
53
        len++;
54
      }
55
    }
56
  }
57
  *ptr = dest;
58
  *nbytes = (uint16_t)(src - buffer);
59
  return len;
60
}

von Peter II (Gast)


Lesenswert?

Es ist doch estmal egal was Firefox und Co machen, du musst erstmal 
rausbekommen was dein Webserver als output generiert. (Eventuell 
Netzwerkmitleser verwenden wenn quelltext anzeigen nicht reicht)

Der code ist recht schwer zu durchschauen, es muss nicht mal an diesem 
code liegen weil ja "irgendwelche" Zeiger reingereicht werden wohin du 
jetzt daten schreibt. Woher sollen wir wissen ob dort überhaupt genug 
platz ist?

Auserdem finde ich das Konzept nicht gerade gut. Warum muss es denn PHP 
like sein? Kannst du nicht einfach Platzhalter verwenden oder willst du 
wirklich php nachbauen?

von Sam .. (sam1994)


Lesenswert?

Peter II schrieb:
> Es ist doch estmal egal was Firefox und Co machen, du musst erstmal
> rausbekommen was dein Webserver als output generiert. (Eventuell
> Netzwerkmitleser verwenden wenn quelltext anzeigen nicht reicht)
Ich finde nur komisch was am Ende da rauskommt

> Der code ist recht schwer zu durchschauen, es muss nicht mal an diesem
> code liegen weil ja "irgendwelche" Zeiger reingereicht werden wohin du
> jetzt daten schreibt. Woher sollen wir wissen ob dort überhaupt genug
> platz ist?
Der erste Code ist Teil der Software von Ulrich Radig und funktioniert. 
Der 2. sollte die gleiche Funktion haben, tut es aber nicht.

> Auserdem finde ich das Konzept nicht gerade gut. Warum muss es denn PHP
> like sein? Kannst du nicht einfach Platzhalter verwenden oder willst du
> wirklich php nachbauen?
An der Stelle "PHP Interpreter möchte ich den PHP code interpretieren. 
Es soll z.b. möglich sein, eine WEbseite dynamisch zu laden. Das ganze 
natürlich mit einschränkungen: Für Variablen werde ich z.b. ein Byte 
array definieren. Sobald man z.b. mehr als 400B beansprucht gibt das 
Script einen Fehler aus.

Ich glaube ich werde mir ein PHP Tutorial vornehmen und nacheinander 
versuchen, dass alle Beispiele funktionieren.

von Sam .. (sam1994)


Lesenswert?

funktioniert jetzt,
1
uint8_t checkString(char* src, char* dest)
2
{
3
  if(strncasecmp_P(src,PSTR("TIME"),4)==0) 
4
  {
5
    sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second);
6
    return 4;
7
  }
8
  else if(*src == '%')
9
  {
10
    *dest++ = '%';
11
    *dest  = 0; //das letzte Zeichen muss natürlich auch wie oben 0 sein.
12
    return 1;
13
  }
14
  return 0;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.