亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? templateparser.pm

?? 一個(gè)開(kāi)源的網(wǎng)絡(luò)開(kāi)發(fā)庫(kù)ACE
?? PM
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
package TemplateParser;

# ************************************************************
# Description   : Parses the template and fills in missing values
# Author        : Chad Elliott
# Create Date   : 5/17/2002
# ************************************************************

# ************************************************************
# Pragmas
# ************************************************************

use strict;

use Parser;

use vars qw(@ISA);
@ISA = qw(Parser);

# ************************************************************
# Data Section
# ************************************************************

my(%keywords) = ('if'              => 1,
                 'else'            => 1,
                 'endif'           => 1,
                 'noextension'     => 1,
                 'dirname'         => 1,
                 'basename'        => 1,
                 'basenoextension' => 1,
                 'foreach'         => 1,
                 'forfirst'        => 1,
                 'fornotfirst'     => 1,
                 'fornotlast'      => 1,
                 'forlast'         => 1,
                 'endfor'          => 1,
                 'comment'         => 1,
                 'flag_overrides'  => 1,
                 'marker'          => 1,
                );

# ************************************************************
# Subroutine Section
# ************************************************************

sub new {
  my($class) = shift;
  my($prjc)  = shift;
  my($self)  = Parser::new($class);

  $self->{'prjc'}     = $prjc;
  $self->{'ti'}       = $prjc->get_template_input();
  $self->{'crlf'}     = undef;
  $self->{'values'}   = {};
  $self->{'defaults'} = {};
  $self->{'lines'}    = [];
  $self->{'built'}    = '';
  $self->{'sstack'}   = [];
  $self->{'lstack'}   = [];
  $self->{'if_skip'}  = 0;

  $self->{'foreach'}  = {};
  $self->{'foreach'}->{'count'}      = -1;
  $self->{'foreach'}->{'nested'}     = 0;
  $self->{'foreach'}->{'names'}      = [];
  $self->{'foreach'}->{'text'}       = [];
  $self->{'foreach'}->{'scope'}      = [];
  $self->{'foreach'}->{'temp_scope'} = [];
  $self->{'foreach'}->{'processing'} = 0;

  return $self;
}


sub basename {
  my($self) = shift;
  my($file) = shift;
  for(my $i = length($file) - 1; $i >= 0; --$i) {
    my($ch) = substr($file, $i, 1);
    if ($ch eq '/' || $ch eq '\\') {
      ## The template file may use this value (<%basename_found%>)
      ## to determine whether a basename removed the directory or not
      $self->{'values'}->{'basename_found'} = 1;
      return substr($file, $i + 1);
    }
  }
  delete $self->{'values'}->{'basename_found'};
  return $file;
}


sub dirname {
  my($self) = shift;
  my($file) = shift;
  for(my $i = length($file) - 1; $i != 0; --$i) {
    my($ch) = substr($file, $i, 1);
    if ($ch eq '/' || $ch eq '\\') {
      ## The template file may use this value (<%dirname_found%>)
      ## to determine whether a dirname removed the basename or not
      $self->{'values'}->{'dirname_found'} = 1;
      return substr($file, 0, $i);
    }
  }
  delete $self->{'values'}->{'dirname_found'};
  return '.';
}


sub strip_line {
  my($self) = shift;
  my($line) = shift;

  ## Override strip_line() from Parser.
  ## We need to preserve leading space and
  ## there is no comment string in templates.
  ++$self->{'line_number'};
  $line =~ s/\s+$//;

  return $line;
}


## Append the current value to the line that is being
## built.  This line may be a foreach line or a general
## line without a foreach.
sub append_current {
  my($self)  = shift;
  my($value) = shift;
  my($index) = $self->{'foreach'}->{'count'};

  if ($index >= 0) {
    $self->{'foreach'}->{'text'}->[$index] .= $value;
  }
  else {
    $self->{'built'} .= $value;
  }
}


sub adjust_value {
  my($self)  = shift;
  my($name)  = shift;
  my($value) = shift;

  ## Perform any additions, subtractions
  ## or overrides for the template values.
  my($addtemp) = $self->{'prjc'}->get_addtemp();
  foreach my $at (keys %$addtemp) {
    if ($at eq $name) {
      my($val) = $$addtemp{$at};
      if ($$val[0] > 0) {
        if (UNIVERSAL::isa($value, 'ARRAY')) {
          $value = [ $$val[1], @$value ];
        }
        else {
          $value = "$$val[1] $value";
        }
      }
      elsif ($$val[0] < 0) {
        my($parts) = undef;
        if (UNIVERSAL::isa($value, 'ARRAY')) {
          my(@copy) = @$value;
          $parts = \@copy;
        }
        else {
          $parts = $self->create_array($value);
        }

        $value = '';
        foreach my $part (@$parts) {
          if ($part ne $$val[1] && $part ne '') {
            $value .= "$part ";
          }
        }
        $value =~ s/^\s+//;
        $value =~ s/\s+$//;
      }
      else {
        $value = $$val[1];
      }
    }
  }

  return $value;
}


sub set_current_values {
  my($self) = shift;
  my($name) = shift;

  ## If any value within a foreach matches the name
  ## of a hash table within the template input we will
  ## set the values of that hash table in the current scope
  my($ti) = $self->{'ti'};
  if (defined $ti) {
    my($counter) = $self->{'foreach'}->{'count'};
    if ($counter >= 0) {
      my($value) = $ti->get_value($name);
      if (defined $value && UNIVERSAL::isa($value, 'HASH')) {
        my(%copy) = ();
        foreach my $key (keys %$value) {
          $copy{$key} = $self->adjust_value($key, $$value{$key});
        }
        $self->{'foreach'}->{'temp_scope'}->[$counter] = \%copy;
      }
    }
  }
}


sub relative {
  my($self)  = shift;
  my($value) = shift;
  my($rel)   = $self->{'prjc'}->get_relative();
  my(@keys)  = keys %$rel;

  if (defined $value && defined $keys[0] && $value =~ /\$/) {
    if (UNIVERSAL::isa($value, 'ARRAY')) {
      my(@built) = ();
      foreach my $val (@$value) {
        push(@built, $self->relative($val));
      }
      $value = \@built;
    }
    else {
      my($cwd)   = $self->getcwd();
      my($start) = 0;
      my($fixed) = 0;

      if ($cwd =~ /[a-z]:[\/\\]/) {
        substr($cwd, 0, 1) = uc(substr($cwd, 0, 1));
      }
      while(substr($value, $start) =~ /(\$\(([^)]+)\))/) {
        my($whole)  = $1;
        my($name)   = $2;
        my($val)    = $$rel{$name};
        if (defined $val) {
          if ($^O eq 'cygwin' && !$fixed &&
              $cwd !~ /[A-Za-z]:/ && $val =~ /[A-Za-z]:/) {
            my($cyg) = `cygpath -w $cwd`;
            if (defined $cyg) {
              $cyg =~ s/\\/\//g;
              chop($cwd = $cyg);
              $fixed = 1;
            }
          }

          ## Fix up the value for Windows (capitalize the drive and
          ## switch the \\'s to /
          $val =~ s/\\/\//g;
          if ($val =~ /[a-z]:\//) {
            substr($val, 0, 1) = uc(substr($val, 0, 1));
          }

          if (index($cwd, $val) == 0) {
            my($count) = 0;
            substr($cwd, 0, length($val)) = '';
            while($cwd =~ /^\\/) {
              $cwd =~ s/^\///;
            }
            my($length) = length($cwd);
            for(my $i = 0; $i < $length; ++$i) {
              if (substr($cwd, $i, 1) eq '/') {
                ++$count;
              }
            }
            $val = '../' x $count;
            $val =~ s/\/$//;
            if ($self->{'prjc'}->convert_slashes()) {
              $val = $self->slash_to_backslash($val);
            }
            substr($value, $start) =~ s/\$\([^)]+\)/$val/;
          }
        }
        $start += length($whole);
      }
    }
  }

  return $value;
}


sub get_value {
  my($self)    = shift;
  my($name)    = shift;
  my($value)   = undef;
  my($counter) = $self->{'foreach'}->{'count'};

  ## First, check the temporary scope (set inside a foreach)
  if ($counter >= 0) {
    while(!defined $value && $counter >= 0) {
      $value = $self->{'foreach'}->{'temp_scope'}->[$counter]->{$name};
      --$counter;
    }
    $counter = $self->{'foreach'}->{'count'};
  }

  if (!defined $value) {
    ## Next, check for a template value
    my($ti) = $self->{'ti'};
    if (defined $ti) {
      $value = $ti->get_value($name);
      if (defined $value) {
        $value = $self->adjust_value($name, $value);
      }
    }

    if (!defined $value) {
      ## Next, check the inner to outer foreach
      ## scopes for overriding values
      while(!defined $value && $counter >= 0) {
        $value = $self->{'foreach'}->{'scope'}->[$counter]->{$name};
        --$counter;
      }

      ## Then get the value from the project creator
      if (!defined $value) {
        $value = $self->{'prjc'}->get_assignment($name);

        ## Then get it from our known values
        if (!defined $value) {
          $value = $self->{'values'}->{$name};
        }
      }
    }
  }

  return $self->relative($value);
}


sub get_value_with_default {
  my($self)  = shift;
  my($name)  = shift;
  my($value) = $self->get_value($name);

  if (defined $value) {
    if (UNIVERSAL::isa($value, 'ARRAY')) {
      $value = "@$value";
    }
  }
  else {
    $value = $self->{'defaults'}->{$name};
    if (!defined $value) {
      ## Call back onto the project creator to allow
      ## it to fill in the value before defaulting to an empty string.
      $value = $self->{'prjc'}->fill_value($name);
      if (!defined $value) {
#        print "DEBUG: WARNING: $name defaulting to empty string\n";
        $value = '';
      }
    }
    else {
#      print "DEBUG: WARNING: $name using default value of $value\n";
    }
    $value = $self->relative($value);
  }

  return $value;
}


sub process_foreach {
  my($self)   = shift;
  my($index)  = $self->{'foreach'}->{'count'};
  my($text)   = $self->{'foreach'}->{'text'}->[$index];
  my($status) = 1;
  my($errorString) = '';
  my(@values) = ();
  my($names)  = $self->create_array($self->{'foreach'}->{'names'}->[$index]);
  my($name)   = undef;

  foreach my $n (@$names) {
    my($vals) = $self->get_value($n);
    if (defined $vals && $vals ne '') {
      if (!UNIVERSAL::isa($vals, 'ARRAY')) {
        $vals = $self->create_array($vals);
      }
      push(@values, @$vals);
    }
    if (!defined $name) {
      $name = $n;
    }
  }

  ## Reset the text (it will be regenerated by calling parse_line
  $self->{'foreach'}->{'text'}->[$index] = '';

  if (defined $values[0]) {
    my($inner) = $name;
    my($scope) = $self->{'foreach'}->{'scope'}->[$index];

    $inner =~ s/s$//;
    $$scope{'forlast'}     = 0;
    $$scope{'fornotlast'}  = 1;
    $$scope{'forfirst'}    = 1;
    $$scope{'fornotfirst'} = 0;

    for(my $i = 0; $i <= $#values; ++$i) {
      my($value) = $values[$i];

      ## Set the corresponding values in the temporary scope
      $self->set_current_values($value);

      ## Set the special values that only exist
      ## within a foreach
      if ($i != 0) {
        $$scope{'forfirst'}    = 0;
        $$scope{'fornotfirst'} = 1;
      }
      if ($i == $#values) {
        $$scope{'forlast'}    = 1;
        $$scope{'fornotlast'} = 0;
      }
      ## We don't use adjust_value here because these names
      ## are generated from a foreach and should not be adjusted.
      $$scope{$inner} = $value;

      ## A tiny hack for VC7
      if ($inner eq 'configuration') {
        $self->{'prjc'}->update_project_info($self, 1,
                                             ['configuration', 'platform'],
                                             '|');
      }

      ## Now parse the line of text, each time
      ## with different values
      ++$self->{'foreach'}->{'processing'};
      ($status, $errorString) = $self->parse_line(undef, $text);
      --$self->{'foreach'}->{'processing'};
      if (!$status) {
        last;
      }
    }
  }

  return $status, $errorString;
}


sub handle_end {
  my($self)        = shift;
  my($name)        = shift;
  my($status)      = 1;
  my($errorString) = '';
  my($end)         = pop(@{$self->{'sstack'}});
  pop(@{$self->{'lstack'}});

  if (!defined $end) {
    $status = 0;
    $errorString = "ERROR: Unmatched $name\n";
  }
  elsif ($end eq 'endif') {
    $self->{'if_skip'} = 0;
  }
  elsif ($end eq 'endfor') {
    my($index) = $self->{'foreach'}->{'count'};
    ($status, $errorString) = $self->process_foreach();
    if ($status) {
      --$self->{'foreach'}->{'count'};
      $self->append_current($self->{'foreach'}->{'text'}->[$index]);
    }
  }

  return $status, $errorString;
}


sub get_flag_overrides {
  my($self)  = shift;
  my($name)  = shift;
  my($type)  = shift;
  my($value) = undef;
  my($file)  = $self->get_value($name);
  my($prjc)  = $self->{'prjc'};
  my($fo)    = $prjc->{'flag_overrides'};

  foreach my $key (keys %$fo) {
    if ($key =~ /^$name/) {
      foreach my $of (keys %{$$fo{$key}}) {
        my($cv) = $of;
        if ($prjc->convert_slashes()) {
          $cv = $prjc->slash_to_backslash($of);
        }
        if ($cv eq $file) {

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九国产精品视频| 婷婷开心久久网| 一区二区三区色| 蜜桃av一区二区| 99久久综合99久久综合网站| 91精品国产综合久久香蕉麻豆 | 国产精品99久| 欧美理论片在线| 亚洲欧洲三级电影| 国产美女精品在线| 7777精品伊人久久久大香线蕉 | 欧美日韩视频一区二区| 国产精品女同一区二区三区| 六月丁香婷婷久久| 欧美日韩亚洲综合一区二区三区| 日本一区二区三区在线不卡| 精品中文字幕一区二区| 91麻豆精品国产91久久久更新时间| 国产精品久久久久精k8| 国内国产精品久久| 日韩精品一区二区在线| 日日夜夜精品视频天天综合网| 色综合中文综合网| 国产精品少妇自拍| 久久精品国产99久久6| 91麻豆精品国产自产在线| 亚洲韩国精品一区| 欧美日韩中文精品| 亚洲综合一区二区三区| 在线观看亚洲精品视频| 亚洲国产欧美另类丝袜| 欧美日韩黄色影视| 午夜一区二区三区视频| 欧美日韩一区三区| 日韩国产在线观看| 91精品国产麻豆| 美女一区二区视频| 精品国产精品网麻豆系列| 国产在线精品国自产拍免费| 精品国产自在久精品国产| 久久99久国产精品黄毛片色诱| 欧美va日韩va| 国产99久久久久久免费看农村| 日本一区二区免费在线| jizz一区二区| 亚洲自拍偷拍九九九| 欧美日本一区二区三区| 日本最新不卡在线| 久久一区二区三区国产精品| 国产成人h网站| 中文字幕字幕中文在线中不卡视频| 91猫先生在线| 日本不卡中文字幕| 久久久午夜电影| av电影天堂一区二区在线| 亚洲色欲色欲www| 欧美人妖巨大在线| 国产精品自拍av| 亚洲婷婷在线视频| 91精品欧美综合在线观看最新| 黑人巨大精品欧美一区| 国产欧美精品一区| 欧美吞精做爰啪啪高潮| 精彩视频一区二区三区 | 4438成人网| 国产精品99久久不卡二区| 亚洲精品国产a| 欧美v亚洲v综合ⅴ国产v| 成人a区在线观看| 热久久久久久久| 中文字幕中文字幕在线一区| 欧美二区乱c少妇| 国产 日韩 欧美大片| 亚洲午夜激情网站| 国产日韩综合av| 制服.丝袜.亚洲.另类.中文| 成人高清视频免费观看| 日韩二区在线观看| 国产精品美女久久久久久| 555夜色666亚洲国产免| av电影一区二区| 激情综合色综合久久| 亚洲宅男天堂在线观看无病毒| 国产午夜精品美女毛片视频| 欧美另类高清zo欧美| 99久久综合色| 国产乱人伦精品一区二区在线观看| 一区二区三区在线观看网站| 亚洲国产激情av| 精品国产一区二区三区久久久蜜月| 91国内精品野花午夜精品| 国产精品资源在线| 理论片日本一区| 亚洲电影视频在线| 亚洲欧美另类在线| 国产欧美精品一区二区三区四区 | 欧美乱妇20p| 97精品久久久午夜一区二区三区 | 欧美伊人久久久久久久久影院| 国产乱码字幕精品高清av | 一区二区三区资源| 亚洲欧美综合色| 中文字幕在线不卡| 欧美国产欧美综合| 亚洲国产精品黑人久久久| 久久精品亚洲精品国产欧美kt∨ | 国产91富婆露脸刺激对白| 麻豆极品一区二区三区| 日韩精品成人一区二区三区| 亚洲电影在线播放| 五月天网站亚洲| 婷婷丁香久久五月婷婷| 午夜精品久久一牛影视| 亚洲国产精品久久久久秋霞影院| 亚洲免费在线看| 亚洲综合成人在线| 亚洲图片一区二区| 人妖欧美一区二区| 久久69国产一区二区蜜臀| 狠狠色丁香婷综合久久| 国产一区二区三区免费观看| 国产成人午夜99999| 不卡一二三区首页| 91色|porny| 在线观看一区日韩| 欧美一区二区三区人| 精品国产乱码久久久久久夜甘婷婷 | 久久亚洲精华国产精华液| 久久久www成人免费毛片麻豆| 久久久综合九色合综国产精品| 欧美极品美女视频| 亚洲女同ⅹxx女同tv| 亚洲一区二区三区视频在线播放| 亚洲国产精品嫩草影院| 久久国产精品99精品国产| 国产福利一区在线观看| 99精品热视频| 欧美日韩在线一区二区| 日韩三级精品电影久久久 | 欧美一二三四在线| 国产日产欧美一区二区三区| 中文字幕日韩av资源站| 午夜久久久久久电影| 激情深爱一区二区| av电影在线观看一区| 制服丝袜激情欧洲亚洲| 中文字幕第一区二区| 亚洲自拍偷拍网站| 国产在线视频一区二区| 91日韩一区二区三区| 日韩欧美国产综合| 中文字幕亚洲区| 久久激情五月激情| 一本到一区二区三区| 日韩欧美一级片| 亚洲激情一二三区| 国产一区中文字幕| 欧美日本一道本| 最新日韩在线视频| 极品销魂美女一区二区三区| 欧美在线一区二区| 中文字幕欧美三区| 日av在线不卡| 在线观看免费成人| 国产精品青草久久| 精品制服美女久久| 欧美三级在线视频| 国产精品视频一区二区三区不卡| 日本vs亚洲vs韩国一区三区二区| 91亚洲永久精品| 久久久精品欧美丰满| 免费av网站大全久久| 在线观看成人免费视频| 国产精品久久久久aaaa| 韩国毛片一区二区三区| 91精品国产乱| 亚洲一区欧美一区| 91在线免费看| 欧美激情资源网| 国产乱码字幕精品高清av| 欧美一区二区黄| 丝袜亚洲另类丝袜在线| 色欧美88888久久久久久影院| 久久久一区二区三区捆绑**| 久久成人免费日本黄色| 日韩欧美在线影院| 欧美a一区二区| 91国产成人在线| 亚洲精品乱码久久久久久黑人| 成人丝袜视频网| 国产清纯美女被跳蛋高潮一区二区久久w| 偷拍一区二区三区四区| 欧美日韩视频在线观看一区二区三区 | 久久综合五月天婷婷伊人| 麻豆精品在线视频| 日韩一级视频免费观看在线| 丝袜亚洲另类欧美| 欧美福利电影网| 日韩高清电影一区| 精品久久久久一区|