/ Hex Artifact Content
Login

Artifact e7334b45c023b5ee2efc6e8f479560c2026fa34a:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 61 77 6b 20 2d  #!/usr/bin/awk -
0010: 66 0a 23 0a 23 20 47 65 6e 65 72 61 74 65 20 74  f.#.# Generate t
0020: 68 65 20 66 69 6c 65 20 6f 70 63 6f 64 65 73 2e  he file opcodes.
0030: 68 2e 0a 23 0a 23 20 54 68 69 73 20 41 57 4b 20  h..#.# This AWK 
0040: 73 63 72 69 70 74 20 73 63 61 6e 73 20 61 20 63  script scans a c
0050: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
0060: 74 68 65 20 70 61 72 73 65 2e 68 20 6f 75 74 70  the parse.h outp
0070: 75 74 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  ut file from the
0080: 0a 23 20 70 61 72 73 65 72 20 61 6e 64 20 74 68  .# parser and th
0090: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
00a0: 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
00b0: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70   generate the op
00c0: 63 6f 64 65 73 20 6e 75 6d 62 65 72 73 0a 23 20  codes numbers.# 
00d0: 66 6f 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e  for all opcodes.
00e0: 20 20 0a 23 0a 23 20 54 68 65 20 6c 69 6e 65 73    .#.# The lines
00f0: 20 6f 66 20 74 68 65 20 76 64 62 65 2e 63 20 74   of the vdbe.c t
0100: 68 61 74 20 77 65 20 61 72 65 20 69 6e 74 65 72  hat we are inter
0110: 65 73 74 65 64 20 69 6e 20 61 72 65 20 6f 66 20  ested in are of 
0120: 74 68 65 20 66 6f 72 6d 3a 0a 23 0a 23 20 20 20  the form:.#.#   
0130: 20 20 20 20 63 61 73 65 20 4f 50 5f 61 61 61 61      case OP_aaaa
0140: 3a 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61  :      /* same a
0150: 73 20 54 4b 5f 62 62 62 62 62 20 2a 2f 0a 23 0a  s TK_bbbbb */.#.
0160: 23 20 54 68 65 20 54 4b 5f 20 63 6f 6d 6d 65 6e  # The TK_ commen
0170: 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  t is optional.  
0180: 49 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  If it is present
0190: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
01a0: 20 61 73 73 69 67 6e 65 64 20 74 6f 0a 23 20 74   assigned to.# t
01b0: 68 65 20 4f 50 5f 20 69 73 20 74 68 65 20 73 61  he OP_ is the sa
01c0: 6d 65 20 61 73 20 74 68 65 20 54 4b 5f 20 76 61  me as the TK_ va
01d0: 6c 75 65 2e 20 20 49 66 20 6d 69 73 73 69 6e 67  lue.  If missing
01e0: 2c 20 74 68 65 20 4f 50 5f 20 76 61 6c 75 65 20  , the OP_ value 
01f0: 69 73 20 61 73 73 69 67 6e 65 64 0a 23 20 61 20  is assigned.# a 
0200: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 20 74 68  small integer th
0210: 61 74 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  at is different 
0220: 66 72 6f 6d 20 65 76 65 72 79 20 6f 74 68 65 72  from every other
0230: 20 4f 50 5f 20 76 61 6c 75 65 2e 0a 23 0a 23 20   OP_ value..#.# 
0240: 57 65 20 67 6f 20 74 6f 20 74 68 65 20 74 72 6f  We go to the tro
0250: 75 62 6c 65 20 6f 66 20 6d 61 6b 69 6e 67 20 73  uble of making s
0260: 6f 6d 65 20 4f 50 5f 20 76 61 6c 75 65 73 20 74  ome OP_ values t
0270: 68 65 20 73 61 6d 65 20 61 73 20 54 4b 5f 20 76  he same as TK_ v
0280: 61 6c 75 65 73 0a 23 20 61 73 20 61 6e 20 6f 70  alues.# as an op
0290: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 44 75 72  timization.  Dur
02a0: 69 6e 67 20 70 61 72 73 69 6e 67 2c 20 74 68 69  ing parsing, thi
02b0: 6e 67 73 20 6c 69 6b 65 20 65 78 70 72 65 73 73  ngs like express
02c0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 73 0a 23 20  ion operators.# 
02d0: 61 72 65 20 63 6f 64 65 64 20 77 69 74 68 20 54  are coded with T
02e0: 4b 5f 20 76 61 6c 75 65 73 20 73 75 63 68 20 61  K_ values such a
02f0: 73 20 54 4b 5f 41 44 44 2c 20 54 4b 5f 44 49 56  s TK_ADD, TK_DIV
0300: 49 44 45 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  IDE, and so fort
0310: 68 2e 20 20 4c 61 74 65 72 0a 23 20 64 75 72 69  h.  Later.# duri
0320: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
0330: 6f 6e 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 67  on, we need to g
0340: 65 6e 65 72 61 74 65 20 63 6f 72 72 65 73 70 6f  enerate correspo
0350: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 73 20 6c 69  nding opcodes li
0360: 6b 65 0a 23 20 4f 50 5f 41 64 64 20 61 6e 64 20  ke.# OP_Add and 
0370: 4f 50 5f 44 69 76 69 64 65 2e 20 20 42 79 20 6d  OP_Divide.  By m
0380: 61 6b 69 6e 67 20 54 4b 5f 41 44 44 3d 3d 4f 50  aking TK_ADD==OP
0390: 5f 41 64 64 20 61 6e 64 20 54 4b 5f 44 49 56 49  _Add and TK_DIVI
03a0: 44 45 3d 3d 4f 50 5f 44 69 76 69 64 65 2c 0a 23  DE==OP_Divide,.#
03b0: 20 63 6f 64 65 20 74 6f 20 74 72 61 6e 73 6c 61   code to transla
03c0: 74 65 20 66 72 6f 6d 20 6f 6e 65 20 74 6f 20 74  te from one to t
03d0: 68 65 20 6f 74 68 65 72 20 69 73 20 61 76 6f 69  he other is avoi
03e0: 64 65 64 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ded.  This makes
03f0: 20 74 68 65 0a 23 20 63 6f 64 65 20 67 65 6e 65   the.# code gene
0400: 72 61 74 6f 72 20 72 75 6e 20 28 69 6e 66 69 6e  rator run (infin
0410: 69 74 65 73 69 6d 61 6c 6c 79 29 20 66 61 73 74  itesimally) fast
0420: 65 72 20 61 6e 64 20 6d 6f 72 65 20 69 6d 70 6f  er and more impo
0430: 72 74 61 6e 74 6c 79 20 69 74 20 6d 61 6b 65 73  rtantly it makes
0440: 0a 23 20 74 68 65 20 6c 69 62 72 61 72 79 20 66  .# the library f
0450: 6f 6f 74 70 72 69 6e 74 20 73 6d 61 6c 6c 65 72  ootprint smaller
0460: 2e 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70  ..#.# This scrip
0470: 74 20 61 6c 73 6f 20 73 63 61 6e 73 20 66 6f 72  t also scans for
0480: 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20 66 6f   lines of the fo
0490: 72 6d 3a 0a 23 0a 23 20 20 20 20 20 20 20 63 61  rm:.#.#       ca
04a0: 73 65 20 4f 50 5f 61 61 61 61 3a 20 20 20 20 20  se OP_aaaa:     
04b0: 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20    /* jump, in1, 
04c0: 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2d 70  in2, in3, out2-p
04d0: 72 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 33 20  rerelease, out3 
04e0: 2a 2f 0a 23 0a 23 20 57 68 65 6e 20 73 75 63 68  */.#.# When such
04f0: 20 63 6f 6d 6d 65 6e 74 73 20 61 72 65 20 66 6f   comments are fo
0500: 75 6e 64 20 6f 6e 20 61 6e 20 6f 70 63 6f 64 65  und on an opcode
0510: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
0520: 63 65 72 74 61 69 6e 0a 23 20 70 72 6f 70 65 72  certain.# proper
0530: 74 69 65 73 20 61 70 70 6c 79 20 74 6f 20 74 68  ties apply to th
0540: 61 74 20 6f 70 63 6f 64 65 2e 20 20 53 65 74 20  at opcode.  Set 
0550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 6c  corresponding fl
0560: 61 67 73 20 75 73 69 6e 67 20 74 68 65 0a 23 20  ags using the.# 
0570: 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45  OPFLG_INITIALIZE
0580: 52 20 6d 61 63 72 6f 2e 0a 23 0a 0a 0a 23 20 52  R macro..#...# R
0590: 65 6d 65 6d 62 65 72 20 74 68 65 20 54 4b 5f 20  emember the TK_ 
05a0: 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
05b0: 70 61 72 73 65 2e 68 20 66 69 6c 65 0a 2f 5e 23  parse.h file./^#
05c0: 64 65 66 69 6e 65 20 54 4b 5f 2f 20 7b 0a 20 20  define TK_/ {.  
05d0: 74 6b 5b 24 32 5d 20 3d 20 30 2b 24 33 20 20 20  tk[$2] = 0+$3   
05e0: 20 23 20 74 6b 5b 78 5d 20 68 6f 6c 64 73 20 74   # tk[x] holds t
05f0: 68 65 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65  he numeric value
0600: 20 66 6f 72 20 54 4b 20 73 79 6d 62 6f 6c 20 58   for TK symbol X
0610: 0a 7d 0a 0a 23 20 53 63 61 6e 20 66 6f 72 20 22  .}..# Scan for "
0620: 63 61 73 65 20 4f 50 5f 61 61 61 61 3a 22 20 6c  case OP_aaaa:" l
0630: 69 6e 65 73 20 69 6e 20 74 68 65 20 76 64 62 65  ines in the vdbe
0640: 2e 63 20 66 69 6c 65 0a 2f 5e 63 61 73 65 20 4f  .c file./^case O
0650: 50 5f 2f 20 7b 0a 20 20 6e 61 6d 65 20 3d 20 24  P_/ {.  name = $
0660: 32 0a 20 20 73 75 62 28 2f 3a 2f 2c 22 22 2c 6e  2.  sub(/:/,"",n
0670: 61 6d 65 29 0a 20 20 73 75 62 28 22 5c 72 22 2c  ame).  sub("\r",
0680: 22 22 2c 6e 61 6d 65 29 0a 20 20 6f 70 5b 6e 61  "",name).  op[na
0690: 6d 65 5d 20 3d 20 2d 31 20 20 20 20 20 20 20 23  me] = -1       #
06a0: 20 6f 70 5b 78 5d 20 68 6f 6c 64 73 20 74 68 65   op[x] holds the
06b0: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 66   numeric value f
06c0: 6f 72 20 4f 50 20 73 79 6d 62 6f 6c 20 78 0a 20  or OP symbol x. 
06d0: 20 6a 75 6d 70 5b 6e 61 6d 65 5d 20 3d 20 30 0a   jump[name] = 0.
06e0: 20 20 6f 75 74 32 5f 70 72 65 72 65 6c 65 61 73    out2_prereleas
06f0: 65 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20 69 6e  e[name] = 0.  in
0700: 31 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20 69 6e  1[name] = 0.  in
0710: 32 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20 69 6e  2[name] = 0.  in
0720: 33 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20 6f 75  3[name] = 0.  ou
0730: 74 32 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20 6f  t2[name] = 0.  o
0740: 75 74 33 5b 6e 61 6d 65 5d 20 3d 20 30 0a 20 20  ut3[name] = 0.  
0750: 66 6f 72 28 69 3d 33 3b 20 69 3c 4e 46 3b 20 69  for(i=3; i<NF; i
0760: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 24 69 3d 3d  ++){.    if($i==
0770: 22 73 61 6d 65 22 20 26 26 20 24 28 69 2b 31 29  "same" && $(i+1)
0780: 3d 3d 22 61 73 22 29 7b 0a 20 20 20 20 20 20 73  =="as"){.      s
0790: 79 6d 20 3d 20 24 28 69 2b 32 29 0a 20 20 20 20  ym = $(i+2).    
07a0: 20 20 73 75 62 28 2f 2c 2f 2c 22 22 2c 73 79 6d    sub(/,/,"",sym
07b0: 29 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 74 6b  ).      val = tk
07c0: 5b 73 79 6d 5d 0a 20 20 20 20 20 20 6f 70 5b 6e  [sym].      op[n
07d0: 61 6d 65 5d 20 3d 20 76 61 6c 0a 20 20 20 20 20  ame] = val.     
07e0: 20 75 73 65 64 5b 76 61 6c 5d 20 3d 20 31 0a 20   used[val] = 1. 
07f0: 20 20 20 20 20 73 61 6d 65 61 73 5b 76 61 6c 5d       sameas[val]
0800: 20 3d 20 73 79 6d 0a 20 20 20 20 20 20 64 65 66   = sym.      def
0810: 5b 76 61 6c 5d 20 3d 20 6e 61 6d 65 0a 20 20 20  [val] = name.   
0820: 20 7d 0a 20 20 20 20 78 20 3d 20 24 69 0a 20 20   }.    x = $i.  
0830: 20 20 73 75 62 28 22 2c 22 2c 22 22 2c 78 29 0a    sub(",","",x).
0840: 20 20 20 20 69 66 28 78 3d 3d 22 6a 75 6d 70 22      if(x=="jump"
0850: 29 7b 0a 20 20 20 20 20 20 6a 75 6d 70 5b 6e 61  ){.      jump[na
0860: 6d 65 5d 20 3d 20 31 0a 20 20 20 20 7d 65 6c 73  me] = 1.    }els
0870: 65 20 69 66 28 78 3d 3d 22 6f 75 74 32 2d 70 72  e if(x=="out2-pr
0880: 65 72 65 6c 65 61 73 65 22 29 7b 0a 20 20 20 20  erelease"){.    
0890: 20 20 6f 75 74 32 5f 70 72 65 72 65 6c 65 61 73    out2_prereleas
08a0: 65 5b 6e 61 6d 65 5d 20 3d 20 31 0a 20 20 20 20  e[name] = 1.    
08b0: 7d 65 6c 73 65 20 69 66 28 78 3d 3d 22 69 6e 31  }else if(x=="in1
08c0: 22 29 7b 0a 20 20 20 20 20 20 69 6e 31 5b 6e 61  "){.      in1[na
08d0: 6d 65 5d 20 3d 20 31 0a 20 20 20 20 7d 65 6c 73  me] = 1.    }els
08e0: 65 20 69 66 28 78 3d 3d 22 69 6e 32 22 29 7b 0a  e if(x=="in2"){.
08f0: 20 20 20 20 20 20 69 6e 32 5b 6e 61 6d 65 5d 20        in2[name] 
0900: 3d 20 31 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  = 1.    }else if
0910: 28 78 3d 3d 22 69 6e 33 22 29 7b 0a 20 20 20 20  (x=="in3"){.    
0920: 20 20 69 6e 33 5b 6e 61 6d 65 5d 20 3d 20 31 0a    in3[name] = 1.
0930: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 78 3d 3d      }else if(x==
0940: 22 6f 75 74 32 22 29 7b 0a 20 20 20 20 20 20 6f  "out2"){.      o
0950: 75 74 32 5b 6e 61 6d 65 5d 20 3d 20 31 0a 20 20  ut2[name] = 1.  
0960: 20 20 7d 65 6c 73 65 20 69 66 28 78 3d 3d 22 6f    }else if(x=="o
0970: 75 74 33 22 29 7b 0a 20 20 20 20 20 20 6f 75 74  ut3"){.      out
0980: 33 5b 6e 61 6d 65 5d 20 3d 20 31 0a 20 20 20 20  3[name] = 1.    
0990: 7d 0a 20 20 7d 0a 20 20 6f 72 64 65 72 5b 6e 5f  }.  }.  order[n_
09a0: 6f 70 2b 2b 5d 20 3d 20 6e 61 6d 65 3b 0a 7d 0a  op++] = name;.}.
09b0: 0a 23 20 41 73 73 69 67 6e 20 6e 75 6d 62 65 72  .# Assign number
09c0: 73 20 74 6f 20 61 6c 6c 20 6f 70 63 6f 64 65 73  s to all opcodes
09d0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
09e0: 72 65 73 75 6c 74 2e 0a 45 4e 44 20 7b 0a 20 20  result..END {.  
09f0: 63 6e 74 20 3d 20 30 0a 20 20 6d 61 78 20 3d 20  cnt = 0.  max = 
0a00: 30 0a 20 20 70 72 69 6e 74 20 22 2f 2a 20 41 75  0.  print "/* Au
0a10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
0a20: 72 61 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20 65  rated.  Do not e
0a30: 64 69 74 20 2a 2f 22 0a 20 20 70 72 69 6e 74 20  dit */".  print 
0a40: 22 2f 2a 20 53 65 65 20 74 68 65 20 6d 6b 6f 70  "/* See the mkop
0a50: 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
0a60: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 2a 2f 22   for details */"
0a70: 0a 20 20 6f 70 5b 22 4f 50 5f 4e 6f 6f 70 22 5d  .  op["OP_Noop"]
0a80: 20 3d 20 2d 31 3b 0a 20 20 6f 72 64 65 72 5b 6e   = -1;.  order[n
0a90: 5f 6f 70 2b 2b 5d 20 3d 20 22 4f 50 5f 4e 6f 6f  _op++] = "OP_Noo
0aa0: 70 22 3b 0a 20 20 6f 70 5b 22 4f 50 5f 45 78 70  p";.  op["OP_Exp
0ab0: 6c 61 69 6e 22 5d 20 3d 20 2d 31 3b 0a 20 20 6f  lain"] = -1;.  o
0ac0: 72 64 65 72 5b 6e 5f 6f 70 2b 2b 5d 20 3d 20 22  rder[n_op++] = "
0ad0: 4f 50 5f 45 78 70 6c 61 69 6e 22 3b 0a 0a 20 20  OP_Explain";..  
0ae0: 23 20 41 73 73 69 67 6e 20 73 6d 61 6c 6c 20 76  # Assign small v
0af0: 61 6c 75 65 73 20 74 6f 20 6f 70 63 6f 64 65 73  alues to opcodes
0b00: 20 74 68 61 74 20 61 72 65 20 70 72 6f 63 65 73   that are proces
0b10: 73 65 64 20 62 79 20 72 65 73 6f 6c 76 65 50 32  sed by resolveP2
0b20: 56 61 6c 75 65 73 28 29 0a 20 20 23 20 74 6f 20  Values().  # to 
0b30: 6d 61 6b 65 20 63 6f 64 65 20 67 65 6e 65 72 61  make code genera
0b40: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 77 69  tion for the swi
0b50: 74 63 68 28 29 20 73 74 61 74 65 6d 65 6e 74 20  tch() statement 
0b60: 73 6d 61 6c 6c 65 72 20 61 6e 64 20 66 61 73 74  smaller and fast
0b70: 65 72 2e 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  er..  for(i=0; i
0b80: 3c 6e 5f 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <n_op; i++){.   
0b90: 20 6e 61 6d 65 20 3d 20 6f 72 64 65 72 5b 69 5d   name = order[i]
0ba0: 3b 0a 20 20 20 20 69 66 28 20 6f 70 5b 6e 61 6d  ;.    if( op[nam
0bb0: 65 5d 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e]>=0 ) continue
0bc0: 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 3d 3d  ;.    if( name==
0bd0: 22 4f 50 5f 46 75 6e 63 74 69 6f 6e 22 20 20 20  "OP_Function"   
0be0: 20 20 20 5c 0a 20 20 20 20 20 7c 7c 20 6e 61 6d     \.     || nam
0bf0: 65 3d 3d 22 4f 50 5f 41 67 67 53 74 65 70 22 20  e=="OP_AggStep" 
0c00: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 7c 7c 20        \.     || 
0c10: 6e 61 6d 65 3d 3d 22 4f 50 5f 54 72 61 6e 73 61  name=="OP_Transa
0c20: 63 74 69 6f 6e 22 20 20 20 5c 0a 20 20 20 20 20  ction"   \.     
0c30: 7c 7c 20 6e 61 6d 65 3d 3d 22 4f 50 5f 41 75 74  || name=="OP_Aut
0c40: 6f 43 6f 6d 6d 69 74 22 20 20 20 20 5c 0a 20 20  oCommit"    \.  
0c50: 20 20 20 7c 7c 20 6e 61 6d 65 3d 3d 22 4f 50 5f     || name=="OP_
0c60: 53 61 76 65 70 6f 69 6e 74 22 20 20 20 20 20 5c  Savepoint"     \
0c70: 0a 20 20 20 20 20 7c 7c 20 6e 61 6d 65 3d 3d 22  .     || name=="
0c80: 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 22 20 20  OP_Checkpoint"  
0c90: 20 20 5c 0a 20 20 20 20 20 7c 7c 20 6e 61 6d 65    \.     || name
0ca0: 3d 3d 22 4f 50 5f 56 61 63 75 75 6d 22 20 20 20  =="OP_Vacuum"   
0cb0: 20 20 20 20 20 5c 0a 20 20 20 20 20 7c 7c 20 6e       \.     || n
0cc0: 61 6d 65 3d 3d 22 4f 50 5f 4a 6f 75 72 6e 61 6c  ame=="OP_Journal
0cd0: 4d 6f 64 65 22 20 20 20 5c 0a 20 20 20 20 20 7c  Mode"   \.     |
0ce0: 7c 20 6e 61 6d 65 3d 3d 22 4f 50 5f 56 55 70 64  | name=="OP_VUpd
0cf0: 61 74 65 22 20 20 20 20 20 20 20 5c 0a 20 20 20  ate"       \.   
0d00: 20 20 7c 7c 20 6e 61 6d 65 3d 3d 22 4f 50 5f 56    || name=="OP_V
0d10: 46 69 6c 74 65 72 22 20 20 20 20 20 20 20 5c 0a  Filter"       \.
0d20: 20 20 20 20 20 7c 7c 20 6e 61 6d 65 3d 3d 22 4f       || name=="O
0d30: 50 5f 4e 65 78 74 22 20 20 20 20 20 20 20 20 20  P_Next"         
0d40: 20 5c 0a 20 20 20 20 20 7c 7c 20 6e 61 6d 65 3d   \.     || name=
0d50: 3d 22 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 22  ="OP_SorterNext"
0d60: 20 20 20 20 5c 0a 20 20 20 20 20 7c 7c 20 6e 61      \.     || na
0d70: 6d 65 3d 3d 22 4f 50 5f 50 72 65 76 22 20 20 20  me=="OP_Prev"   
0d80: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 29 7b 0a         \.    ){.
0d90: 20 20 20 20 20 20 63 6e 74 2b 2b 0a 20 20 20 20        cnt++.    
0da0: 20 20 77 68 69 6c 65 28 20 75 73 65 64 5b 63 6e    while( used[cn
0db0: 74 5d 20 29 20 63 6e 74 2b 2b 0a 20 20 20 20 20  t] ) cnt++.     
0dc0: 20 6f 70 5b 6e 61 6d 65 5d 20 3d 20 63 6e 74 0a   op[name] = cnt.
0dd0: 20 20 20 20 20 20 75 73 65 64 5b 63 6e 74 5d 20        used[cnt] 
0de0: 3d 20 31 0a 20 20 20 20 20 20 64 65 66 5b 63 6e  = 1.      def[cn
0df0: 74 5d 20 3d 20 6e 61 6d 65 0a 20 20 20 20 7d 0a  t] = name.    }.
0e00: 20 20 7d 0a 0a 20 20 23 20 47 65 6e 65 72 61 74    }..  # Generat
0e10: 65 20 74 68 65 20 6e 75 6d 65 72 69 63 20 76 61  e the numeric va
0e20: 6c 75 65 73 20 66 6f 72 20 6f 70 63 6f 64 65 73  lues for opcodes
0e30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 5f  .  for(i=0; i<n_
0e40: 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 61  op; i++){.    na
0e50: 6d 65 20 3d 20 6f 72 64 65 72 5b 69 5d 3b 0a 20  me = order[i];. 
0e60: 20 20 20 69 66 28 20 6f 70 5b 6e 61 6d 65 5d 3c     if( op[name]<
0e70: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
0e80: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 75 73  .      while( us
0e90: 65 64 5b 63 6e 74 5d 20 29 20 63 6e 74 2b 2b 0a  ed[cnt] ) cnt++.
0ea0: 20 20 20 20 20 20 6f 70 5b 6e 61 6d 65 5d 20 3d        op[name] =
0eb0: 20 63 6e 74 0a 20 20 20 20 20 20 75 73 65 64 5b   cnt.      used[
0ec0: 63 6e 74 5d 20 3d 20 31 0a 20 20 20 20 20 20 64  cnt] = 1.      d
0ed0: 65 66 5b 63 6e 74 5d 20 3d 20 6e 61 6d 65 0a 20  ef[cnt] = name. 
0ee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 61 78 20 3d     }.  }.  max =
0ef0: 20 63 6e 74 0a 20 20 66 6f 72 28 69 3d 31 3b 20   cnt.  for(i=1; 
0f00: 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20  i<=max; i++){.  
0f10: 20 20 69 66 28 20 21 75 73 65 64 5b 69 5d 20 29    if( !used[i] )
0f20: 7b 0a 20 20 20 20 20 20 64 65 66 5b 69 5d 20 3d  {.      def[i] =
0f30: 20 22 4f 50 5f 4e 6f 74 55 73 65 64 5f 22 20 69   "OP_NotUsed_" i
0f40: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e   .    }.    prin
0f50: 74 66 20 22 23 64 65 66 69 6e 65 20 25 2d 32 35  tf "#define %-25
0f60: 73 20 25 31 35 64 22 2c 20 64 65 66 5b 69 5d 2c  s %15d", def[i],
0f70: 20 69 0a 20 20 20 20 69 66 28 20 73 61 6d 65 61   i.    if( samea
0f80: 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 72  s[i] ){.      pr
0f90: 69 6e 74 66 20 22 20 20 20 2f 2a 20 73 61 6d 65  intf "   /* same
0fa0: 20 61 73 20 25 2d 31 32 73 2a 2f 22 2c 20 73 61   as %-12s*/", sa
0fb0: 6d 65 61 73 5b 69 5d 0a 20 20 20 20 7d 20 0a 20  meas[i].    } . 
0fc0: 20 20 20 70 72 69 6e 74 66 20 22 5c 6e 22 0a 20     printf "\n". 
0fd0: 20 7d 0a 0a 20 20 23 20 47 65 6e 65 72 61 74 65   }..  # Generate
0fe0: 20 74 68 65 20 62 69 74 76 65 63 74 6f 72 73 3a   the bitvectors:
0ff0: 0a 20 20 23 0a 20 20 23 20 20 62 69 74 20 30 3a  .  #.  #  bit 0:
1000: 20 20 20 20 20 6a 75 6d 70 0a 20 20 23 20 20 62       jump.  #  b
1010: 69 74 20 31 3a 20 20 20 20 20 70 75 73 68 65 73  it 1:     pushes
1020: 20 61 20 72 65 73 75 6c 74 20 6f 6e 74 6f 20 73   a result onto s
1030: 74 61 63 6b 0a 20 20 23 20 20 62 69 74 20 32 3a  tack.  #  bit 2:
1040: 20 20 20 20 20 6f 75 74 70 75 74 20 74 6f 20 70       output to p
1050: 31 2e 20 20 72 65 6c 65 61 73 65 20 70 31 20 62  1.  release p1 b
1060: 65 66 6f 72 65 20 6f 70 63 6f 64 65 20 72 75 6e  efore opcode run
1070: 73 0a 20 20 23 0a 20 20 66 6f 72 28 69 3d 30 3b  s.  #.  for(i=0;
1080: 20 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20   i<=max; i++){. 
1090: 20 20 20 6e 61 6d 65 20 3d 20 64 65 66 5b 69 5d     name = def[i]
10a0: 0a 20 20 20 20 61 30 20 3d 20 61 31 20 3d 20 61  .    a0 = a1 = a
10b0: 32 20 3d 20 61 33 20 3d 20 61 34 20 3d 20 61 35  2 = a3 = a4 = a5
10c0: 20 3d 20 61 36 20 3d 20 61 37 20 3d 20 30 0a 20   = a6 = a7 = 0. 
10d0: 20 20 20 69 66 28 20 6a 75 6d 70 5b 6e 61 6d 65     if( jump[name
10e0: 5d 20 29 20 61 30 20 3d 20 31 3b 0a 20 20 20 20  ] ) a0 = 1;.    
10f0: 69 66 28 20 6f 75 74 32 5f 70 72 65 72 65 6c 65  if( out2_prerele
1100: 61 73 65 5b 6e 61 6d 65 5d 20 29 20 61 31 20 3d  ase[name] ) a1 =
1110: 20 32 3b 0a 20 20 20 20 69 66 28 20 69 6e 31 5b   2;.    if( in1[
1120: 6e 61 6d 65 5d 20 29 20 61 32 20 3d 20 34 3b 0a  name] ) a2 = 4;.
1130: 20 20 20 20 69 66 28 20 69 6e 32 5b 6e 61 6d 65      if( in2[name
1140: 5d 20 29 20 61 33 20 3d 20 38 3b 0a 20 20 20 20  ] ) a3 = 8;.    
1150: 69 66 28 20 69 6e 33 5b 6e 61 6d 65 5d 20 29 20  if( in3[name] ) 
1160: 61 34 20 3d 20 31 36 3b 0a 20 20 20 20 69 66 28  a4 = 16;.    if(
1170: 20 6f 75 74 32 5b 6e 61 6d 65 5d 20 29 20 61 35   out2[name] ) a5
1180: 20 3d 20 33 32 3b 0a 20 20 20 20 69 66 28 20 6f   = 32;.    if( o
1190: 75 74 33 5b 6e 61 6d 65 5d 20 29 20 61 36 20 3d  ut3[name] ) a6 =
11a0: 20 36 34 3b 0a 20 20 20 20 62 76 5b 69 5d 20 3d   64;.    bv[i] =
11b0: 20 61 30 2b 61 31 2b 61 32 2b 61 33 2b 61 34 2b   a0+a1+a2+a3+a4+
11c0: 61 35 2b 61 36 2b 61 37 3b 0a 20 20 7d 0a 20 20  a5+a6+a7;.  }.  
11d0: 70 72 69 6e 74 20 22 5c 6e 22 0a 20 20 70 72 69  print "\n".  pri
11e0: 6e 74 20 22 2f 2a 20 50 72 6f 70 65 72 74 69 65  nt "/* Propertie
11f0: 73 20 73 75 63 68 20 61 73 20 5c 22 6f 75 74 32  s such as \"out2
1200: 5c 22 20 6f 72 20 5c 22 6a 75 6d 70 5c 22 20 74  \" or \"jump\" t
1210: 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 65  hat are specifie
1220: 64 20 69 6e 22 0a 20 20 70 72 69 6e 74 20 22 2a  d in".  print "*
1230: 2a 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 6c 6c 6f  * comments follo
1240: 77 69 6e 67 20 74 68 65 20 5c 22 63 61 73 65 5c  wing the \"case\
1250: 22 20 66 6f 72 20 65 61 63 68 20 6f 70 63 6f 64  " for each opcod
1260: 65 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 22  e in the vdbe.c"
1270: 0a 20 20 70 72 69 6e 74 20 22 2a 2a 20 61 72 65  .  print "** are
1280: 20 65 6e 63 6f 64 65 64 20 69 6e 74 6f 20 62 69   encoded into bi
1290: 74 76 65 63 74 6f 72 73 20 61 73 20 66 6f 6c 6c  tvectors as foll
12a0: 6f 77 73 3a 22 0a 20 20 70 72 69 6e 74 20 22 2a  ows:".  print "*
12b0: 2f 22 0a 20 20 70 72 69 6e 74 20 22 23 64 65 66  /".  print "#def
12c0: 69 6e 65 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 20  ine OPFLG_JUMP  
12d0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 31            0x0001
12e0: 20 20 2f 2a 20 6a 75 6d 70 3a 20 20 50 32 20 68    /* jump:  P2 h
12f0: 6f 6c 64 73 20 6a 6d 70 20 74 61 72 67 65 74 20  olds jmp target 
1300: 2a 2f 22 0a 20 20 70 72 69 6e 74 20 22 23 64 65  */".  print "#de
1310: 66 69 6e 65 20 4f 50 46 4c 47 5f 4f 55 54 32 5f  fine OPFLG_OUT2_
1320: 50 52 45 52 45 4c 45 41 53 45 20 30 78 30 30 30  PRERELEASE 0x000
1330: 32 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65  2  /* out2-prere
1340: 6c 65 61 73 65 3a 20 2a 2f 22 0a 20 20 70 72 69  lease: */".  pri
1350: 6e 74 20 22 23 64 65 66 69 6e 65 20 4f 50 46 4c  nt "#define OPFL
1360: 47 5f 49 4e 31 20 20 20 20 20 20 20 20 20 20 20  G_IN1           
1370: 20 20 30 78 30 30 30 34 20 20 2f 2a 20 69 6e 31    0x0004  /* in1
1380: 3a 20 20 20 50 31 20 69 73 20 61 6e 20 69 6e 70  :   P1 is an inp
1390: 75 74 20 2a 2f 22 0a 20 20 70 72 69 6e 74 20 22  ut */".  print "
13a0: 23 64 65 66 69 6e 65 20 4f 50 46 4c 47 5f 49 4e  #define OPFLG_IN
13b0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  2             0x
13c0: 30 30 30 38 20 20 2f 2a 20 69 6e 32 3a 20 20 20  0008  /* in2:   
13d0: 50 32 20 69 73 20 61 6e 20 69 6e 70 75 74 20 2a  P2 is an input *
13e0: 2f 22 0a 20 20 70 72 69 6e 74 20 22 23 64 65 66  /".  print "#def
13f0: 69 6e 65 20 4f 50 46 4c 47 5f 49 4e 33 20 20 20  ine OPFLG_IN3   
1400: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 31 30            0x0010
1410: 20 20 2f 2a 20 69 6e 33 3a 20 20 20 50 33 20 69    /* in3:   P3 i
1420: 73 20 61 6e 20 69 6e 70 75 74 20 2a 2f 22 0a 20  s an input */". 
1430: 20 70 72 69 6e 74 20 22 23 64 65 66 69 6e 65 20   print "#define 
1440: 4f 50 46 4c 47 5f 4f 55 54 32 20 20 20 20 20 20  OPFLG_OUT2      
1450: 20 20 20 20 20 20 30 78 30 30 32 30 20 20 2f 2a        0x0020  /*
1460: 20 6f 75 74 32 3a 20 20 50 32 20 69 73 20 61 6e   out2:  P2 is an
1470: 20 6f 75 74 70 75 74 20 2a 2f 22 0a 20 20 70 72   output */".  pr
1480: 69 6e 74 20 22 23 64 65 66 69 6e 65 20 4f 50 46  int "#define OPF
1490: 4c 47 5f 4f 55 54 33 20 20 20 20 20 20 20 20 20  LG_OUT3         
14a0: 20 20 20 30 78 30 30 34 30 20 20 2f 2a 20 6f 75     0x0040  /* ou
14b0: 74 33 3a 20 20 50 33 20 69 73 20 61 6e 20 6f 75  t3:  P3 is an ou
14c0: 74 70 75 74 20 2a 2f 22 0a 20 20 70 72 69 6e 74  tput */".  print
14d0: 20 22 23 64 65 66 69 6e 65 20 4f 50 46 4c 47 5f   "#define OPFLG_
14e0: 49 4e 49 54 49 41 4c 49 5a 45 52 20 7b 5c 5c 22  INITIALIZER {\\"
14f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d  .  for(i=0; i<=m
1500: 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ax; i++){.    if
1510: 28 20 69 25 38 3d 3d 30 20 29 20 70 72 69 6e 74  ( i%8==0 ) print
1520: 66 28 22 2f 2a 20 25 33 64 20 2a 2f 22 2c 69 29  f("/* %3d */",i)
1530: 0a 20 20 20 20 70 72 69 6e 74 66 20 22 20 30 78  .    printf " 0x
1540: 25 30 32 78 2c 22 2c 20 62 76 5b 69 5d 0a 20 20  %02x,", bv[i].  
1550: 20 20 69 66 28 20 69 25 38 3d 3d 37 20 29 20 70    if( i%8==7 ) p
1560: 72 69 6e 74 66 28 22 5c 5c 5c 6e 22 29 3b 0a 20  rintf("\\\n");. 
1570: 20 7d 0a 20 20 70 72 69 6e 74 20 22 7d 22 0a 7d   }.  print "}".}
1580: 0a                                               .