예제 #1
0
파일: chxj_css.c 프로젝트: atkonn/mod_chxj
char *
chxj_css_rgb_func_to_value(apr_pool_t *pool, const char *rgb_func_string)
{
  char *s = apr_pstrdup(pool, rgb_func_string);
  if (chxj_starts_with(s, "rgb")) {
    s += 3;
    s = qs_trim_string(pool, s);
    if (*s == '(') s++;
    int len = strlen(s);
    if (s[len - 1] == ')') s[len-1] = 0;
    char *pstat;
    char *red   = qs_trim_string(pool, apr_strtok(s, ",", &pstat));
    char *green = qs_trim_string(pool, apr_strtok(NULL, ",", &pstat));
    char *blue  = qs_trim_string(pool, apr_strtok(NULL, ",", &pstat));
    int red_per_flag   = 0;
    int green_per_flag = 0;
    int blue_per_flag  = 0;
    if (red && (pstat = strchr(red, '%'))) {
      *pstat = 0;
      red_per_flag = 1;
    }
    else {
      red = "0";
    }
    if (green && (pstat = strchr(green, '%'))) {
      *pstat = 0;
      green_per_flag = 1;
    }
    else {
      green = "0";
    }
    if (blue && (pstat = strchr(blue, '%'))) {
      *pstat = 0;
      blue_per_flag = 1;
    }
    else {
      blue = "0";
    }
    double d_red   = (double)chxj_atoi(red);
    double d_green = (double)chxj_atoi(green);
    double d_blue  = (double)chxj_atoi(blue);
    if (red_per_flag) {
      d_red   /= 100.0;
      d_red   *= 255;
    }
    if (green_per_flag) {
      d_green /= 100.0;
      d_green *= 255;
    }
    if (blue_per_flag) {
      d_blue  /= 100.0;
      d_blue  *= 255;
    }
    char *ret = apr_psprintf(pool, "#%02x%02x%02x", (int)d_red, (int)d_green, (int)d_blue);
    return ret;
  }
  else if (s[0] == '#') {
    if (strlen(&s[1]) == 3) {
      char red[2];
      char green[2];
      char blue[2];
      red[0]   = s[1];
      green[0] = s[2];
      blue[0]  = s[3];
      red[1]   = 0;
      green[1] = 0;
      blue[1]  = 0;
      int ired   = chxj_axtoi(red);
      int igreen = chxj_axtoi(green);
      int iblue  = chxj_axtoi(blue);
      return apr_psprintf(pool, "#%02x%02x%02x", ired * 0x10 + ired, igreen * 0x10 + igreen, iblue * 0x10 + iblue);
    }
  }
  else {
    switch(*s) {
    case 'a':
    case 'A':
      if (STRCASEEQ('q','Q', &s[1], "qua")) {
        /* aqua */
        return apr_pstrdup(pool, "#00ffff");
      }
      break;
    case 'b':
    case 'B':
      if (s[1] == 'l' || s[1] == 'L') {
        if (s[2] == 'a' || s[2] == 'A') {
          if (STRCASEEQ('c','C',&s[3], "ck")) {
            /* black */
            return apr_pstrdup(pool, "#000000");
          }
        }
        else if (s[2] == 'u' || s[2] == 'U') {
          if (s[3] == 'e' || s[3] == 'E') {
            /* blue */
            return apr_pstrdup(pool, "#0000ff");
          }
        }
      }
      break;
    case 'f':
    case 'F':
      if (STRCASEEQ('u','U',&s[1], "uchsia")) {
        /* fuchsia */
        return apr_pstrdup(pool, "#ff00ff");
      }
      break;
    case 'g':
    case 'G':
      if (s[1] == 'r'||s[1] == 'R') {
        if (STRCASEEQ('a','A', &s[2], "ay")) {
          /* gray */
          return apr_pstrdup(pool, "#808080");
        }
        else if (STRCASEEQ('e','E',&s[2], "een")) {
          /* green */
          return apr_pstrdup(pool, "#008000");
        }
      }
      break;
    case 'l':
    case 'L':
      if (STRCASEEQ('i','I', &s[1], "ime")) {
        /* lime */
        return apr_pstrdup(pool, "#00ff00");
      }
      break;
    case 'm':
    case 'M':
      if (STRCASEEQ('a','A', &s[1], "aroon")) {
        /* maroon */
        return apr_pstrdup(pool, "#800000");
      }
      break;
    case 'n':
    case 'N':
      if (STRCASEEQ('a','A', &s[1], "avy")) {
        /* navy */
        return apr_pstrdup(pool, "#000080");
      }
      break;
    case 'o':
    case 'O':
      if (STRCASEEQ('l','L', &s[1], "live")) {
        /* olive */
        return apr_pstrdup(pool, "#808000");
      }
      break;
    case 'p':
    case 'P':
      if (STRCASEEQ('u','U', &s[1], "urple")) {
        /* purple */
        return apr_pstrdup(pool, "#800080");
      }
      break;
    case 'r':
    case 'R':
      if (STRCASEEQ('e','E', &s[1], "ed")) {
        /* red */
        return apr_pstrdup(pool, "#ff0000");
      }
      break;
    case 's':
    case 'S':
      if (STRCASEEQ('i','I', &s[1], "ilver")) {
        /* silver */
        return apr_pstrdup(pool, "#c0c0c0");
      }
      break;
    case 't':
    case 'T':
      if (STRCASEEQ('e','E', &s[1], "eal")) {
        /* teal */
        return apr_pstrdup(pool, "#008080");
      }
      break;
    case 'w':
    case 'W':
      if (STRCASEEQ('h','H', &s[1], "hite")) {
        /* white */
        return apr_pstrdup(pool, "#ffffff");
      }
      break;
    case 'y':
    case 'Y':
      if (STRCASEEQ('y','Y', &s[1], "ellow")) {
        /* yellow */
        return apr_pstrdup(pool, "#ffff00");
      }
      break;
    default:
      break;
    }
  }
  return s;
}
예제 #2
0
/**
 * The device is specified from TSV file. 
 * @param r Request_rec is appointed.
 * @param userAgent UserAgent is appointed here,
 * @return The style which corresponds is returned.
 */
static device_table *
s_specified_device_from_tsv(request_rec *r,device_table *spec,const char *user_agent)
{
  if(spec->device_id == NULL){
    return spec;
  }
  
  DBG(r, "REQ[%X] start %s() device_id:[%s]", TO_ADDR(r), __func__,spec->device_id);
  mod_chxj_config      *conf;
  
  conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
  
  if(conf->device_hash == NULL){
    DBG(r, "REQ[%X] end %s()", TO_ADDR(r),__func__);
    return spec;
  }
  char *key = apr_psprintf(r->pool,"%d.%s",spec->provider,spec->device_id);
  
  apr_table_t *ht = apr_hash_get(conf->device_hash,key,APR_HASH_KEY_STRING);
  
  if(ht != NULL){
    DBG(r, "REQ[%X] found ! %s() %s", TO_ADDR(r), __func__,key);
    int i;
    for ( i=0; i< conf->device_keys->nelts; i++){
      const char *k = ((const char**)conf->device_keys->elts)[i];
      char *val = (char *)apr_table_get(ht,k);
      if(val == NULL){
        continue;
      }
      DBG(r, "REQ[%X] start chxj_specified_device_from_tsv() [%s] = [%s]:[%s]",TO_ADDR(r),spec->device_id,k,val);
      if (STRCASEEQ('d','D',"device_name",k)){
        spec->device_name = apr_pstrdup(r->pool,val);
      }
      if (STRCASEEQ('w','W',"width",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->width = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('h','H',"heigh",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->heigh = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('h','H',"height",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->heigh = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('w','W',"wp_width",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->wp_width = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('w','W',"wp_heigh",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->wp_heigh = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('w','W',"wp_height",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->wp_heigh = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('c','C',"cache",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->cache = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('g','G',"gif",k)){
        int tmp = get_boolean_value(r,val);
        if(tmp > -1 ){
            spec->available_gif = tmp;
        }
      }
      else if (STRCASEEQ('j','J',"jpeg",k)){
        int tmp = get_boolean_value(r,val);
        if(tmp > -1 ){
            spec->available_jpeg = tmp;
        }
      }
      else if (STRCASEEQ('p','P',"png",k)){
        int tmp = get_boolean_value(r,val);
        if(tmp > -1 ){
          spec->available_png = tmp;
        }
      }
      else if (STRCASEEQ('b','B',"bmp2",k)){
        int tmp = get_boolean_value(r,val);
        if(tmp > -1 ){
          spec->available_bmp2 = tmp;
        }
      }
      else if (STRCASEEQ('b','B',"bmp4",k)){
        int tmp = get_boolean_value(r,val);
        if(tmp > -1 ){
          spec->available_bmp4 = tmp;
        }
      }
      else if (STRCASEEQ('c','C',"color",k)){
        if(chxj_chk_numeric(val) == 0){
          spec->color = chxj_atoi(val);
        }
      }
      else if (STRCASEEQ('e','E',"emoji_type",k)){
        spec->emoji_type = apr_pstrdup(r->pool,val);
      }
      else if (STRCASEEQ('h','H',"html_spec_type",k)){
        if (STRCASEEQ('x','X',"xhtml_mobile_1_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0;
        }
        else if (STRCASEEQ('c','C',"chtml_1_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_1_0;
        }
        else if (STRCASEEQ('c','C',"chtml_2_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_2_0;
        }
        else if (STRCASEEQ('c','C',"chtml_3_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_3_0;
        }
        else if (STRCASEEQ('c','C',"chtml_4_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_4_0;
        }
        else if (STRCASEEQ('c','C',"chtml_5_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_5_0;
        }
        else if (STRCASEEQ('c','C',"chtml_6_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_6_0;
        }
        else if (STRCASEEQ('c','C',"chtml_7_0",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_7_0;
        }
        else if (STRCASEEQ('h','H',"hdml",val)) {
          spec->html_spec_type = CHXJ_SPEC_Hdml;
        }
        else if (STRCASEEQ('i','I',"ixhtml",val)) {
          spec->html_spec_type = CHXJ_SPEC_Chtml_7_0;
        }
        else if (STRCASEEQ('j','J',"jhtml",val)) {
          spec->html_spec_type = CHXJ_SPEC_Jhtml;
        }
        else if (STRCASEEQ('j','J',"jxhtml",val)) {
          spec->html_spec_type = CHXJ_SPEC_Jxhtml;
        }
        else if (STRCASEEQ('i','I',"iphone2",val)) {
          spec->html_spec_type = CHXJ_SPEC_iPhone2;
        }
        else if (STRCASEEQ('i','I',"iphone3",val)) {
          spec->html_spec_type = CHXJ_SPEC_iPhone3;
        }
        else if (STRCASEEQ('i','I',"iphone4",val)) {
          spec->html_spec_type = CHXJ_SPEC_iPhone4;
        }
        else if (STRCASEEQ('a','A',"android_s",val)) {
          spec->html_spec_type = CHXJ_SPEC_softbank_android;
        }
        else if (STRCASEEQ('a','A',"android_a",val)) {
          spec->html_spec_type = CHXJ_SPEC_au_android;
        }
        else if (STRCASEEQ('a','A',"android_d",val)) {
          spec->html_spec_type = CHXJ_SPEC_docomo_android;
        }
        else if (STRCASEEQ('a','A',"android",val)) {
          spec->html_spec_type = CHXJ_SPEC_android;
        }
      }
      else if (STRCASEEQ('o','O',"output_encoding",k)){
          spec->output_encoding = apr_pstrdup(r->pool,val);
      }
    }
  }
  
  DBG(r, "REQ[%X] end %s() [%d]",TO_ADDR(r),__func__,spec->provider);
  return spec;
}
예제 #3
0
static void
s_set_device_data(Doc *doc, apr_pool_t *p, device_table_list *dtl, Node *node) 
{
  Node         *child;
  device_table *dt;

  dt = apr_pcalloc(p, sizeof(device_table));
  dt->next           = NULL;
  dt->device_id      = NULL;
  dt->device_name    = NULL;
  dt->html_spec_type = CHXJ_SPEC_Chtml_3_0;
  dt->width          = 0;
  dt->heigh          = 0;
  dt->wp_width       = 0;
  dt->wp_heigh       = 0;
  dt->cache          = 5;
  dt->emoji_type     = NULL;
  dt->color          = 256;
  dt->dpi_width      = 96;
  dt->dpi_heigh      = 96;

  for (child = qs_get_child_node(doc,node); 
       child ;
       child = qs_get_next_node(doc,child)) {
    char *name = qs_get_node_name(doc,child);
    switch (*name) {
    case 'd':
    case 'D':
      if (strcasecmp(name, "device") == 0) {
        s_set_device_data(doc,p, dtl, child);
      }
      else
      if (strcasecmp(name, "device_id") == 0) {
        Node* ch = qs_get_child_node(doc, child);
        if (ch &&  strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          dt->device_id = apr_pstrdup(p, qs_get_node_value(doc, ch));
        }
      }
      else
      if (strcasecmp(name, "device_name") == 0) {
        Node* ch = qs_get_child_node(doc, child);
        if (ch &&  strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          dt->device_name = apr_pstrdup(p, qs_get_node_value(doc, ch));
        }
      }
      else
      if (strcasecmp(name, "dpi_width") == 0) {
        Node* ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
          if (ii == strlen(vv)) 
            dt->dpi_width = atoi(qs_get_node_value(doc,ch));
          else 
            dt->dpi_width = 0;
        }
      }
      else
      if (strcasecmp(name, "dpi_heigh") == 0) {
        Node* ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
  
          if (ii == strlen(vv)) 
            dt->dpi_heigh = atoi(qs_get_node_value(doc,ch));
          else 
            dt->dpi_heigh = 0;
        }
      }
      break;

    case 'h':
    case 'H':
      if (strcasecmp(name, "html_spec_type") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch &&  strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc, ch);
          if (STRCASEEQ('x','X',"xhtml_mobile_1_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_XHtml_Mobile_1_0;
          }
          else if (STRCASEEQ('c','C',"chtml_1_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_1_0;
          }
          else if (STRCASEEQ('c','C',"chtml_2_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_2_0;
          }
          else if (STRCASEEQ('c','C',"chtml_3_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_3_0;
          }
          else if (STRCASEEQ('c','C',"chtml_4_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_4_0;
          }
          else if (STRCASEEQ('c','C',"chtml_5_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_5_0;
          }
          else if (STRCASEEQ('c','C',"chtml_6_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_6_0;
          }
          else if (STRCASEEQ('c','C',"chtml_7_0",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Chtml_7_0;
          }
          else if (STRCASEEQ('h','H',"hdml",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Hdml;
          }
          else if (STRCASEEQ('j','J',"jhtml",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Jhtml;
          }
          else if (STRCASEEQ('j','J',"jxhtml",vv)) {
            dt->html_spec_type = CHXJ_SPEC_Jxhtml;
          }
        }
      }
      else 
      if (strcasecmp(name, "heigh") == 0) {
        Node* ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
  
          if (ii == strlen(vv)) 
            dt->heigh = atoi(qs_get_node_value(doc,ch));
          else 
            dt->heigh = 0;
        }
      }
      break;

    case 'w':
    case 'W':
      if (strcasecmp(name, "width") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0')
              continue;
            break;
          }
          if (ii == strlen(vv))
            dt->width = atoi(qs_get_node_value(doc,ch));
          else 
            dt->width = 0;
        }
      }
      else
      if (strcasecmp(name, "wp_width") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
  
          if (ii == strlen(vv)) 
            dt->wp_width = atoi(qs_get_node_value(doc,ch));
          else 
            dt->wp_width = 0;
        }
      }
      else
      if (strcasecmp(name, "wp_heigh") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
  
          if (ii == strlen(vv)) 
            dt->wp_heigh = atoi(qs_get_node_value(doc,ch));
          else 
            dt->wp_heigh = 0;
        }
      }
      break;

    case 'g':
    case 'G':
      if (strcasecmp(name, "gif") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (strcasecmp(vv, "true") == 0)
            dt->available_gif = 1;
          else
            dt->available_gif = 0;
        }
      }
      break;

    case 'j':
    case 'J':
      if (strcasecmp(name, "jpeg") == 0 || strcasecmp(name, "jpg") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch != NULL && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (strcasecmp(vv, "true") == 0) 
            dt->available_jpeg = 1;
          else 
            dt->available_jpeg = 0;
        }
      }
      break;
  
    case 'p':
    case 'P':
      if (strcasecmp(name, "png") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (strcasecmp(vv, "true") == 0) 
            dt->available_png = 1;
          else
            dt->available_png = 0;
        }
      }
      break;

    case 'b':
    case 'B':
      if (strcasecmp(name, "bmp2") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (strcasecmp(vv, "true") == 0) 
            dt->available_bmp2 = 1;
          else
            dt->available_bmp2 = 0;
        }
      }
      else
      if (strcasecmp(name, "bmp4") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (strcasecmp(vv, "true") == 0) 
            dt->available_bmp4 = 1;
          else
            dt->available_bmp4 = 0;
        }
      }
      break;

    case 'c':
    case 'C':
      if (strcasecmp(name, "color") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
  
          if (chxj_chk_numeric(vv) != 0)
            dt->color = 0;
          else 
            dt->color = chxj_atoi(vv);
        }
      }
      else
      if (strcasecmp(name, "cache") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) {
          char *vv = qs_get_node_value(doc,ch);
          unsigned int ii;
          for (ii=0; ii<strlen(vv); ii++) {
            if ((vv[ii] >= '1' && vv[ii] <= '9') || vv[ii] == '0') 
              continue;
            break;
          }
  
          if (ii == strlen(vv)) 
            dt->cache = atoi(qs_get_node_value(doc,ch));
          else 
            dt->cache = 0;
        }
      }
      break;

    case 'e':
    case 'E':
      if (strcasecmp(name, "emoji_type") == 0) {
        Node *ch = qs_get_child_node(doc, child);
        if (ch && strcasecmp(qs_get_node_name(doc,ch), "text") == 0) 
          dt->emoji_type = apr_pstrdup(p, qs_get_node_value(doc, ch));
      }
      break;
    default:
      break;
    }
  }

  if (dt->device_id) {
    if (! dtl->table) {
      dtl->table = dt;
      dtl->tail = dt;
    }
    else {
      dtl->tail->next = dt;
      dtl->tail = dt;
    }
  }
}