Skip to content

Instantly share code, notes, and snippets.

@dduan
dduan / withCStrings.swift
Last active August 27, 2018 20:19
A function that turns a Swift 3 [String] to an array of C strings (char *[]).
func withCStrings(_ strings: [String], scoped: ([UnsafeMutablePointer<CChar>?]) throws -> Void) rethrows {
let cStrings = strings.map { strdup($0) }
try scoped(cStrings + [nil])
cStrings.forEach { free($0) }
}
@dduan
dduan / SExpression.swift
Created July 28, 2018 21:00
A Generic S-Expression Parser
indirect enum SExpression {
struct Token {
var index: Int
var content: String
}
enum Atom {
case string(Token)
case symbol(Token)
}
@dduan
dduan / NSAttributedString+SimpleHTMLTag.swift
Created December 7, 2014 05:59
Convert Simple Text With HTML Tags to NSAttributedString
extension NSAttributedString {
func replaceHTMLTag(tag: String, withAttributes attributes: [String: AnyObject]) -> NSAttributedString {
let openTag = "<\(tag)>"
let closeTag = "</\(tag)>"
let resultingText: NSMutableAttributedString = self.mutableCopy() as NSMutableAttributedString
while true {
let plainString = resultingText.string as NSString
let openTagRange = plainString.rangeOfString(openTag)
if openTagRange.length == 0 {
@dduan
dduan / simple-made-easy.sh
Last active March 22, 2018 19:19
Downloading "Simple Made Easy" slides.
#!/bin/sh
mkdir simple-made-easy
cd simple-made-easy
for i in `seq 1 39`
do
wget "https://res.infoq.com/presentations/Simple-Made-Easy/en/slides/sl$i.jpg"
done
for i in `seq 1 9`
do mv sl$i.jpg sl0$i.jpg
done
@dduan
dduan / JSON.swift
Last active February 8, 2018 08:52
A hand-made recursive descend JSON parser for fun.
enum State {
enum String {
case normal
case escape
case unicode(Int)
}
}
final class Context {
let contents: [UnicodeScalar]
@dduan
dduan / quiet.sh
Last active January 7, 2018 06:34
Run any command and suppress its output to stdin and stderr, unless it returns an error code.
#!/usr/bin/env bash
# Run any command and suppress its output to stdin and stderr, unless it returns an error code.
OUTPUT=$(${@:1} 2>&1)
if [ $? -eq 0 ]; then
exit
fi
OLDLFS=$LFS
@dduan
dduan / ADT.swift
Created December 18, 2017 19:27
Representing Algebraic Data Type?
struct Decl {
struct Option {
enum Segment {
case one(String, [String])
indirect case map(Segment, Segment)
}
typealias Field = (name: String?, type: Segment)
let name: String
let fields: [Field]
}
@dduan
dduan / gist:2ecc257ab908aff24530
Created July 7, 2014 02:34
Guessing MIME type from a file name in Objective-C on iOS
- (NSString *)guessMIMETypeFromFileName: (NSString *)fileName {
// Borrowed from http://stackoverflow.com/questions/2439020/wheres-the-iphone-mime-type-database
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fileName pathExtension], NULL);
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
CFRelease(UTI);
if (!MIMEType) {
return @"application/octet-stream";
}
return (__bridge NSString *)(MIMEType);
}
@dduan
dduan / bug.swift
Created October 29, 2017 05:21
Enum setter error reporting seems too simplistic?
enum E {
final class P { var v = 0 }
case a(P)
var p: P {
switch self {
case .a(let p): return p
}
}
@dduan
dduan / gist:2708979
Created May 16, 2012 09:15
Convert web pages to PDF using Python + QtWebkit
# Authored by sundance@ierne.eu.org as found in the following link:
# http://www.mail-archive.com/pyqt@riverbankcomputing.com/msg18928.html
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtCore import QObject
from PyQt4.QtCore import QUrl
from PyQt4.QtCore import QSizeF