- int sockfd, n;
- struct hostent *server;
- struct sockaddr_in serv_addr;
- char buffer[256];
- char *line;
- char *history_path;
-
- // Connect to the server
- sockfd = socket (AF_INET, SOCK_STREAM, 0);
- server = gethostbyname (hostname);
- bzero ((char *) &serv_addr, sizeof (serv_addr));
- serv_addr.sin_family = AF_INET;
- bcopy ((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
- serv_addr.sin_port = htons (port);
- if (connect (sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) == -1) {
- printf ("%s [%d.%d.%d.%d] %d: Connection refused\n", hostname, server->h_addr[0], server->h_addr[1], server->h_addr[2], server->h_addr[3], port);
- return;
+ int i;
+ int opened = 0;
+ char c = 0;
+
+ // Choose the corresponding opening bracket
+ if (k == ')') c = '(';
+ else if (k == ']') c = '[';
+ else if (k == '}') c = '{';
+
+ for (i = 0; i < strlen (line); i++) {
+ // Is the current character part of a character literal?
+ if (i + 2 >= strlen (line)
+ && line[i] == '#'
+ && line[i + 1] == '\\')
+ i = i + 2;
+ else if (line[i] == '"') {
+ // Skip over a string literal
+ for (i++; i < strlen (line); i++)
+ if (line[i] == '"'
+ && line[i - 1] != '\\')
+ break;
+ }
+ else if (line[i] == ';') {
+ // Comment until endline
+ break;
+ }
+ else if (line[i] == c)
+ opened++;
+ else if (line[i] == k)
+ opened--;