Example #1
0
int main(void){
	/*下边这样 会出错
	char *src = "They are my friends!";
	char *target = "aeiou";
	*/
	char src[] = "They are my friends!";
	char target[] = "aeiou";

	delete_ch(src, target);
	printf("after delete, src : %s\n", src);

	return 0;
}
Example #2
0
int process_menu(uint8_t scancode)
{
  static union _modifier_state modifier_state;
  static uint8_t last_scancode;
  uint8_t ret=0;

  //Nur Flanke auswerten
  if(last_scancode==0xff && scancode!=0xff)
  {
    //Taste gedrückt?
    if(scancode!=0xff)
    {
#ifndef AVR
      caca_printf(cv,1,4,"8x8 scancode(0..63) = %i  ",scancode);
#endif
      //Wandlung von 8x8 Keycode auf ASCII oder Modifier
      uint8_t c=characters[scancode];
      uint8_t printable_char=0;
      //Prüfen ob ASCII Zeichen
      if(c)
      {
        //printf("%c %i\n",c,c);
        if(modifier_state.SHIFT || modifier_state.CAPS)
        { //alternative Belegung
          switch(c)
          {
            case '1': c='!'; break;
            case '2': c='"'; break;
            case '3': c='^'; break;
            case '4': c='$'; break;
            case '5': c='%'; break;
            case '6': c='&'; break;
            case '7': c='/'; break;
            case '8': c='('; break;
            case '9': c=')'; break;
            case '0': c='='; break;
            case '\\': c='?'; break;
            case '+': c='*'; break;
            case '#': c='\''; break;
            case '<': c='>'; break;
            case ',': c=';'; break;
            case '.': c=':'; break;
            case '@': c='|'; break;
            default:
             c = toupper(c);
             break;
          }
        }
        //Ist es auf dem LCD anzeigbar?
        if(isprint(c))
        {
          //Shift zurücksetzen
          modifier_state.SHIFT=0;
          printable_char=c;
        }
        else
        {
          //Andere Funktion mit ASCII Zeichen wie \b, \r, \t
          if(c=='\b')
          {
            if(cursor_x>0)
            {
              cursor_viewport_calc(_LEFT, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0);
              delete_ch(cursor_x, cursor_y);
            }
          }
          else if(c=='\r')
          {
            cursor_viewport_calc(_DOWN, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0);
            cursor_x=get_line_end(cursor_y);
            cursor_viewport_calc(0, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0);
          }
          //else if(c=='\t')
          // TODO? ;
        }
      }
      else /*muss ein Modifier, Cursor, Funktionstaste oder ähnlich sein*/
      {
        //printf("Not an ASCII char. scancode=%i\n",scancode);
        switch(scancode)
        {
          case _SHIFT: modifier_state.SHIFT=1; break;
          case _CAPS : modifier_state.CAPS=!modifier_state.CAPS; break;
          case _ALT  : modifier_state.ALT=!modifier_state.ALT; break;
          case _STRG : modifier_state.STRG=1; break;
          case _ENTF :if(modifier_state.SHIFT)
                        modifier_state.OVERWRITE=!modifier_state.OVERWRITE;
                      else
                        delete_ch(cursor_x, cursor_y);
                      break;
          case _ENDE :  cursor_x=(modifier_state.SHIFT)?0:get_line_end(cursor_y);
                        modifier_state.SHIFT=0;
                        break;
          case _ESC  :  clr_text_buffer(); cursor_x=0; cursor_y=0; break;
          default:
            break;
        }

        //Nur wenn nicht SHIFT, sonst könnten es
        //Cursortasten -_{} oder F3, F4 [] sein
        if(!modifier_state.SHIFT)
        {
          switch(scancode)
          {
            case _F1: if(font_size>3) font_size--; updated_settings=1; break;
            case _F2: if(font_size<9) font_size++; updated_settings=1; break;
            case _F4: strncpy(font_name,strcmp(font_name,"rowmans")? "rowmans": "scripts", 10); updated_settings=1; break;
            default:
              break;
          }
          cursor_viewport_calc(scancode, &cursor_x,&cursor_y,&viewport_x,&viewport_y, modifier_state.ALT);
        }
        else
          switch(scancode)
          {
            case _DOWN:  printable_char='-'; break;
            case _LEFT:  printable_char='_'; break;
            case _UP:    printable_char='{'; break;
            case _RIGHT: printable_char='}'; break;
            case _F3:    printable_char='['; break;
            case _F4:    printable_char=']'; break;
            default:
              break;
          }
          if(printable_char) //Shift zurücksetzen
            modifier_state.SHIFT=0;
      }
      if(isprint(printable_char))
      {
        //Einfügen oder Überschreiben?
        if(modifier_state.OVERWRITE)
          text_buffer[cursor_y][cursor_x]=printable_char;
        else
          insert_ch(cursor_x, cursor_y, printable_char);

        //Ein Zeichen weiter rechts
        cursor_viewport_calc(_RIGHT, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0);
      }
      ret=1;
    }
  }
  last_scancode=scancode;

#ifndef AVR
  if(scancode!=0xff)
  {
    char line0[LCD_WIDTH+1];
    char line1[LCD_WIDTH+1];

    strncpy(line0,text_buffer[viewport_y]+viewport_x,LCD_WIDTH);
    strncpy(line1,text_buffer[viewport_y+1]+viewport_x,LCD_WIDTH);
    line0[LCD_WIDTH]=0;
    line1[LCD_WIDTH]=0;

    draw_lcd(line0, line1, viewport_x, viewport_y, cursor_x, cursor_y);
  }
#endif

  return ret;
}