https://stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion has a javascript version, which is easily convertible to vanilla c:

```
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
typedef struct _RGB { unsigned char r; unsigned char g; unsigned char b; } RGB;
float huetoColor(float p, float q, float t) {
if( t < 0 ) ++t;
if( t > 1 ) --t;
if( 1.0f/6.0f > t ) return p + (q - p) * 6 * t;
if( 0.5f > t ) return q;
if( 2.0f / 3.0f > t ) return p + (q - p) * (2.0f/3.0f - t) * 6;
return p;
}
RGB HSLtoRGB(int hdeg, float s, float l) {
float h = abs(hdeg) % 360 / 360.0f;
float r = 0.f, g = 0.f, b = 0.f;
struct _RGB rgb;
if( 0 == s ) {
r = g = b = l;
} else {
float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
r = huetoColor(p, q, h + 1.0f/3.0f);
g = huetoColor(p, q, h);
b = huetoColor(p, q, h - 1.0f/3.0f);
}
rgb.r = round(r * 0xff); rgb.g = round(g * 0xff); rgb.b = round(b * 0xff);
return rgb;
}
```

which you can call as:

```
int main(int argc, char * argv[]) {
RGB rgb = HSLtoRGB(279, 1.00f, 0.22f);
printf("r = %3i g = %3i b = %3i\n", rgb.r, rgb.g, rgb.b);
printf("%.2x%.2x%.2x\n", rgb.r, rgb.g, rgb.b);
return 0;
}
```

HSLtoRGB takes a signed integral degree and expects floating point s and l values between 0 and 1.0.

Which I compiled as:

```
clang hsltorgb.c -lm -o hsltorgb.c
```

with output:

```
r = 73 g = 0 b = 112
490070
```