DEV Community

Yuki Kimoto
Yuki Kimoto

Posted on

How to use zlib (a C library) from Perl with SPVM

How to use zlib (a C library) from Perl with SPVM.

See an example to bind zlib to SPVM

SPVM provides a way to bind C language libraries and call them from Perl.

When binding C libraries to Perl, you typically write XS, but SPVM offers an alternative approach.

MyZlib.spvm

class MyZlib {
  native static method test : void ($ouf_file : string);
}
Enter fullscreen mode Exit fullscreen mode

MyZlib.c

#include "spvm_native.h"
#include<stdio.h>

#include "zlib.h"

static const char* FILE_NAME = "MyZlib.c";

int32_t SPVM__MyZlib__test(SPVM_ENV* env, SPVM_VALUE* stack) {

  void* obj_out_file = stack[0].oval;

  if (!obj_out_file){
    return env->die(env, stack, "$ouf_file must be defined.", __func__, FILE_NAME, __LINE__);
  }

  const char* out_file = env->get_chars(env, stack, obj_out_file);

  char buf[]="0123456789abcdefghijklmnopqrstuvwxyz\n";
  int cnt = 0;
  gzFile zp;

  zp = gzopen(out_file, "w9");
  if(zp == NULL){
    return env->die(env, stack, "gzopen failed.", "MyZlib.c", __func__, FILE_NAME, __LINE__);
  }

  for(cnt = 0; cnt < 100; cnt++){
    gzputs(zp, buf);
  }

  gzclose(zp);

  return 0;
}

Enter fullscreen mode Exit fullscreen mode

MyZlib.config

use strict;
use warnings;

use SPVM::Builder::Config;

my $config = SPVM::Builder::Config->new_gnu99(file => __FILE__);

$config->add_lib('z');

$config;
Enter fullscreen mode Exit fullscreen mode

zlib.pl

use strict;
use warnings;

use FindBin;
use lib "$FindBin::Bin/lib";

use SPVM 'MyZlib';

my $out_file = "$ENV{HOME}/tmp/output.gz";

SPVM::MyZlib->test($out_file);
Enter fullscreen mode Exit fullscreen mode

A compressed file "output.gz" will be output.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay