@@ -29,10 +29,12 @@ const string_mod = @import("string.zig");
2929const io_mod = @import ("io.zig" );
3030const json_mod = @import ("json.zig" );
3131const template_mod = @import ("template.zig" );
32+ const regexp_mod = @import ("regexp.zig" );
3233const host_abi_mod = @import ("host_abi.zig" );
3334
3435const TemplateTypeQualifiedName = "@std.template.obj" ;
3536const TimeTypeQualifiedName = "@std.time.obj" ;
37+ const RegexpTypeQualifiedName = "@std.regexp.obj" ;
3638
3739const NativeFnId = enum (u8 ) {
3840 io_println = 1 ,
@@ -160,6 +162,17 @@ const NativeFnId = enum(u8) {
160162 time_since = 123 ,
161163 time_until = 124 ,
162164 time_add_date = 125 ,
165+ re_match = 126 ,
166+ re_find = 127 ,
167+ re_find_all = 128 ,
168+ re_replace = 129 ,
169+ re_split = 130 ,
170+ re_compile = 131 ,
171+ re_obj_match = 132 ,
172+ re_obj_find = 133 ,
173+ re_obj_find_all = 134 ,
174+ re_obj_replace = 135 ,
175+ re_obj_split = 136 ,
163176};
164177const MaxNativeArgs = 255 ;
165178const NamespaceEntry = struct {
@@ -403,6 +416,23 @@ pub fn buildStdModule() !*Object {
403416 try vms .pushTempRoot (.{ .object = base64_obj });
404417 defer vms .popTempRoot ();
405418
419+ const regexp_type_obj = try regexp_mod .reGetType ();
420+ try vms .pushTempRoot (.{ .object = regexp_type_obj });
421+ defer vms .popTempRoot ();
422+
423+ const regexp_entries = [_ ]NamespaceEntry {
424+ .{ .name = "match" , .value = try makeNative (.re_match , 2 ) },
425+ .{ .name = "find" , .value = try makeNative (.re_find , 2 ) },
426+ .{ .name = "find_all" , .value = try makeNative (.re_find_all , 2 ) },
427+ .{ .name = "replace" , .value = try makeNative (.re_replace , 3 ) },
428+ .{ .name = "split" , .value = try makeNative (.re_split , 2 ) },
429+ .{ .name = "compile" , .value = try makeNative (.re_compile , 1 ) },
430+ .{ .name = "__type" , .value = .{ .object = regexp_type_obj } },
431+ };
432+ const regexp_obj = try makeNamespace ("regexp" , "@module_type:std.regexp" , & regexp_entries );
433+ try vms .pushTempRoot (.{ .object = regexp_obj });
434+ defer vms .popTempRoot ();
435+
406436 const std_entries = [_ ]NamespaceEntry {
407437 .{ .name = "io" , .value = .{ .object = io_obj } },
408438 .{ .name = "core" , .value = .{ .object = core_obj } },
@@ -415,7 +445,9 @@ pub fn buildStdModule() !*Object {
415445 .{ .name = "time" , .value = .{ .object = time_obj } },
416446 .{ .name = "hex" , .value = .{ .object = hex_obj } },
417447 .{ .name = "base64" , .value = .{ .object = base64_obj } },
448+ .{ .name = "regexp" , .value = .{ .object = regexp_obj } },
418449 .{ .name = "Time" , .value = .{ .object = time_type_obj } },
450+ .{ .name = "Regexp" , .value = .{ .object = regexp_type_obj } },
419451 };
420452 const std_obj = try makeNamespace ("std" , "@module_type:std" , & std_entries );
421453 vms .vmState ().std_module = std_obj ;
@@ -471,6 +503,26 @@ pub fn installStdGlobal() !void {
471503 }
472504 }
473505 }
506+ {
507+ const regexp_methods = [_ ]struct { name : []const u8 , id : NativeFnId , arity : u8 }{
508+ .{ .name = "match" , .id = .re_obj_match , .arity = 2 },
509+ .{ .name = "find" , .id = .re_obj_find , .arity = 2 },
510+ .{ .name = "find_all" , .id = .re_obj_find_all , .arity = 2 },
511+ .{ .name = "replace" , .id = .re_obj_replace , .arity = 3 },
512+ .{ .name = "split" , .id = .re_obj_split , .arity = 2 },
513+ };
514+ for (regexp_methods ) | m | {
515+ const needed = RegexpTypeQualifiedName .len + 1 + m .name .len ;
516+ const kbuf = (heap .bump (u8 , needed ) orelse return )[0.. needed ];
517+ @memcpy (kbuf [0.. RegexpTypeQualifiedName .len ], RegexpTypeQualifiedName );
518+ kbuf [RegexpTypeQualifiedName .len ] = '.' ;
519+ @memcpy (kbuf [RegexpTypeQualifiedName .len + 1 .. needed ], m .name );
520+ if (! globals .has (kbuf )) {
521+ const n = try makeNative (m .id , m .arity );
522+ try globals .def (kbuf , n );
523+ }
524+ }
525+ }
474526}
475527
476528pub fn callNative (nf : NativeFuncObj , argc : u8 ) ! void {
@@ -1556,5 +1608,109 @@ pub fn callNative(nf: NativeFuncObj, argc: u8) !void {
15561608 _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
15571609 try vms .vmPush (out );
15581610 },
1611+ .re_match = > {
1612+ if (argc != nf .arity ) return error .ArityMismatch ;
1613+ const top = vms .vmState ().stack_top ;
1614+ const pattern_val = vms .vmState ().stack [top - 2 ];
1615+ const s_val = vms .vmState ().stack [top - 1 ];
1616+ const result = try regexp_mod .nativeReMatch (pattern_val , s_val );
1617+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1618+ try vms .vmPush (result );
1619+ },
1620+ .re_find = > {
1621+ if (argc != nf .arity ) return error .ArityMismatch ;
1622+ const top = vms .vmState ().stack_top ;
1623+ const pattern_val = vms .vmState ().stack [top - 2 ];
1624+ const s_val = vms .vmState ().stack [top - 1 ];
1625+ const result = try regexp_mod .nativeReFind (pattern_val , s_val );
1626+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1627+ try vms .vmPush (result );
1628+ },
1629+ .re_find_all = > {
1630+ if (argc != nf .arity ) return error .ArityMismatch ;
1631+ const top = vms .vmState ().stack_top ;
1632+ const pattern_val = vms .vmState ().stack [top - 2 ];
1633+ const s_val = vms .vmState ().stack [top - 1 ];
1634+ const result = try regexp_mod .nativeReFindAll (pattern_val , s_val );
1635+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1636+ try vms .vmPush (result );
1637+ },
1638+ .re_replace = > {
1639+ if (argc != nf .arity ) return error .ArityMismatch ;
1640+ const top = vms .vmState ().stack_top ;
1641+ const pattern_val = vms .vmState ().stack [top - 3 ];
1642+ const s_val = vms .vmState ().stack [top - 2 ];
1643+ const repl_val = vms .vmState ().stack [top - 1 ];
1644+ const result = try regexp_mod .nativeReReplace (pattern_val , s_val , repl_val );
1645+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1646+ try vms .vmPush (result );
1647+ },
1648+ .re_split = > {
1649+ if (argc != nf .arity ) return error .ArityMismatch ;
1650+ const top = vms .vmState ().stack_top ;
1651+ const pattern_val = vms .vmState ().stack [top - 2 ];
1652+ const s_val = vms .vmState ().stack [top - 1 ];
1653+ const result = try regexp_mod .nativeReSplit (pattern_val , s_val );
1654+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1655+ try vms .vmPush (result );
1656+ },
1657+ .re_compile = > {
1658+ if (argc != nf .arity ) return error .ArityMismatch ;
1659+ const pattern_val = vms .vmState ().stack [vms .vmState ().stack_top - 1 ];
1660+ const result = try regexp_mod .nativeReCompile (pattern_val );
1661+ _ = try vms .vmPop (); _ = try vms .vmPop ();
1662+ try vms .vmPush (result );
1663+ },
1664+ .re_obj_match = > {
1665+ if (argc != nf .arity ) return error .ArityMismatch ;
1666+ const top = vms .vmState ().stack_top ;
1667+ const recv = vms .vmState ().stack [top - 2 ];
1668+ const s_val = vms .vmState ().stack [top - 1 ];
1669+ const pattern = try regexp_mod .reGetPattern (recv );
1670+ const result = try regexp_mod .nativeReMatch (.{ .string = pattern }, s_val );
1671+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1672+ try vms .vmPush (result );
1673+ },
1674+ .re_obj_find = > {
1675+ if (argc != nf .arity ) return error .ArityMismatch ;
1676+ const top = vms .vmState ().stack_top ;
1677+ const recv = vms .vmState ().stack [top - 2 ];
1678+ const s_val = vms .vmState ().stack [top - 1 ];
1679+ const pattern = try regexp_mod .reGetPattern (recv );
1680+ const result = try regexp_mod .nativeReFind (.{ .string = pattern }, s_val );
1681+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1682+ try vms .vmPush (result );
1683+ },
1684+ .re_obj_find_all = > {
1685+ if (argc != nf .arity ) return error .ArityMismatch ;
1686+ const top = vms .vmState ().stack_top ;
1687+ const recv = vms .vmState ().stack [top - 2 ];
1688+ const s_val = vms .vmState ().stack [top - 1 ];
1689+ const pattern = try regexp_mod .reGetPattern (recv );
1690+ const result = try regexp_mod .nativeReFindAll (.{ .string = pattern }, s_val );
1691+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1692+ try vms .vmPush (result );
1693+ },
1694+ .re_obj_replace = > {
1695+ if (argc != nf .arity ) return error .ArityMismatch ;
1696+ const top = vms .vmState ().stack_top ;
1697+ const recv = vms .vmState ().stack [top - 3 ];
1698+ const s_val = vms .vmState ().stack [top - 2 ];
1699+ const repl_val = vms .vmState ().stack [top - 1 ];
1700+ const pattern = try regexp_mod .reGetPattern (recv );
1701+ const result = try regexp_mod .nativeReReplace (.{ .string = pattern }, s_val , repl_val );
1702+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1703+ try vms .vmPush (result );
1704+ },
1705+ .re_obj_split = > {
1706+ if (argc != nf .arity ) return error .ArityMismatch ;
1707+ const top = vms .vmState ().stack_top ;
1708+ const recv = vms .vmState ().stack [top - 2 ];
1709+ const s_val = vms .vmState ().stack [top - 1 ];
1710+ const pattern = try regexp_mod .reGetPattern (recv );
1711+ const result = try regexp_mod .nativeReSplit (.{ .string = pattern }, s_val );
1712+ _ = try vms .vmPop (); _ = try vms .vmPop (); _ = try vms .vmPop ();
1713+ try vms .vmPush (result );
1714+ },
15591715 }
15601716}
0 commit comments