[prev] [thread] [next] [Date index for 2004/12/10]
--0-1316208330-1102668006=:36276 Content-Type: text/plain; charset=us-ascii Content-Id: Content-Disposition: inline Here's a version of AsForm I've been working on. Its finally complete enough for my apps. Tony (or whoever maintains this) , please look at it and see what you think of these changes. Briefly it does to_select without object creation, makes selects for enum columns, bool columns. allows you to get inputs for has_a classess instead of a select box every time (which can get quite annoying when a new customer has_a phone number, address, and email. :) ). You can limit the selections for to_select with a sql limiting clause. You can specify which columns to use in select box. You can use your own column_type sub (which becomes important when you find out the default one doesn't work). You can get types for is_a columns (with column_type sub :) ) and maybe more. I gave a good first run at documenting it . I couldn't get the example formate good so i'm attaching it and posting it on Maypole wiki along with the code. see CHANGES and GETTING SPECIFIC IN MODEL CLASS in pod for some details. thanks ===== pjs __________________________________ Do you Yahoo!? Yahoo! Mail - Helps protect you from nasty viruses. http://promotions.yahoo.com/new_mail --0-1316208330-1102668006=:36276 Content-Type: text/plain; name="AsFormImproved.example" Content-Description: AsFormImproved.example Content-Disposition: inline; filename="AsFormImproved.example" # Big Example with AsForm.pm Improved # ********* NOT TESTED ************** # MYSQL schema CREATE TABLE cd ( cdid INT NOT NULL AUTO_INCREMENT, genre ENUM('Rock','Dance','Punk') NULL, hardcopy BOOL NULL, copy_protection BOOL NULL, location INTEGER UNSIGNED NULL, language VARCHAR(50) NULL, PRIMARY KEY(cdid) ); CREATE TABLE location ( locid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, row CHAR(2) NULL, shelf CHAR(2) NULL, PRIMARY KEY(locid) ); CREATE TABLE rip ( ripid INTEGER UNSIGNED NOT NULL, format VARCHAR(10) NOT NULL, quality VARCHAR(10) NOT NULL, PRIMARY KEY(ripid) ); package Music::DBI; use Class::DBI::AsForm; use base Class::DBI; ... # Define decent column_type until Class::DBI::Column::Type is finished sub column_type { my $class = shift; my $type = $class->_column_info->{$col}->{type} || # check is_a eval{$class->isa_class($col)->column_type($col)}; if ($type =~ /^tinyint\(1\)$/i) { $type = "BOOL"; # same as "Bool('No', 'Yes') } $type; } # Method to get class of is_a inherited columns # Needed to get proper column type sub isa_class { my ($class, $col) = @_; die "Need a column for isa_class." unless $col; my ($isaclass, $exists) = (); eval { my $isa = $class->meta_info("is_a"); foreach ( keys %$isa ) { $isaclass = $isa->{$_}->foreign_class; $exists = $isaclass->find_column($col); last if $exists; } }; $exists ? return $isaclass : return undef; } ... package Music::CD; use base Music::DBI; ... __PACKAGE__->columns(qw/cdid genre copy_protection hardcopy location language /); __PACKAGE__->has_a(location => Music::Location); ... sub has_a_new { { location => [qw/row shelf/] }; # to_field('location') now returns hashref of HTML::Elements for row and shelf. #class specific customizations of column_type can be useful sub column_type { my ($class, $col) = @_; # change default "No/Yes" options for this boolean field return "BOOL('Off', 'ON')" if $col eq 'copy_protection'; # Lie and get a cheap select box :) return "ENUM('English', 'Spanish', 'German')" if $col eq 'language'; return $class->SUPER::column_type($col); } ... package Music::Rip; use base Music::DBI; use Music::CD; ... __PACKAGE__->columns(qw/ripid format quality genre copy_protection hardcopy location language /); __PACKAGE__->is_a(ripid => Music::CD, 'cdid'); sub column_type { # lock input to one value return "ENUM('NO')" if $col eq "harcopy"; # Take advantage of easy select box creation for any col return "ENUM('Best', 'Good', 'Bad')" if $col eq "harcopy"; # Let Class::DBI::Column::Type handle this one return undef if $col eq "format"; # Be efficient and go right to is_a class to get types for rest # Also handy if your base column_type method doesn't check is_a classes return Music::CD->column_type($col); } ... # Now this call my $cgi = Music::Rip->to_cgi; # RESULTS in these types of elements # ripid => text input # format => text input # quality => select box with "Best" first and thus default # genre => select box with "Rock" first # copy_protection => select box with "Off" and "On" having values 0 and 1 and # column definitions default value selected # hardcopy => select box with one value, "No". # location => { row => text input, shelf => text input } # language => select box "English" first --0-1316208330-1102668006=:36276 Content-Type: application/x-perl-module; name="AsForm.pm" Content-Transfer-Encoding: base64 Content-Description: AsForm.pm Content-Disposition: attachment; filename="AsForm.pm" cGFja2FnZSBDbGFzczo6REJJOjpBc0Zvcm07CnVzZSA1LjAwNjsKdXNlIHN0 cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgQ2xhc3M6OkRCSTo6UGx1Z2luOjpU eXBlICgpOyAjIEJ1ZyAgLS0gY29sdW1uX3R5cGUgcmV0dXJucyBjaGFyIGZv ciBlbnVtIGNvbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IyBVc2UgY29sdW1uX3R5cGUgaW4gbW9kZWwgY2xhc3MgaW5zdGVhZCAKCnVz ZSBEYXRhOjpEdW1wZXI7ICAjIHBqcyBmb3IgCnVzZSBDbGFzczo6REJJOjpt eXNxbCAoKTsKb3VyICRPTERfU1RZTEUgPSAwOwoKdXNlIEhUTUw6OkVsZW1l bnQ7CnJlcXVpcmUgRXhwb3J0ZXI7Cm91ciBASVNBID0gcXcoRXhwb3J0ZXIp OwojIFBFVEVSIFNQRUxUWiAtLSAgQWRkZWQgbmV3ICJfdG9fKiIgbWV0aG9k cyB0byBARVhQT1JUIApvdXIgQEVYUE9SVCA9IHF3KCB0b19jZ2kgdG9fZmll bGQgX3RvX3RleHRhcmVhIF90b190ZXh0ZmllbGQgX3RvX3NlbGVjdAp0eXBl X29mIF90b19mb3JlaWduX2lucHV0cyBfdG9fZW51bV9zZWxlY3QgX3RvX2Jv b2xfc2VsZWN0ICk7IApvdXIgJFZFUlNJT04gPSAnMi4zJzsKCj1oZWFkMSBO QU1FCgpDbGFzczo6REJJOjpBc0Zvcm0gIApQcm9kdWNlIEhUTUwgZm9ybSBl bGVtZW50cyBmb3IgZGF0YWJhc2UgY29sdW1ucwoKPWhlYWQxIFNZTk9QU0lT CgogICAgcGFja2FnZSBNdXNpYzo6Q0Q7CiAgICB1c2UgQ2xhc3M6OkRCSTo6 QXNGb3JtOwogICAgdXNlIGJhc2UgJ0NsYXNzOjpEQkknOwogICAgdXNlIENH STsKICAgIC4uLgoKICAgIHN1YiBjcmVhdGVfb3JfZWRpdCB7CiAgICAgICAg bXkgJGNsYXNzID0gc2hpZnQ7CiAgICAgICAgbXkgJWNnaV9maWVsZCA9ICRj bGFzcy0+dG9fY2dpOwogICAgICAgIHJldHVybiBzdGFydF9mb3JtLAogICAg ICAgICAgICAgICAobWFwIHsgIjxiPiRfPC9iPjogIi4gJGNnaV9maWVsZHsk X30tPmFzX0hUTUwuIiA8YnI+IiB9IAogICAgICAgICAgICAgICAgICAgICRj bGFzcy0+Q29sdW1ucyksCiAgICAgICAgICAgICAgIGVuZF9mb3JtOwogICAg fQoKICAgICMgPGZvcm0gbWV0aG9kPSJwb3N0Ii4uLj4KICAgICMgVGl0bGU6 IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgLz4gPGJyPgogICAg IyBBcnRpc3Q6IDxzZWxlY3QgbmFtZT0iQXJ0aXN0Ij4gCiAgICAjICAgICAg ICAgICA8b3B0aW9uIHZhbHVlPTE+R3JhdGVmdWwgRGVhZDwvb3B0aW9uPgog ICAgIyAgICAgICAgICAgLi4uCiAgICAjICAgICAgICAgPC9zZWxlY3Q+CiAg ICAjIC4uLgogICAgIyA8L2Zvcm0+Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRo aXMgbW9kdWxlIGhlbHBzIHRvIGdlbmVyYXRlIEhUTUwgZm9ybXMgZm9yIGNy ZWF0aW5nIG5ldyBkYXRhYmFzZSByb3dzCm9yIGVkaXRpbmcgZXhpc3Rpbmcg cm93cy4gSXQgbWFwcyBjb2x1bW4gbmFtZXMgaW4gYSBkYXRhYmFzZSB0YWJs ZSB0bwpIVE1MIGZvcm0gZWxlbWVudHMgd2hpY2ggZml0IHRoZSBzY2hlbWEu IExhcmdlIHRleHQgZmllbGRzIGFyZSB0dXJuZWQKaW50byB0ZXh0YXJlYXMs IGFuZCBmaWVsZHMgd2l0aCBhIGhhcy1hIHJlbGF0aW9uc2hpcCB0byBvdGhl cgpDPENsYXNzOjpEQkk+IHRhYmxlcyBhcmUgdHVybmVkIGludG8gc2VsZWN0 IGRyb3AtZG93bnMgYnkgZGVmYXVsdCAKdG8gc2VsZWN0IGEgcm93IGZyb20g dGhlIGpvaW5lZCBjbGFzcy4gQWxzbyBlbnVtIGFuZCBib29sZWFuICBjb2x1 bW5zIAphcmUgbWFkZSBpbnRvIHNlbGVjdCBib3hlcy4KCgo9aGVhZDEgTUVU SE9EUwoKVGhlIG1vZHVsZSBpcyBhIG1peC1pbiB3aGljaCBhZGRzIHR3byBh ZGRpdGlvbmFsIG1ldGhvZHMgdG8geW91cgpDPENsYXNzOjpEQkk+LWRlcml2 ZWQgY2xhc3MuIAoKPWhlYWQyIHRvX2NnaQoKVGhpcyByZXR1cm5zIGEgaGFz aCBtYXBwaW5nIGFsbCB0aGUgY29sdW1uIG5hbWVzIG9mIHRoZSBjbGFzcyB0 bwpIVE1MOjpFbGVtZW50IG9iamVjdHMgcmVwcmVzZW50aW5nIGZvcm0gd2lk Z2V0cy4KCj1jdXQKCnN1YiB0b19jZ2kgewogICAgbXkgJGNsYXNzID0gc2hp ZnQ7CiAgICBtYXAgeyAkXyA9PiAkY2xhc3MtPnRvX2ZpZWxkKCRfKSB9ICRj bGFzcy0+Y29sdW1uczsKfQoKPWhlYWQyIHRvX2ZpZWxkKCRmaWVsZCBbLCAk aG93XSkKClRoaXMgbWFwcyBhbiBpbmRpdmlkdWFsIGNvbHVtbiB0byBhIGZv cm0gZWxlbWVudC4gVGhlIEM8aG93PiBhcmd1bWVudApjYW4gYmUgdXNlZCB0 byBmb3JjZSB0aGUgZmllbGQgdHlwZSBpbnRvIG9uZSBvZiBDPHRleHRmaWVs ZD4sIEM8dGV4dGFyZWE+Cm9yIEM8c2VsZWN0PjsgeW91IGNhbiB1c2UgdGhp cyBpcyB5b3Ugd2FudCB0byBhdm9pZCB0aGUgYXV0b21hdGljIGRldGVjdGlv bgpvZiBoYXMtYSByZWxhdGlvbnNoaXBzLiAKCj1jdXQKCj1oZWFkMSAqKipO RVcqKioqIEdFVFRJTkcgU1BFQ0lGSUMgSU4gTU9ERUwgQ0xBU1MgCgpZb3Ug Y2FuIHRlbGwgQXNGb3JtIHNvbWUgdGhpbmdzIGluIHlvdXIgbW9kZWwgY2xh c3NlcyB0byBnZXQgY3VzdG9tIHJlc3VsdHMuIEluIHBhcnRpY3VsYXIgeW91 IGNhbiBoYXZlOgoKPWhlYWQyIEN1c3RvbSBjb2x1bW5fdHlwZSBtZXRob2Rz CgpTaW5jZSBtdWNoIG9mIHRoaXMgbWV0aG9kcyBmdW5jdGlvbmFsaXR5IHJl bGllcyBvbiB0aGUgc3Vicm91dGluZSBDPGNvbHVtbl90eXBlPgpyZXR1cm5p bmcgdGhlIHR5cGUgc3RyaW5nIGZyb20gdGhlIGRhdGFiYXNlIHRhYmxlIGRl ZmluaXRpb24gTW9kZWwgY2xhc3NlcyBjYW4gYmVuZWZpdCBhIGdyZWF0IGRl YWwgYnkgd3JpdGluZyB0aGVpciBvd24uIFNlZSBleGFtcGxlLiAgVGhpcyB2 ZXJzaW9uIHRyaWVzIHRvIGNhbGwgY29sdW1uX3R5cGUgd2l0aCB0aGUgbW9k ZWwgY2xhc3MuIElGIHlvdXIgbW9kZWwncyBjb2x1bW5fdHlwZSByZXR1cm5z IHVuZGVmIG9yIGl0IGhhcyBubyBzdWNoIG1ldGhvZCBpdCBmYWxscyBiYWNr IG9uIEM8JkNsYXNzOjpEQkk6OlBsdWdpbjo6VHlwZTo6Y29sdW1uX3R5cGU+ IHdoaWNoIGlzIGRhdGFiYXNlIGluZGVwZW5kZW50IGJ1dCBub3QgZnVsbHkg ZnVuY3Rpb25hbCB5ZXQuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHkgbWFrZSBh IGN1c3RvbSBDPGNvbHVtbl90eXBlPiBtZXRob2QgaW4geW91ciBiYXNlIG1v ZGVsIGNsYXNzIGFuZCBvdmVycmlkZSBpdCBpbiBzdWJjbGFzc2VzIGF0IHdp bGwuIFNvbWUgQ2xhc3M6OkRCSTo6KioqKiBkcml2ZXJzIHN1Y2ggYXMgQ2xh c3M6OkRCSTo6bXlzcWwgaGF2ZSBtb3N0bHkgZnVuY3Rpb25hbCBvbmVzLiAg CgpZb3UgY2FuIHNldCBib29sIG9wdGlvbnMgZm9yIHVzZXJzICwgbWFrZSBz ZWxlY3QgYm94ZXMgZm9yIG9yZGluYXJ5IGNvbHVtbnMgKGJ5IGx5aW5nIGFu ZCByZXR1cm5pbmcgYW4gZW51bSgnYmxhaCcsICdibGgnKSBzdHJpbmcsIGdl dCBjb3JyZWN0IHR5cGVzIGZvciBpc19hIGluaGVyaXRlZCBjb2x1bW5zLCBv cHRpbWl6ZSAsIGFuZCBtYXliZSBtb3JlLgoKPWhlYWQyIElucHV0cyBmb3Ig dGhlIGhhc19hIGNsYXNzIHJhdGhlciB0aGFuIGEgc2VsZWN0IGJveCBldmVy eSB0aW1lLgoKV2UndmUgYWxsIHByb2JhYmx5IHdhbnRlZCB0aGlzIGF0IG9u ZSB0aW1lIG9yIGFub3RoZXIuIEluIHlvdXIgbW9kZWwgY2xhc3MgbWFrZSBh IGhhc19hX25ldyBzdWIgdG8gdGVsbCBBc0Zvcm0geW91IHdhbnQgdG8gY3Jl YXRlIGEgbmV3IG9uZSBvZiB0aGVzZSBGb29zIGZvciB0aGlzIG9iamVjdCBy YXRoZXIgdGhhbiBzZWxlY3QgZnJvbSBleGlzdGluZyBvbmVzLiBUaGlzIGV4 YW1wbGUgZ2V0cyBpbnB1dHMgZm9yIHRoZSBzcGVjaWZpZWQgYWRyZXNzIGNv bHVtbnMgYW5kIEFMTCBlbWFpbCBjb2x1bW5zLiAgU3BlY2lmeWluZyB0aGUg Y29sdW1ucyBtYWtlcyB0aGlzIHN1YiBoYW5keSB0byBoYXZlIGluIFRlbXBs YXRlcyBhcyB0aGV5IGNhbiB1c2UgQzxjbGFzcy5oYXNfYV9uZXcuYWRkcmVz cz4gdG8gZmluZCBvdXQgd2hhdCBpbnB1dHMgYW5kIGluIHdoYXQgb3JkZXIg eW91IHdhbnQgZnJvbSB0aGUgaGFzX2EgY2xhc3Mgb24geW91ciBmb3JtLgoK ICAgIEN1c3RvbWVyLT5oYXNfYShhZGRyZXNzID0+ICJBZGRyZXNzIik7CiAg ICBDdXN0b21lci0+aGFzX2EoZW1haWwgICA9PiAiRW1haWwiKTsKCXN1YiBo YXNfYV9uZXcgeyB7IAoJCWFkZHJlc3MgPT4gWyBxdy9zdHJlZXQgY2l0eSBz dGF0ZSB6aXAvIF0sICMgZWxlbWVudHMgZm9yIHRoZXNlIGNvbHMgCgkgCWVt YWlsICAgPT4gW10sICMgQUxMIAoJfQoKVGhlbiB3aGVuIHlvdSBjYWxsIEM8 Q3VzdG9tZXItPnRvX2NnaT4sIGluc3RlYWQgb2YgYSBzaW5nbGUgZWxlbWVu dCBpbiB0aGUgJ2FkZHJlc3MnIGFuZCBlbWFpbCBzbG90cywgeW91IHdpbGwg aGF2ZSBhIGhhc2hyZWYgb2YgZWxlbWVudHMuICpOT1RFIC0tIE5PIGF0dGVt cHQgaXMgbWFkZSB0byBoYW5kbGUgY29sdW1uIG5hbWUgb3ZlcmxhcHMuIFlv dSBjYW4gZG8gdGhhdCBpbiB0aGUgdGVtcGxhdGVzIGVhc2lseSBob3dldmVy IGFzIHlvdSBrbm93IHRoYXQgY29sdW1ucyBpbiB0aGUgYWRkcmVzcyBoYXNo IGFyZSBhbGwgZnJvbSB0aGUgYWRkcmVzcyB0YWJsZS5UaGlzIHdvcmtzIGZv ciBjYWxscyB3aXRoIG9iamVjdHMgdG9vIHNvIHlvdSBjYW4gZWRpdCB5b3Vy IGFkZHJlc3MgYW5kIGVtYWlsICBvYmplY3RzIG9uIHRoZSBDdXN0b21lciBm b3JtLiAKCQo9aGVhZDIgQXBwcm9wcmlhdGUgZWxlbWVudHMgZm9yIGNvbHVt bnMgaW5oZXJpdGVkIGZyb20gYW4gaXNfYSByZWxhdGlvbnNoaXAKCkF0IGxl YXN0IHlvdSBoYXZlIHRoZSBwb3dlciB0byBnZXQgdGhlbSBieSBtYWtpbmcg Y29sdW1uX3R5cGUgd29yay4KCj1oZWFkMiBTZWxlY3QgYm94IHNwZWNpZmlj YXRpb25zIGZvciBoYXNfYSBjb2x1bW5zLgoKWW91IGNhbiBzcGVjaWZ5IGNv bHVtbnMgdG8gYmUgc2VsZWN0ZWQgZm9yIGEgc2VsZWN0IGJveCBmb3IgYSBj bGFzcyBieSA6CgoJX19QYWNrYWdlX18tPmNvbHVtbnMoJ1NlbGVjdEJveCcg PT4gcXcvY29sMSBjb2wyLyk7CgpJZiB5b3UgZG9uJ3QsICdTdHJpbmdpZnkn IGNvbHVtbnMgYXJlIHVzZWQgaWYgdGhleSBleGlzdCBhbmQgbGFzdGx5ICdF c3NlbnRpYWwnIGNvbHVtbnMuIFRoZSAnUHJpbWFyeScgY29sdW1uIGlzIGFs d2F5cyBwdXNoZWQgdG8gZnJvbnQgb2YgbGlzdCBhbmQgaXMgdGhlbiBwb3Bw ZWQgb2ZmIHRvIGJlY29tZSB0aGUgb3B0aW9uIHZhbHVlLiAgVGhpcyBtZWFu cyBkb24ndCBpbmNsdWRlIGl0IGluIHRoZSAnU2VsZWN0Qm94JyBjb2x1bW5z IHVubGVzcyB5b3Ugd2FudCBpdCBpbiB0aGUgb3B0aW9uIGNvbnRlbnQuIAoK WW91IGNhbiBsaW1pdCByb3dzIHNlbGVjdGVkIGZvciB0aGUgc2VsZWN0IGJv eCB3aXRoIGEgaGFzX2Ffc2VsZWN0X2xpbWl0IHN1YiBsaWtlIHNvOgoKCUN1 c3RvbWVyLT5oYXNfYShwYXlfcGxhbiA9PiAiUGF5UGxhbiIpOwoJQ3VzdG9t ZXItPmhhc19hKHBpY2tfZnJvbVRvcEZpdmUgID0+ICJNb3ZpZSIKCXN1YiBo YXNfYV9zZWxlY3RfbGltaXQgeyB7CgkgCXBheV9wbGFuICAgICAgICAgICAg PT4gIldIRVJFIGlzX2F2YWlsYWJsZSA9IDEiLCAKCSAgCXBpY2tfZnJvbVRv cEZpdmUgICAgPT4gIk9SREVSIEJZIHJhbmsgQVNDIExJTUlUIDUiIH0KCX0K CklmIHlvdSBuZWVkIGNvbXBsZXggc3RyaW5naWZpY2F0aW9uIG1ha2UgYSBD PHN0cmluZ2lmeV9zZWxlY3Rib3g+IHN1YiB3aGljaCB0YWtlcyBhbiBhcnJh eXJlZi4gRWxlbWVudHMgYXJlIGluIG9yZGVyIHNwZWNpZmllZCBpbiBjb2x1 bW5zKCdTZWxlY3RCb3gnKSBvciB3aGF0ZXZlciBjb2x1bW5zIGxpc3Qgd2Fz IHVzZWQuIAoKPWN1dAoKIyBUT0RPIC0tIHBlcmhhcHMgY2FsbCB0byBmaWVs ZCB3aXRoIGlzX2Egb2JqZWN0IGlmIGlzX2EgY29sLgojIHBvc3NpYmxlIHBy b2JsZW0gaWYgaXNfYSBpcyBtYXBwZWQgdG8gcHJpbWFyeSBrZXkgaW4gY2Fs bGluZyBjbGFzcwpzdWIgdG9fZmllbGQgewogICAgbXkgKCRzZWxmLCAkZmll bGQsICRob3cpID0gQF87CiAgICBteSAkY2xhc3MgPSByZWYgJHNlbGYgfHwg JHNlbGY7CgoKICAgIGlmICgkaG93IGFuZCAkaG93ID1+IC9eKHRleHQoYXJl YXxmaWVsZCl8c2VsZWN0KSQvKSB7CiAgICAgICAgbm8gc3RyaWN0ICdyZWZz JzsKICAgICAgICBteSAkbWV0aCA9ICJfdG9fJGhvdyI7CgkJIyBwanMgLS0g Y2hhbmdlZCB0byBzZWxmIHNvIHZhbHVlcyBjYW4gYmUgZ290dGVuIGlmIGV4 aXN0cwogICAgICAgIHJldHVybiAkc2VsZi0+JG1ldGgoJGZpZWxkKTsKICAg IH0KCgkjTk9URSAtLSBpZiBpdHMgYSBpbmhlcml0ZWQgY29sdW1uIChmcm9t IGlzX2EpIHRoaXMgaGFzX2EgY2hlY2sgd2lsbCBmYWlsCgkjIFdoYXQgc2hv dWxkIGl0IGRvPyAKCSMgV29ya2Fyb3VuZCBpcyB0byBkZWZpbmUgaGFzX2Eg Zm9yIGluaGVyaXRlZCBjb2x1bW4gaW4gc3ViIGNsYXNzIAogICAgbXkgJGhh c2EgPSAkY2xhc3MtPl9faGFzYV9yZWxzLT57JGZpZWxkfTsKCW15ICRoYXNh X2NsYXNzOwoJJGhhc2FfY2xhc3MgPSAkaGFzYS0+WzBdIAoJCWlmIGRlZmlu ZWQgJGhhc2EgYW5kICRoYXNhLT5bMF0tPmlzYSgiQ2xhc3M6OkRCSSIpOwoK CSMgVGhpcyB3aG9sZSBtZXNzIGNvdWxkIHByb2JhYmx5IGJlbmlmaXQgZnJv bSBhIGRlc2lnbiBwYXR0ZXJuLiAKCSMgQ2hhaW4gIG9mIENvbW1hbmQ/IAoJ cmV0dXJuICRzZWxmLT5fdG9fZm9yZWlnbl9pbnB1dHMoJGZpZWxkLCAkaGFz YV9jbGFzcykKICAgIAlpZiAoICRoYXNhX2NsYXNzIGFuZCBldmFseyAkY2xh c3MtPmhhc19hX25ldy0+eyRmaWVsZH0gfSk7CgogICAgcmV0dXJuICRzZWxm LT5fdG9fc2VsZWN0KCRmaWVsZCwgJGhhc2EtPlswXSkKCQlpZiAkaGFzYV9j bGFzczsKCgkjIFRyeSBtb2RlbCBjbGFzcydzIGNvbHVtbl90eXBlIGZpcnN0 CiAgICBteSAkdHlwZSA9IGV2YWwgeyRjbGFzcy0+Y29sdW1uX3R5cGUoJGZp ZWxkKTt9OwoJdW5sZXNzICgkdHlwZSkgewogICAgCSMgUmlnaHQsIGhhdmUg c29tZSBvZiB0aGlzIQogICAgCWV2YWwgInBhY2thZ2UgJGNsYXNzOyBDbGFz czo6REJJOjpQbHVnaW46OlR5cGUtPmltcG9ydCgpIjsKICAgIAkkdHlwZSA9 ICRjbGFzcy0+Y29sdW1uX3R5cGUoJGZpZWxkKTsKCX0KCgkjIHB1dHRpbmcg YWJvdmUgaW4gc3ViIGdldCBlcnJvcjogbm8gbWV0aG9kIGNvbHVtbl90eXBl IGluIENsYXNzOjpEQkk6OkNvbHVtbgoJI215ICR0eXBlID0gZ2V0X2NvbHVt bl90eXBlKCRmaWVsZCk7CgkJCQkJCQkJCQkJICAgCiAgICByZXR1cm4gJHNl bGYtPl90b190ZXh0YXJlYSgkZmllbGQpCiAgICAgICAgaWYgJHR5cGUgYW5k ICR0eXBlID1+IC9eKFRFWFR8QkxPQikkL2k7CgoJcmV0dXJuICRzZWxmLT5f dG9fZW51bV9zZWxlY3QoJGZpZWxkLCAkdHlwZSkgIAoJCWlmICgkdHlwZSBh bmQgICR0eXBlID1+IC9eRU5VTVwoKC4qPylcKSQvaSApOyAKCQoJcmV0dXJu ICRzZWxmLT5fdG9fYm9vbF9zZWxlY3QoJGZpZWxkLCAkdHlwZSkKCQlpZiAo JHR5cGUgYW5kICAkdHlwZSA9fiAvXkJPT0wvaSApOyAKCQkKICAgIHJldHVy biAkc2VsZi0+X3RvX3RleHRmaWVsZCgkZmllbGQpOwoKfQoKc3ViIF90b190 ZXh0YXJlYSB7CiAgICBteSAoJHNlbGYsICRjb2wpID0gQF87CiAgICBteSAk YSA9IEhUTUw6OkVsZW1lbnQtPm5ldygidGV4dGFyZWEiLCBuYW1lID0+ICRj b2wpOwogICAgaWYgKHJlZiAkc2VsZikgeyAkYS0+cHVzaF9jb250ZW50KCRz ZWxmLT4kY29sKSB9CiAgICAkT0xEX1NUWUxFICYmIHJldHVybiAkYS0+YXNf SFRNTDsKICAgICRhOwp9CgpzdWIgX3RvX3RleHRmaWVsZCB7CiAgICBteSAo JHNlbGYsICRjb2wpID0gQF87CiAgICBteSAkdmFsdWUgPSByZWYgJHNlbGYg JiYgJHNlbGYtPiRjb2w7CiAgICBteSAkYSA9IEhUTUw6OkVsZW1lbnQtPm5l dygiaW5wdXQiLCB0eXBlPT4gInRleHQiLCBuYW1lID0+ICRjb2wpOwogICAg JGEtPmF0dHIoInZhbHVlIiA9PiAkdmFsdWUpIGlmICR2YWx1ZTsKICAgICRP TERfU1RZTEUgJiYgcmV0dXJuICRhLT5hc19IVE1MOwogICAgJGE7Cn0KCiMg UGV0ZXIgU3BlbHR6IC0tIAojIFJld3JvdGUgdGhpcyB0byBiZSBlZmZpY2ll bnQuIE5vIG9iamVjdCBjcmVhdGlvbi4gCiMgQWxzbywgYWRkZWQgb3B0aW9u IGZvciBDREJJIGNsYXNzZXMgdG8gc3BlY2lmeSBhIGxpbWl0aW5nIGNsYXVz ZQojIHZpYSAiaGFzX2Ffc2VsZWN0X2xpbWl0Ii4gCnN1YiBfdG9fc2VsZWN0 IHsKICAgIG15ICgkc2VsZiwgJGNvbCwgJGhpbnQpID0gQF87CiAgICBteSAk aGFzX2FfY2xhc3MgPSAkaGludCB8fCAkc2VsZi0+X19oYXNhX3JlbHMtPnsk Y29sfS0+WzBdOwoJCgkjIFBvc3NpYmxlIHNxbCBsaW1pdGluZyBjbGF1c2Ug KCJXSEVSRSBhY29sID0gJ1gnICIgb3IgIkxJTUlUIDEwIiwgZXRjKSAKCW15 ICRzZWxlY3RfYm94X2xpbWl0ID0gZXZhbCB7ICRzZWxmLT5oYXNfYV9zZWxl Y3RfbGltaXQtPnskY29sfSB9IDsgIAoKCSMgR2V0IGNvbHVtbnMgdG8gYXBw ZWFyIGluIHNlbGVjdCBib3ggb3B0aW9ucyBvbiBmb3Jtcy4gCgkjIFRPRE8g LS0gdGhlcmUgaXMgbWF5YmUgYSBnb29kIGlkaW9tIGZvciB0aGlzLgoJbXkg QHNlbGVjdF9ib3hfY29sczsKCUBzZWxlY3RfYm94X2NvbHMgPSAkaGFzX2Ff Y2xhc3MtPmNvbHVtbnMoJ1NlbGVjdEJveCcpOwoJQHNlbGVjdF9ib3hfY29s cyA9ICRoYXNfYV9jbGFzcy0+Y29sdW1ucygnU3RyaW5naWZ5JykgdW5sZXNz IEBzZWxlY3RfYm94X2NvbHM7CglAc2VsZWN0X2JveF9jb2xzID0gJGhhc19h X2NsYXNzLT5fZXNzZW50aWFsIHVubGVzcyBAc2VsZWN0X2JveF9jb2xzOwoJ dW5zaGlmdCBAc2VsZWN0X2JveF9jb2xzLCAkaGFzX2FfY2xhc3MtPmNvbHVt bnMoJ1ByaW1hcnknKTsgCgkKCglteSAkc3FsID0gIlNFTEVDVCAiIC4gam9p biggJywgJywgQHNlbGVjdF9ib3hfY29scykgLiAiIEZST00gIiAuIAoJCSAg ICAgICRoYXNfYV9jbGFzcy0+dGFibGUgLiAiICIgLiAkc2VsZWN0X2JveF9s aW1pdDsKCiN3YXJuICJzZWxlY3QgYm94IGNvbHMgPSBAc2VsZWN0X2JveF9j b2xzICI7CiN3YXJuICJzcWwgaXMgJHNxbCI7CgkKCW15ICRvcHRzX2RhdGEg PSAkc2VsZi0+ZGJfTWFpbi0+c2VsZWN0YWxsX2FycmF5cmVmKCRzcWwpOyAK I3dhcm4gRHVtcGVyKCRvcHRzX2RhdGEpOwoJCiAgICBteSAkYSA9IEhUTUw6 OkVsZW1lbnQtPm5ldygic2VsZWN0IiwgbmFtZSA9PiAkY29sKTsKICAgIGZv ciAoQCRvcHRzX2RhdGEpIHsgCgkJIyBpZCBiZXR0ZXIgYmUgZmlyc3QgZWxl bWVudAoJCW15ICRpZCA9IHNoaWZ0IEAkXzsKICAgICAgICBteSAkb3B0ID0g SFRNTDo6RWxlbWVudC0+bmV3KCJvcHRpb24iLCB2YWx1ZSA9PiAkaWQgKTsK ICAgICAgICAkb3B0LT5hdHRyKCJzZWxlY3RlZCIgPT4gInNlbGVjdGVkIikg aWYgcmVmICRzZWxmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhbmQgZXZhbCB7ICRpZCBlcSAkc2VsZi0+JGNv bC0+aWQgfTsKCQkjIFRPRE8gLS0gbWF5YmUgbW9kaWZ5IHN0cmluZ2lmeV9z ZWxmIHRvIGJlIGNsYXNzIG1ldGggYW5kIHRha2UgYXJyYXkKCQlteSAkY29u dGVudCA9IGV2YWwgeyRoYXNfYV9jbGFzcy0+c3RyaW5naWZ5X3NlbGVjdGJv eChAJF8pO30gfHwgCgkJCQkJICBqb2luKCcgJywgQCRfKTsKICAgICAgICAk b3B0LT5wdXNoX2NvbnRlbnQoICRjb250ZW50ICk7CiAgICAgICAgJGEtPnB1 c2hfY29udGVudCgkb3B0KTsKICAgIH0KICAgICRPTERfU1RZTEUgJiYgcmV0 dXJuICRhLT5hc19IVE1MOwogICAgJGE7Cn0KCiMgUGV0ZXIgU3BlbHR6IC0t IG1ha2VzIHNlbGVjdCBpbnB1dHMgZm9yIGVudW0gY29sdW1uCiMgVE9ETyBj aGVjayBvdGhlciBEQiBlbnVtIGZvcm1zCiMgVGhpcyBleHBlY3RzIGVudW0g Y29sIHR5cGUgZm9ybWF0IGxpa2UgbXlzcWwgLS0gZW51bSgndmFsJywgJ290 aGVydmFsJywgLi4uKQpzdWIgX3RvX2VudW1fc2VsZWN0IHsKICAgIG15ICgk c2VsZiwgJGNvbCwgJHR5cGUpID0gQF87CgkkdHlwZSA9fiAvRU5VTVwoKC4q PylcKS9pOwoJKG15ICRlbnVtID0gJDEpID1+IHMvJy8vZzsKCW15IEBlbnVt X3ZhbHMgPSBzcGxpdCAvLC8sICRlbnVtOwoKICAgIG15ICRhID0gSFRNTDo6 RWxlbWVudC0+bmV3KCJzZWxlY3QiLCBuYW1lID0+ICRjb2wpOwogICAgZm9y ICggQGVudW1fdmFscyApIHsgCiAgICAgICAgbXkgJHNlbCA9IEhUTUw6OkVs ZW1lbnQtPm5ldygib3B0aW9uIiwgdmFsdWUgPT4gJF8pOyAKICAgICAgICAk c2VsLT5hdHRyKCJzZWxlY3RlZCIgPT4gInNlbGVjdGVkIikgaWYgcmVmICRz ZWxmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhbmQgZXZhbCB7ICRzZWxmLT4kY29sIGVxICRfIH07CiAgICAg ICAgJHNlbC0+cHVzaF9jb250ZW50KCRfKTsgCiAgICAgICAgJGEtPnB1c2hf Y29udGVudCgkc2VsKTsKICAgIH0KICAgICRPTERfU1RZTEUgJiYgcmV0dXJu ICRhLT5hc19IVE1MOwogICAgJGE7Cn0KCiMgUGV0ZXIgU3BlbHR6IC0tIFRo aXMgIG1ha2VzIHNlbGVjdCBpbnB1dCBmb3IgYm9vbGVhbiBjb2x1bW4KIyAk dHlwZSA9ICJib29sKCd6ZXJvX3N0cmluZycsICdvbmVfc3RyaW5nJykiLiBE ZWZhdWx0IHN0cmluZ3MgYXJlICJObyIsICJZZXMiLiAKc3ViIF90b19ib29s X3NlbGVjdCB7CiAgICBteSAoJHNlbGYsICRjb2wsICR0eXBlKSA9IEBfOwoJ bXkgQGJvb2xfdGV4dCA9ICgnTm8nLCAnWWVzJyk7CQoJaWYgKCR0eXBlID1+ IC9CT09MXCgoLis/KVwpL2kpIHsKCQkobXkgJGJvb2wgPSAkMSkgPX4gcy8n Ly9nOwoJCUBib29sX3RleHQgPSBzcGxpdCAvLC8sICRib29sOwoJfQoKCSNU T0RPIGdldCBkZWZhdWx0IGZvciBjb2x1bW4gYW5kIHVzZSBpdCBpbnN0YWVk IG9mICAtLS0tLS0tLS0tLQoJbXkgJG15c2VsZWN0ZWQgPSByZWYgJHNlbGYg PyBldmFsIHskc2VsZi0+JGNvbDt9IDogJGJvb2xfdGV4dFsyXTsKCiAgICBt eSAkYSA9IEhUTUw6OkVsZW1lbnQtPm5ldygic2VsZWN0IiwgbmFtZSA9PiAk Y29sKTsKICAgIG15ICRvcHQwID0gSFRNTDo6RWxlbWVudC0+bmV3KCJvcHRp b24iLCB2YWx1ZSA9PiAwKTsgCiAgICAkb3B0MC0+YXR0cigic2VsZWN0ZWQi ID0+ICJzZWxlY3RlZCIpIGlmICRteXNlbGVjdGVkIGVxIDA7IAogICAgJG9w dDAtPnB1c2hfY29udGVudCgkYm9vbF90ZXh0WzBdKTsgCiAgICAkYS0+cHVz aF9jb250ZW50KCRvcHQwKTsKCiAgICBteSAkb3B0MSA9IEhUTUw6OkVsZW1l bnQtPm5ldygib3B0aW9uIiwgdmFsdWUgPT4gMSk7IAogICAgJG9wdDEtPmF0 dHIoInNlbGVjdGVkIiA9PiAic2VsZWN0ZWQiKSBpZiAkbXlzZWxlY3RlZCBl cSAxOyAKICAgICRvcHQxLT5wdXNoX2NvbnRlbnQoJGJvb2xfdGV4dFsxXSk7 IAogICAgJGEtPnB1c2hfY29udGVudCgkb3B0MSk7CgogICAgJE9MRF9TVFlM RSAmJiByZXR1cm4gJGEtPmFzX0hUTUw7CiAgICAkYTsKfQoKIyBQZXRlciBT cGVsdHogLS0KIyBUaGlzIGp1c3QgY2FsbHMgdG9fZmllbGQgd2l0aCBmb3Jl aWduIGNsYXNzIGZvciB0aGUgY29sdW1ucyBkZWZpbmVkIGluCiMgaGFzX2Ff bmV3IG9yICRjbGFzcy0+Y29sdW1ucy4gSXQgcmV0dXJucyBoYXNocmVmIG9m IHRoZSBpbnB1dCBlbGVtZW50cyAKc3ViIF90b19mb3JlaWduX2lucHV0cyB7 CglteSAoJHNlbGYsICRjb2wsICRoYXNhX2NsYXNzT1JvYmopID0gQF87Cglt eSBAZm9yZWlnbl9maWVsZHMgPSBAeyRzZWxmLT5oYXNfYV9uZXctPnskY29s fX07CglAZm9yZWlnbl9maWVsZHMgPSAkaGFzYV9jbGFzc09Sb2JqLT5jb2x1 bW5zIHVubGVzcyBAZm9yZWlnbl9maWVsZHM7CgoJIyBnZXQgdGhlIGZvcmVp Z24gb2JqZWN0IGlmIHdlIGNhbgoJaWYgKHJlZiAkc2VsZikgewoJCW15ICRp ZCA9ICRzZWxmLT4kY29sLT5pZCA7CgkJbXkgJGZvcmVpZ25fb2JqID0gJGhh c2FfY2xhc3NPUm9iai0+cmV0cmlldmUoJHNlbGYtPiRjb2wtPmlkKTsKCQkk aGFzYV9jbGFzc09Sb2JqID0gJGZvcmVpZ25fb2JqIGlmICRmb3JlaWduX29i ajsKCX0KCglteSAlcmVzdWx0ID0gbWFwIHsgJF8gPT4gJGhhc2FfY2xhc3NP Um9iai0+dG9fZmllbGQoJF8pIH0gQGZvcmVpZ25fZmllbGRzOwoJcmV0dXJu IFwlcmVzdWx0Owp9CgoKIyB0aGlzIGdpdmVzIGVycm9yIGFuZCBpIGhhdmUg bm8gaWRlYSB3aHkKc3ViIGdldF9jb2x1bW5fdHlwZSB7CglteSAoJGNsYXNz LCAkZmllbGQpID0gQF87CgkjIFRyeSBtb2RlbCBjbGFzcydzIGNvbHVtbl90 eXBlIGZpcnN0CiAgICBteSAkdHlwZSA9IGV2YWwgeyRjbGFzcy0+Y29sdW1u X3R5cGUoJGZpZWxkKTt9OwoJdW5sZXNzICgkdHlwZSkgewogICAgCSMgUmln aHQsIGhhdmUgc29tZSBvZiB0aGlzIQogICAgCWV2YWwgInBhY2thZ2UgJGNs YXNzOyBDbGFzczo6REJJOjpQbHVnaW46OlR5cGUtPmltcG9ydCgpIjsgIyBn aXZlcyBlcnIKCQkjIG5vIGNvbHVtbl90eXBlIG1laHRvZCBpbiBDbGFzczo6 RGJJOjpDb2x1bW4KICAgIAkkdHlwZSA9ICRjbGFzcy0+Y29sdW1uX3R5cGUo JGZpZWxkKTsKCX0KCSR0eXBlOwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFByZWxvYWRlZCBt ZXRob2RzIGdvIGhlcmUuCgoxOwoKPWhlYWQxIENIQU5HRVMKClZlcnNpb24g MS54IG9mIHRoaXMgbW9kdWxlIHJldHVybmVkIHJhdyBIVE1MIGluc3RlYWQg b2YgQzxIVE1MOjpFbGVtZW50PgpvYmplY3RzLCB3aGljaCBtYWRlIGl0IGhh cmRlciB0byBtYW5pcHVsYXRlIHRoZSBIVE1MIGJlZm9yZSBzZW5kaW5nIGl0 Cm91dC4gSWYgeW91IGRlcGVuZCBvbiB0aGUgb2xkIGJlaGF2aW91ciwgc2V0 IEM8JENsYXNzOjpEQkk6OkFzRm9ybTo6T0xEX1NUWUxFPgp0byBhIHRydWUg dmFsdWUuCgoqKioqKiBOZXcgKioqKiogQ2hhbmdlcyAgCgoxLiAJdG9fZmll bGQgbm93IHRyeXMgdG8gdXNlIG1vZGVsIGNsYXNzZXMgY29sdW1uX3R5cGUg c3ViIGFuZCBpZiBpdCByZXN1bHRzIGluIAoJdW5kZWYsIHRoZW4gdXNlcyBD bGFzczo6REJJOjpQbHVnaW46OlR5cGUJCgoyLiAgdG9fc2VsZWN0IGNyZWF0 ZXMgbm8gb2JqZWN0cyB0byBiZSBlZmZpY2llbnQuIFlvdSBjYW4gc3BlY2lm eSBjb2x1bW5zIHJldHJpZXZlZCBmb3Igc2VsZWN0IGJveCB3aXRoIEM8X19Q QUNLQUdFX18tPmNvbHVtbnMoJ1NlbGVjdEJveCc9PiBxdy9ibGFoIGRhaCBk b28vKTsgVG8gc3RyaW5naWZ5IHRoZSBvcHRpb24sIGl0IHRyaWVzIEM8JGNs YXNzLT5zdHJpbmdpZnlfc2VsZWN0Ym94PiBhbmQganVzdCBqb2lucyBjb2x1 bW5zIG9uICcgJyBpZiB0aGF0IGZhaWxzLgoKMy4gT25lIGNhbiBub3cgbGlt aXQgcm93cyBzZWxlY3RlZCBmb3IgaGFzX2Egc2VsZWN0IGJveGVzIHdpdGgg YSBoYXNfYV9zZWxlY3RfbGltaXQgc3ViIGluIHlvdXIgbW9kZWwgY2xhc3Mu Cgo0LiBfdG9fZm9yZWlnbl9pbnB1dHMgLS0gWW91IGNhbiBnZXQgaW5wdXRz IGZvciBoYXNfYSBjb2xzIHJhdGhlciB0aGFuIHNlbGVjdCBib3guIFNwZWNp Znkgd2hpY2ggaGFzX2EgY29sdW1ucyB0byBkbyB0aGlzIGZvciBpbiBhICBo YXNfYV9uZXcgc3ViLgoKNS4gX3RvX2VudW1fc2VsZWN0IC0tIHNlbGVjdCBi b3ggZm9yIGVudW0gY29sdW1ucwoKNi4gX3RvX2Jvb2xfc2VsZWN0IC0tIHNl bGVjdCBib3ggZm9yIGJvb2wgY29sdW1ucy4gT3B0aW9ucyB1c2VyIHNlZXMg Y2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgJHR5cGUgc3RyaW5nIHJldHVybmVk IGZyb20gY29sdW1uX3R5cGUuIEV4YW1wbGVzOiAKCQoJQk9PTCgnTm8nLCdZ ZXMnKSAKCUJPT0woJ09mZicsICdPbicpCgpJIG1heSBoYXZlIGxlZnQgc29t ZXRoaW5nIG91dC4gCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgoKPWhlYWQxIEFVVEhPUgoKU2ltb24gQ296ZW5zLCBD PHNpbW9uQGNwYW4ub3JnPgoKPWhlYWQxIFNFRSBBTFNPCgpMPENsYXNzOjpE Qkk+LCBMPENsYXNzOjpEQkk6OkZyb21DR0k+LCBMPEhUTUw6OkVsZW1lbnQ+ LgoKPWN1dAo= --0-1316208330-1102668006=:36276--
AsFormImproved
|
Generated at 10:54 on 11 Dec 2004 by mariachi v0.52