zsh-workers
 help / color / mirror / code / Atom feed
* zsh -n and modules
@ 2003-01-05 20:13 Clint Adams
  2003-01-05 22:35 ` Bart Schaefer
  0 siblings, 1 reply; 7+ messages in thread
From: Clint Adams @ 2003-01-05 20:13 UTC (permalink / raw)
  To: zsh-workers; +Cc: 175467, joy, bnelson

If you run zsh -n on a script which uses zsh/mathfunc, zsh will
not exec zmodload, and thus not be aware of new math syntax.

> monkey % zsh -n =vux
> /usr/bin/vux:766: unknown function: int
> /usr/bin/vux:784: bad math expression: operator expected at `h'

Is an EXEC_ZMODLOAD option in order?


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2003-01-05 20:13 zsh -n and modules Clint Adams
@ 2003-01-05 22:35 ` Bart Schaefer
  2003-01-06  0:19   ` Clint Adams
  0 siblings, 1 reply; 7+ messages in thread
From: Bart Schaefer @ 2003-01-05 22:35 UTC (permalink / raw)
  To: zsh-workers; +Cc: 175467

On Jan 5,  3:13pm, Clint Adams wrote:
}
} If you run zsh -n on a script which uses zsh/mathfunc, zsh will
} not exec zmodload, and thus not be aware of new math syntax.

} Is an EXEC_ZMODLOAD option in order?

That solution is not particularly useful.  Consider something of the form

    if test ...
    then zmodload zsh/mathfunc
    fi

If you can't execute the conditional because of -n, how do you know that
it's safe to execute the zmodload?

IMO you've identified a deeper problem, which is that no module should be
allowed to alter the syntax accepted by the parser.  Conversely, if the
parser is able to cope with the syntax in the absence of the module, then
`zsh -n' has no business complaining about the semantics.

In this example:

> /usr/bin/vux:766: unknown function: int

`zsh -n' should simply accept that `int' IS a function, and should not try
to look it up.

In this case:

> /usr/bin/vux:784: bad math expression: operator expected at `h'

I can't give an opinion, "bad math expression" is too generic an error.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2003-01-05 22:35 ` Bart Schaefer
@ 2003-01-06  0:19   ` Clint Adams
  2003-01-06  2:02     ` Bart Schaefer
  0 siblings, 1 reply; 7+ messages in thread
From: Clint Adams @ 2003-01-06  0:19 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: zsh-workers, 175467

[-- Attachment #1: Type: text/plain, Size: 461 bytes --]

> > /usr/bin/vux:784: bad math expression: operator expected at `h'
> 
> I can't give an opinion, "bad math expression" is too generic an error.

I don't appear to have the same version, but I get the same error on
line 788, which is

minimum_age=$(( minimum_age * age_format ))

Looks like there are some if/thens which are not being executed which
would change $minimum_age from "1h" to its equivalent in seconds.

Said version attached for your edification.

[-- Attachment #2: vux --]
[-- Type: text/plain, Size: 21399 bytes --]

#!/usr/bin/zsh
#
# Vacillating Utilitarian eXtemporizer
# man vux for details

# global options
prog_name="vux"
prog_ver="0.3.4"
vux_dir="$HOME/.vux"
vuxrc="$vux_dir/vuxrc"
system_vuxrc="/etc/vuxrc"
ogg_player="ogg123"
ogg_player_options=""
mp3_player="mpg321"
mp3_player_options="-d oss"
min_score=0
save_interval=30

# command line options
playlist="$vux_dir/playlist"
scorelist="$vux_dir/scorelist"
agelist="$vux_dir/agelist"
countlist="$vux_dir/countlist"
missing_log="$vux_dir/missing"
sound_device="/dev/dsp"
default_score=50
default_count=10
above_mean_modifier=0
below_mean_modifier=0
max_score=100
increase_factor=10
decrease_factor=10
random_reprieve_factor=10
minimum_age="1h"
age_bypass="sqrt"
verbose_files=0
check_ratings=1
check_repeats=1
save_scorelist=1
save_agelist=1
save_countlist=1
update_rating_plays=1
update_repeat_plays=1
update_rating_skips=1
update_repeat_skips=1
use_missing=1
vux_action=play
rating_method=bell
repeat_method=age
stats_method=:
test_order=test_rating_first
decrease_method=conservative_decrease
increase_method=conservative_increase
play_method=play_song
noplay_skip=-1
print_method=print
force_new=0

zmodload zsh/mathfunc
setopt extendedglob
unsetopt bgnice
typeset -A rating
typeset -A selection_rating
typeset -A age
typeset -A count
typeset -F std_dev_counter
typeset -F mean_counter
typeset -F 4 mean
typeset -F 4 threshold
typeset -F 4 reprieve_threshold
typeset -F 2 lower_sigma
typeset -F 2 upper_sigma
typeset -F 4 lower_area
typeset -F 4 upper_area
typeset -F 4 current_sigma
typeset -F 4 probability
typeset -F 4 area_sigma
typeset -F 4 ratio_sigma
typeset -F 4 float_random
typeset -F 4 current_chance
typeset -F 2 percent_prob
typeset -F 4 std_dev_show
bell=(0.0000 0.0987 0.1915 0.2734 0.3413 0.3944 0.4332 0.4599 0.4772 0.4878 0.4938 0.4970 0.4987 0.4994 0.4997 0.4999 0.5000)

show_stats() {
  typeset -A rating_counter
  for i in $rating
  do
    rating_counter[$i]=$(( rating_counter[$i] + 1 ))
  done
  compute_stats
  print "score : count"
  for i in {$max_score..$min_score}
  do
    if [[ -n ${(k)rating_counter[$i]} ]] \
    { print "   "$i" : "$rating_counter[$i] }
  done
  print
  print "                    mean: "$mean
  print "      standard_deviation: "$std_dev_show
  if [[ $rating_method == check_thresh ]]
  then
    high_song_counter=0
    middle_song_counter=0
    low_song_counter=0
    for i in ${(k)rating_counter}
    do
      if [[ $i -ge $threshold ]]
      then
        high_song_counter=$(( high_song_counter + rating_counter[$i] ))
      elif [[ $i -ge $reprieve_threshold ]]
      then
        middle_song_counter=$(( middle_song_counter + rating_counter[$i] ))
      elif [[ $i -lt $reprieve_threshold ]]
      then
        low_song_counter=$(( low_song_counter + rating_counter[$i] ))
      fi
    done
    print
    print "                   total: "$#rating
    print "               threshold: "$threshold
    print "      reprieve threshold: "$reprieve_threshold
    print "         above threshold: "$high_song_counter
    print "      between thresholds: "$middle_song_counter
    print "below reprieve threshold: "$low_song_counter
  elif [[ $rating_method == check_bell ]]
  then
    for i in ${(k)rating_counter}
    do
      if [[ $i -gt $mean ]]
      then
        high_song_counter=$(( high_song_counter + rating_counter[$i] ))
      elif [[ $i -eq $mean ]]
      then
        middle_song_counter=$(( middle_song_counter + rating_counter[$i] ))
      else [[ $i -lt $mean ]]
        low_song_counter=$(( low_song_counter + rating_counter[$i] ))
      fi
    done
    print
    print "                   total: "$#rating
    print "              above mean: "$high_song_counter
    print "           equal to mean: "$middle_song_counter
    print "              below mean: "$low_song_counter
  fi
}

prune_scorelist() {
  if [[ -r $playlist ]]
  then
    typeset -A temp_rating
    $print_method -n Pruning $scorelist from $playlist...
    for i in ${(f)"$(cat $playlist)"}
    do
      if [[ -n $rating[${(qqq)i}] ]]
      then
        temp_rating[${(qqq)i}]=$rating[${(qqq)i}]
      fi
    done
    $print_method "done."
    $print_method old song count : $#rating
    $print_method new song count : $#temp_rating
    : ${(AA)rating::=${(kv)temp_rating}}
    $write_scorelist_method "$scorelist" "rating"
    case $repeat_play in
    (update_age)
      typeset -A temp_age
      $print_method -n Pruning $agelist from $playlist...
      for i in ${(f)"$(cat $playlist)"}
      do
        if [[ -n $age[${(qqq)i}] ]]
        then
          temp_age[${(qqq)i}]=$age[${(qqq)i}]
        fi
      done
      $print_method "done."
      $print_method old song count : $#age
      $print_method new song count : $#temp_age
      : ${(AA)age::=${(kv)temp_age}}
      $write_agelist_method "$agelist" "age"
    ;;
    (update_count)
      typeset -A temp_count
      $print_method -n Pruning $countlist from $playlist...
      for i in ${(f)"$(cat $playlist)"}
      do
        if [[ -n $count[${(qqq)i}] ]]
        then
          temp_count[${(qqq)i}]=$count[${(qqq)i}]
        fi
      done
      $print_method "done."
      $print_method old song count : $#count
      $print_method new song count : $#temp_count
      : ${(AA)count::=${(kv)temp_count}}
      $write_countlist_method "$countlist" "count"
    ;;
    esac
  else
    print ERROR: $playlist is not readable.
  fi
  $stats_method
}

merge_playlists() {
  new_songs=0
  skipped_songs=0
  $print_method Merging $playlist with $scorelist ...
  for i in ${(f)"$(cat $playlist)"}
  do
    if [[ -n $rating[${(qqq)i}] ]]
    then
      (( skipped_songs++ ))
    else
      rating[${(qqq)i}]=$default_score
      (( new_songs++ ))
    fi
  done
  $print_method "skipped songs: "$skipped_songs
  $print_method "new songs:     "$new_songs
  $print_method "total:         "$(( skipped_songs + new_songs ))
  $write_scorelist_method "$scorelist" "rating"
  $stats_method
}

generate_new_scorelist() {
  for i in ${(f)"$(cat $playlist)"}; do rating[${(qqq)i}]=$default_score ; done
  $write_scorelist_method "$scorelist" "rating"
  $stats_method
}

save_file() {
  lockfile-create --retry 1 $1 || { print Aborting save. ; return }
  $print_method "Saving $1 ..."
  temp_file=`tempfile -d $vux_dir`
  lockfile-touch $1 &
  lock_pid=$!
  case $2 in
    ("rating")
      for i in ${(k)rating}
      do
        print ${(q)${(qqq)${(Q)i}}} $rating[$i] >> $temp_file
      done
    ;;
    ("age")
      for i in ${(k)age}
      do
        print ${(q)${(qqq)${(Q)i}}} $age[$i] >> $temp_file
      done
    ;;
    ("count")
      for i in ${(k)count}
      do
        print ${(q)${(qqq)${(Q)i}}} $count[$i] >> $temp_file
      done
    ;;
    (*)
      print "VUX: internal error.  Unknown argument: $2"
    ;;
  esac
  [[ -e $1 ]] && cp $verbose_arg $1 $1.bak
  cp $verbose_arg $temp_file $1
  rm $verbose_arg $temp_file
  kill $lock_pid
  lockfile-remove $1
  $print_method 'done.'
}

read_file() {
  $print_method -n "Reading $1 ..."
  lockfile-create --retry 1 $1 || { print Aborting load. ; exit 1 }
  lockfile-touch $1 &
  lock_pid=$!
  case $2 in
    ("rating") : ${(AA)rating:=${(zf)"$(<$1)"}} ;;
    ("age") : ${(AA)age:=${(zf)"$(<$1)"}} ;;
    ("count") : ${(AA)count:=${(zf)"$(<$1)"}} ;;
  esac
  kill $lock_pid
  lockfile-remove $1
  $print_method 'done.'
}

compute_stats() {
  mean_counter=0
  std_dev_counter=0
  for i in $rating
  do
    mean_counter=$(( mean_counter + i ))
  done
  # bugtest
  mean=$(( mean_counter / $#rating ))
  #pre_mean=$#rating
  #mean=$(( mean_counter /  pre_mean ))
  for i in $rating
  do
    std_dev_counter=$(( std_dev_counter + ( ( i - mean ) ** 2 ) ))
  done
  std_dev=$(( sqrt( (( std_dev_counter / $#rating )) ) ))
  std_dev_show=$std_dev
  threshold=$(( std_dev + mean + $above_mean_modifier ))
  reprieve_threshold=$(( mean - std_dev + $below_mean_modifier ))
}

check_age() {
  aged_song=0
  new_song=0
  current_seconds=`print -P %D{%s}`
  if [[ ! -n $age[$current_pick] ]]
  then
    current_age=$current_seconds
    new_song=1
    [[ $force_new == 1 ]] && $print_method -n "\-"
  else
    pre_age=$age[$current_pick]
    current_age=$(( current_seconds - pre_age ))
  fi
  if [[ $current_age -ge $minimum_age ]]
  then
    aged_song=1
  elif [[ $age_bypass_count -eq 0 ]]
  then
    $print_method -n "~"
    aged_song=1
  else
    (( age_bypass_count-- ))
    $print_method -n ":"
  fi
}

check_count() {
  aged_song=0
  if [[ ! -n $count[$current_pick] ]]
  then
    aged_song=1
  else
    pre_count=$count[$current_pick]
    count[$current_pick]=$(( pre_count - 1 ))
    if [[ $count[$current_pick] -le 0 ]] { unset "count[$current_pick]" }
    $print_method -n ":"
  fi
}

check_bell() {
  good_song=0
  current_chance=$(( RANDOM % 10000 ))
  float_random=$(( current_chance /10000 ))
  if [[ $std_dev -eq 0 ]]
  then
    current_sigma=0
  else
    current_sigma=$(( (current_rating - mean)/std_dev ))
  fi
  if [[ $current_sigma -lt 0 ]]
  then
    current_sigma=$(( current_sigma * -1 ))
    neg_sigma=1
  else
    neg_sigma=0
  fi
  if [[ $current_sigma -gt 4 ]]
  then
    area_sigma=0.5000
  else
    lower_sigma=$(( int(current_sigma*4)/4.0 ))
    upper_sigma=$(( int(current_sigma*4)/4.0+0.25 ))
    lower_area=$bell[int(current_sigma*4)+1]
    upper_area=$bell[int(current_sigma*4)+2]
    ratio_sigma=$(( (upper_sigma - current_sigma) / \
    (upper_sigma - lower_sigma) ))
    area_sigma=$(( lower_area * ratio_sigma + \
    upper_area * (1-ratio_sigma) ))
  fi
  if [[ neg_sigma -eq 1 ]]
  then
    probability=$(( 0.5 - area_sigma - below_mean_modifier / 100.0 ))
  else
    probability=$(( 0.5 + area_sigma + above_mean_modifier / 100.0 ))
  fi
  if [[ $probability -ge $float_random ]]
  then
    good_song=1
    $print_method -n "+"
    percent_prob=$(( probability * 100 ))
  else
    $print_method -n "."
  fi
}

check_threshold() {
  good_song=0
  if [[ $current_rating -ge $threshold ]]
  then
    good_song=1
    $print_method -n "+"
  elif [[ $current_rating -ge $reprieve_threshold ]]
  then
    if [[ $(( RANDOM % $random_reprieve_factor )) -eq 0 ]]
    then
      $print_method -n "!"
      good_song=1
    else
      $print_method -n "."
    fi
  else
    $print_method -n "x"
  fi
}

dummy_repeat() { aged_song=1 }

dummy_rating() { good_song=1 ; percent_prob=100 }

test_rating_first() {
  $rating_method
  [[ $good_song == 1 ]] && $repeat_method
}

test_repeat_first() {
  $repeat_method
  if [[ $force_new == 1 && $new_song == 1 ]]
  then
    dummy_rating
  else
    [[ $aged_song == 1 ]] && $rating_method
  fi
}

find_all() {
    current_number=$(( RANDOM % $#rating + 1 ))
    current_pick=${${(k)rating}[$current_number]}
    current_rating=$rating[$current_pick]
}

find_selection() {
    current_number=$(( RANDOM % $#selection_rating + 1 ))
    current_pick=${${(k)selection_rating}[$current_number]}
    current_rating=$rating[$current_pick]
}

find_song() {
  good_song=0
  aged_song=0
  new_song=0
  age_bypass_count=$age_bypass
  compute_stats
  $print_method
  while [[ $good_song == 0 || $aged_song == 0 ]] {
    $find_method
    $test_order
  }
  $print_method
  $print_rating_status
  $print_repeat_status
  $print_method
}

get_age_clock() {
  if [[ ! -n $age[$current_pick] ]]
  then
    age_clock="-"
    time_units=""
  else
    age_clock=$(( current_age / age_format ))
    time_units=$time_display
  fi
}

status_bell() {
  $print_method -n \
  $rating[$current_pick]"/"$percent_prob"%/"$mean"/"$std_dev_show
}

status_thresh() {
  $print_method -n \
  $rating[$current_pick]"/"$threshold"/"$mean"/"$reprieve_threshold
}

status_age() {
  get_age_clock
  $print_method -n "/"$age_clock$time_units
}

update_count() {
  count[$current_pick]=$default_count
}

update_age() {
  age[$current_pick]=`print -P %D{%s}`
}

update_rating() {
  pre_rating=$rating[$current_pick]
  rating[$current_pick]=$(( pre_rating + rating_delta ))
  if [[ $rating[$current_pick] -gt $max_score ]] \
    { rating[$current_pick]=$max_score }
  if [[ $rating[$current_pick] -lt $min_score ]] \
    { rating[$current_pick]=$min_score }
  $print_method
  $print_method "NEW RATING: "$rating[$current_pick]
}

conservative_decrease() {
  rating_delta=$(( int(current_rating / -decrease_factor) ))
}

conservative_increase() {
  rating_delta=$(( int( (max_score - current_rating ) / increase_factor ) ))
}

accelerated_decrease() {
  x=$(( current_rating - min_score ))
  y=$(( max_score - current_rating ))
  z=$(( x < y ? int(x/2) : int(y/2) ))
  rating_delta=$(( z > 1 ? -z : -1 ))
}

accelerated_increase() {
  x=$(( current_rating - min_score ))
  y=$(( max_score - current_rating ))
  z=$(( x < y ? int(x/2) : int(y/2) ))
  rating_delta=$(( z > 1 ? z : 1 ))
}

dummy_play() {
  was_skipped=$noplay_skip
  [[ $verbose_files == 1 ]] && $print_method $current_song
}

play_song() {
  case ${(L)current_song} in
    (*.mp3)
      player=$mp3_player
      player_options=$mp3_player_options
      print $current_song > $vux_dir/current_path
      print ${current_song:t} > $vux_dir/current_song
    ;;
    (*.ogg)
      player=$ogg_player
      player_options=$ogg_player_options
      print $current_song > $vux_dir/current_path
      print ${current_song:t} > $vux_dir/current_song
    ;;
    (*)
      $print_method ERROR: unrecognized format:
      $print_method $current_song
      $print_method
      was_skipped=1
    ;;
  esac
  while ! : >$sound_device
  do
    $print_method Waiting...
    sleep 1
  done
  if [[ ${(L)current_song} == http* || -r $current_song ]]
  then
    $player $player_options $current_song &
    player_pid=$!
    wait $player_pid && was_skipped=-1
    unset player_pid
  else
    $missing_method $current_song >> $missing_log
  fi
}

playloop() {
  print $$ >> $vux_dir/vux.pid
  set player
  trap 'int_trap' INT
  trap 'hup_trap' HUP
  save_counter=0
  while :
  do
    set player_pid
    set current_rating
    set current_pick
    find_song
    current_song=${(Q)current_pick}
    was_skipped=0
    $play_method
    case $was_skipped in
      (1)
        $decrease_method
        $rating_skip
        $repeat_skip
      ;;
      (-1)
        $increase_method
        $rating_play
        $repeat_play
      ;;
      (0)
        $print_method ERROR PLAYING: $current_song
      ;;
    esac
    (( save_counter++ ))
    if [[ $save_counter -ge $save_interval ]]
    then
      $write_scorelist_method "$scorelist" "rating"
      $write_agelist_method "$agelist" "age"
      $write_countlist_method "$countlist" "count"
      save_counter=0
    fi
  done
}

int_trap() {
  kill $player_pid
  $write_scorelist_method "$scorelist" "rating"
  $write_agelist_method "$agelist" "age"
  $write_countlist_method "$countlist" "count"
  $stats_method
  rm $verbose_arg $vux_dir/vux.pid
  exit 0
}

hup_trap() {
  was_skipped=1
  kill $player_pid
}

usage="usage: $prog_name [options]
options:

-x p|g|m|w|r  Action: play|generate|merge|weed|ratings

-s file     Use file as scorelist    -S  Disable saving scorelist
-a file     Use file as agelist      -A  Disable saving agelist
-z file     Use file as countlist    -Z  Disable saving countlist
-y file     Use file as missing log  -Y  Disable missing log
-p file     Use file as playlist     -c  Disable rating check
-w b|t      Ratings: bell|thresh     -d  Disable rating updates on play
-W a|c      Repeats: age|count       -l  Disable rating updates on skip
-G t|s|n    Use age bypass method    -j  Disable repeat check
-e pattern  Use only matching songs  -b  Disable repeat updates on play
-O device   Check sound device       -k  Disable repeat updates on skip
-M val      Use minimum age val      -n  Disable player
                                     
-t n  Add n% to >=mean               -J  Accelerate decreases
-T n  Subtract n% from <mean         -K  Accelerate increases
-C n  Use random reprieve factor n   -u  Check age before rating
-D n  Use decrease factor n          -R  Show ratings after processing
-I n  Use increase factor n          -V  Verbose file manipulation
-U n  Use default rating n           -v  Show version and exit
-X n  Use max score n                -F  Skip songs with -n
-N n  Use count n                    -q  Minimize vux output
-P    Always play new songs          -h  Show summary of options"

[[ ! -d $vux_dir ]] && { mkdir -v $vux_dir || exit 1 }
[[ -r $system_vuxrc ]] && source $system_vuxrc
[[ -r $vuxrc ]] && source $vuxrc || \
  { [[ -r $system_vuxrc ]] && cp $verbose_arg $system_vuxrc $vuxrc }

while getopts :a:bcde:hjklnp:qs:t:uvw:x:y:z:AC:D:FG:I:JKM:N:O:PRST:U:VW:X:YZ o
do
  case $o in
    ("a") agelist=$OPTARG ;;
    ("b") update_repeat_plays=0 ;;
    ("c") check_ratings=0 ;;
    ("d") update_rating_plays=0 ;;
    ("e") selection=$OPTARG ;;
    ("h") print $usage ; exit 0 ;;
    ("j") check_repeats=0 ;;
    ("k") update_repeat_skips=0 ;;
    ("l") update_rating_skips=0 ;;
    ("n") play_method=dummy_play ;;
    ("p") playlist=$OPTARG ;;
    ("q") print_method=: ;;
    ("s") scorelist=$OPTARG ;;
    ("t") above_mean_modifier=$OPTARG ;;
    ("u") test_order=test_repeat_first ;;
    ("v") print $prog_name $prog_ver ; exit 0 ;;
    ("w") rating_method=$OPTARG ;;
    ("x") vux_action=$OPTARG ;;
    ("y") missing_log=$OPTARG ;;
    ("z") countlist=$OPTARG ;;
    ("A") save_agelist=0 ;;
    ("C") random_reprieve_factor=$OPTARG ;;
    ("D") decrease_factor=$OPTARG ;;
    ("F") noplay_skip=1 ;;
    ("G") age_bypass=$OPTARG ;;
    ("I") increase_factor=$OPTARG ;;
    ("J") decrease_method=accelerated_decrease ;;
    ("K") increase_method=accelerated_increase ;;
    ("M") minimum_age=$OPTARG ;;
    ("N") default_count=$OPTARG ;;
    ("O") sound_device=$OPTARG ;;
    ("P") force_new=1 ;;
    ("R") stats_method=show_stats ;;
    ("S") save_scorelist=0 ;;
    ("T") below_mean_modifier=$OPTARG ;;
    ("U") default_score=$OPTARG ;;
    ("V") verbose_files=1 ;;
    ("W") repeat_method=$OPTARG ;;
    ("X") max_score=$OPTARG ;;
    ("Y") use_missing=0 ;;
    ("Z") save_countlist=0 ;;
    ("?") print $usage ; exit 1 ;;
  esac
done

read_scorelist() {
  [[ -r $scorelist ]] && read_file "$scorelist" "rating" || exit 1
}

read_agelist() {
  [[ $vux_action == playloop || $vux_action == prune_scorelist ]] \
  && read_file "$agelist" "age"
}
  
read_countlist() {
  [[ $vux_action == playloop || $vux_action == prune_scorelist ]] \
  &&  read_file "$countlist" "count"
}

case $vux_action in
  (g*) vux_action=generate_new_scorelist ;;
  (m*) vux_action=merge_playlists ; read_scorelist ;;
  (p*) vux_action=playloop ; read_scorelist ;;
  (r*) vux_action=show_stats ; read_scorelist ;;
  (w*) vux_action=prune_scorelist ; read_scorelist ;;
  (*) print Incorrect use of -x. ; print $usage ; exit 1 ;;
esac

case $rating_method in
  (b*)
    rating_method=check_bell
    rating_play=update_rating
    rating_skip=update_rating
    print_rating_status=status_bell
    write_scorelist_method=save_file
  ;;
  (t*)
    rating_method=check_thresh
    rating_play=update_rating
    rating_skip=update_rating
    print_rating_status=status_thresh
    write_scorelist_method=save_file
  ;;
  (*) print Incorrect use of -w. ; print $usage ; exit 1 ;;
esac

case $repeat_method in
  (a*)
    repeat_method=check_age
    print_repeat_status=status_age
    write_agelist_method=save_file
    repeat_play=update_age
    repeat_skip=update_age
    write_agelist_method=save_file
    write_countlist_method=:
    [[ -r $agelist ]] && read_agelist
  ;;
  (c*)
    repeat_method=check_count
    print_repeat_status=:
    write_countlist_method=save_file
    repeat_play=update_count
    repeat_skip=update_count
    write_countlist_method=save_file
    write_agelist_method=:
    [[ -r $countlist ]] && read_countlist
  ;;
  (*) print Incorrect use of -W. ; print $usage ; exit 1 ;;
esac

case $age_bypass in
  (t*) age_bypass=$#rating ;;
  (s*) age_bypass=$(( int(sqrt($#rating)) )) ;;
esac

if [[ $minimum_age == (#b)([0-9]##)([dhms]) ]]
then
  minimum_age=$match[1]
  time_display=$match[2]
else
  print Incorrect use of -M. ; print $usage ; exit 1
fi

case $time_display in
  ("d") age_format=86400 ;;
  ("h") age_format=3600 ;;
  ("m") age_format=60 ;;
  ("s") age_format=1 ;;
esac

minimum_age=$(( minimum_age * age_format ))

[[ $check_ratings == 0 ]] && rating_method=dummy_rating
[[ $check_repeats == 0 ]] && repeat_method=dummy_repeat
[[ $save_scorelist == 0 ]] && write_scorelist_method=:
[[ $save_agelist == 0 ]] && write_agelist_method=:
[[ $save_countlist == 0 ]] && write_countlist_method=:
[[ $update_rating_plays == 0 ]] && rating_play=:
[[ $update_repeat_plays == 0 ]] && repeat_play=:
[[ $update_rating_skips == 0 ]] && rating_skip=:
[[ $update_repeat_skips == 0 ]] && repeat_skip=:
[[ $verbose_files == 0 ]] && verbose_arg="" || verbose_arg="-v"
[[ $force_new == 1 ]] && test_order=test_repeat_first

if [[ ! $use_missing == 0 ]]
then
  if [[ -e $missing_log && -s $missing_log ]]
  then
    cp $verbose_arg $missing_log $missing_log.bak
  fi
  missing_method=print
else
  missing_method=:
fi

if [[ -n $selection ]]
then
  $print_method -n Finding selection...
  find_method=find_selection
  for i in ${(k)rating}
  do
    if eval \[\[ "$i" \=\= ${selection} \]\]
    then
      selection_rating[$i]=$rating[$i]
    fi
  done
  if [[ $#selection_rating -eq 0 ]]
  then
    $print_method no matching songs found.
    exit 2
  else
    $print_method $#selection_rating songs found.
  fi
else
  find_method=find_all
fi

$vux_action

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2003-01-06  0:19   ` Clint Adams
@ 2003-01-06  2:02     ` Bart Schaefer
  2004-03-11 16:31       ` Clint Adams
  0 siblings, 1 reply; 7+ messages in thread
From: Bart Schaefer @ 2003-01-06  2:02 UTC (permalink / raw)
  To: zsh-workers; +Cc: 175467

On Jan 5,  7:19pm, Clint Adams wrote:
}
} minimum_age=$(( minimum_age * age_format ))
} 
} Looks like there are some if/thens which are not being executed which
} would change $minimum_age from "1h" to its equivalent in seconds.

OK, so the problem is that `zsh -n' is executing math expressions.  It
should probably treat math expressions just like any other builtin or
command when the -n option is present; that is, do not execute them.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2003-01-06  2:02     ` Bart Schaefer
@ 2004-03-11 16:31       ` Clint Adams
  2004-03-14 16:24         ` Peter Stephenson
  0 siblings, 1 reply; 7+ messages in thread
From: Clint Adams @ 2004-03-11 16:31 UTC (permalink / raw)
  To: zsh-workers, 175467

> OK, so the problem is that `zsh -n' is executing math expressions.  It
> should probably treat math expressions just like any other builtin or
> command when the -n option is present; that is, do not execute them.

Is this the right place to fix this?

Index: Src/subst.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/subst.c,v
retrieving revision 1.36
diff -u -r1.36 subst.c
--- Src/subst.c	30 Aug 2003 19:12:18 -0000	1.36
+++ Src/subst.c	11 Mar 2004 16:20:38 -0000
@@ -168,7 +168,11 @@
 	    if (endchar == Outpar && str2[1] == '(' && str[-2] == ')') {
 		/* Math substitution of the form $((...)) */
 		str[-2] = '\0';
-		str = arithsubst(str2 + 2, &str3, str);
+		if (isset(EXECOPT)) {
+		    str = arithsubst(str2 + 2, &str3, str);
+		} else {
+		    strncpy(str3, str2, 1);
+		}
 		setdata(node, (void *) str3);
 		continue;
 	    }


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2004-03-11 16:31       ` Clint Adams
@ 2004-03-14 16:24         ` Peter Stephenson
  2004-03-14 18:17           ` Clint Adams
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Stephenson @ 2004-03-14 16:24 UTC (permalink / raw)
  To: zsh-workers, 175467

Clint Adams wrote:
> > OK, so the problem is that `zsh -n' is executing math expressions.  It
> > should probably treat math expressions just like any other builtin or
> > command when the -n option is present; that is, do not execute them.
> 
> Is this the right place to fix this?

I haven't seen the original, but it probably refers to (( ... ))
commands, not $(( ... )) substitutions.  But I can't be sure.

-- 
Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
Work: pws@csr.com
Web: http://www.pwstephenson.fsnet.co.uk


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: zsh -n and modules
  2004-03-14 16:24         ` Peter Stephenson
@ 2004-03-14 18:17           ` Clint Adams
  0 siblings, 0 replies; 7+ messages in thread
From: Clint Adams @ 2004-03-14 18:17 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: zsh-workers, 175467

[the thread is 18054, 18055, 18056, 18057, 19601, 19620]

> I haven't seen the original, but it probably refers to (( ... ))
> commands, not $(( ... )) substitutions.  But I can't be sure.

With respect to the syntax errors caused by zsh/mathfunc not being
loaded, it doesn't make sense to substitute $(()) or nor execute
(( )) when NO_EXEC is set.  I don't know about in general.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-03-14 18:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-05 20:13 zsh -n and modules Clint Adams
2003-01-05 22:35 ` Bart Schaefer
2003-01-06  0:19   ` Clint Adams
2003-01-06  2:02     ` Bart Schaefer
2004-03-11 16:31       ` Clint Adams
2004-03-14 16:24         ` Peter Stephenson
2004-03-14 18:17           ` Clint Adams

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).